Showing posts with label Networking. Show all posts
Sử dụng Raspberry Pi làm firewall
Trong bài viết này giới thiệu 2 opensource firewall được dùng phổ biến đã hỗ trợ raspberry pi.
Note: Raspberry chỉ có 1 cổng ethernet nên cần phải gắn thêm usb - ethernet adapter
1. OpenWrt
OpenWrt là một hệ điều hành được sử dụng cho rất nhiều thiết bị router, và nó cũng hỗ trợ cho raspberry pi.
Giới thiệu về OpenWrt xem wikipedia:
https://vi.wikipedia.org/wiki/OpenWrt
Hướng dẫn download image và cài đặt:
https://openwrt.org/toh/raspberry_pi_foundation/raspberry_pi
Sau khi khởi động raspberry pi, chỉ có cổng build-in ethernet của pi là được sử dụng và nó được set địa chỉ ip default là 192.168.1.1, kết nối cổng này trược tiếp vào pc (nhớ set ip cho pc là 192.168.1.X) để cấu hình openwrt trên pi bằng giao diện web theo hướng dẫn dưới đây:
Truy cập bằng trình duyệt vào địa chỉ http://192.168.1.1 , login với username:root và password để trống
https://openwrt.org/docs/guide-quick-start/walkthrough_login
Việc tiếp theo cần làm sau khi login vào web thì đi đến phần quản lý software, tìm kiếm và install driver phù hợp cho usb-ethernet adapter, có thể tham khảo bài viết sau:
https://computers.tutsplus.com/articles/installing-openwrt-on-a-raspberry-pi-as-a-new-home-firewall--mac-55984
2. IPFire
IPFire là một firewall opensource mạnh mẽ, nó cũng hỗ trợ tốt cho raspbery pi.
Hướng dẫn download image và cài đặt:
https://wiki.ipfire.org/hardware/arm
IPFire có thể hỗ trợ lên đến 4 interface, được đặt tên theo màu sắc.
Như vậy có nghĩa là RED sẽ được nối đến ADSL modem, còn GREEN sẽ nối vào phía private home network.
Việc cấu hình firewall được cấu hình thông qua web gui (dùng cổng GREEN).
Link tham khảo thêm:
https://wiki.ipfire.org/installation
Note: Raspberry chỉ có 1 cổng ethernet nên cần phải gắn thêm usb - ethernet adapter
1. OpenWrt
OpenWrt là một hệ điều hành được sử dụng cho rất nhiều thiết bị router, và nó cũng hỗ trợ cho raspberry pi.
Giới thiệu về OpenWrt xem wikipedia:
https://vi.wikipedia.org/wiki/OpenWrt
Hướng dẫn download image và cài đặt:
https://openwrt.org/toh/raspberry_pi_foundation/raspberry_pi
Sau khi khởi động raspberry pi, chỉ có cổng build-in ethernet của pi là được sử dụng và nó được set địa chỉ ip default là 192.168.1.1, kết nối cổng này trược tiếp vào pc (nhớ set ip cho pc là 192.168.1.X) để cấu hình openwrt trên pi bằng giao diện web theo hướng dẫn dưới đây:
Truy cập bằng trình duyệt vào địa chỉ http://192.168.1.1 , login với username:root và password để trống
https://openwrt.org/docs/guide-quick-start/walkthrough_login
Việc tiếp theo cần làm sau khi login vào web thì đi đến phần quản lý software, tìm kiếm và install driver phù hợp cho usb-ethernet adapter, có thể tham khảo bài viết sau:
https://computers.tutsplus.com/articles/installing-openwrt-on-a-raspberry-pi-as-a-new-home-firewall--mac-55984
2. IPFire
IPFire là một firewall opensource mạnh mẽ, nó cũng hỗ trợ tốt cho raspbery pi.
Hướng dẫn download image và cài đặt:
https://wiki.ipfire.org/hardware/arm
IPFire có thể hỗ trợ lên đến 4 interface, được đặt tên theo màu sắc.
Như vậy có nghĩa là RED sẽ được nối đến ADSL modem, còn GREEN sẽ nối vào phía private home network.
Việc cấu hình firewall được cấu hình thông qua web gui (dùng cổng GREEN).
Link tham khảo thêm:
https://wiki.ipfire.org/installation
Sử dụng Raspberry Pi làm VPN server
Bìa viết này sử dụng PiVPN để cài đặt OpenVpn server lên Raspberry Pi
1. Cài đặt OpenVPN server bằng phần mềm PiVPN
Băt đầu với command dưới đây
$curl -L https://install.pivpn.io | bash
Từ đây một giao diện cài đặt sẽ hiện lên, bấm ENTER để chọn.
Cài đặt static IP cho pi.
Nếu muốn thay đổi thì chọn NO.
Giao thức mặc định sẽ là UDP, nhưng trong hướng bài viết này sử dụng TCP
(UDP sẽ hoạt động nhanh hơn TCP, tuy nhiên TCP thì bào mật hơn).
Vì phía trên đã chọn TCP nên default port sẽ là 443(https), nếu phía trên chon UDP thì ở đây sẽ là port 1194.
Ở bước này nên chọn DNS bởi vì public IP sẽ thường sẽ bị thay đổi nếu router nhà bạn bị restart.
Điền địa chỉ DNS vào đây, có thể đăng ký địa chỉ DNS free tại trang https://www.noip.com
Note: Tác dụng của DNS là trong trường hợp router có restart thì địa chỉ public ip sẽ được tự động update vào DNS nên chúng ta không cần lo lắng về việc public ip có bị thay đổi hay không.
Tuy nhiên cần để có thể tự động update được pulic ip thì cần cấu hình trong mục Dynamic DNS trong router như ví dụ dưới đây:
Kết quả là public ip sẽ được update lên no-ip server.
DNS provider chọn của Google.
Hướng dẫn sử dụng.
Quá trình cài đặt hoàn thành thì reboot.
2. Cấu hình Port Forwarding trên router
Sau khi cài đặt xong PiVPN thì bước tiếp theo cần làm là phải mở port trên router nhà bạn
Khi cài đặt PiVPN ở trên đã chọn port 443(https) nên bây giờ cần mở port 443 trên router.
3. Tạo ovpn profiles
Ovpn profile được tạo ra tại OpenVPN server và được dùng tại phía client để khởi tạo kết nối VPN.
Dùng lệnh "pivpn add" để tạo ovpn profile.
Note:Nếu không muốn settup mật khẩu thì có thể dùng lệnh "pivpn add nopass".
Sau khi tạo xong ovpn profile sẽ được để ở thư mục:
/home/pi/ovpns
Copy ovpn file này sang máy client để chuẩn bị tạo kết nối vpn.
Note: có thể sftp hoặc scp để copy file ovpn ra máy client.
Ex:
pi@raspberry:~$scp -r /home/pi/ovpns clientusername@XXX.XXX.XXX.XXX:/home/Download
4. Khởi tạo kết nối vpn
Cài đặt phần mềm Openvpn connect vào máy client. Phần mềm này có đầy đủ phiên bản cho các hệ điều hành window, android, ios ...
Ex' https://openvpn.net/client-connect-vpn-for-windows/
Sau khi cài đặt xong thì import file ovpn đã tạo ra ở bước trên vào và tiến hành connect.
- Windows
Nếu có msg như dưới đây là ok:
- Linux
Dùng lệnh
#openvpn ovpnprofilename.ovpn
Nếu dùng máy ubuntu thì có thể install thêm plugin:
$sudo apt-get install network-manager-openvpn-gnome
Sau đó import file ovpn vào là xong
- Mobile
Có thể import ovpn profile bằng cách attachment file từ email.
Note:
-Default network interface is "tun"
-Default private IP of vpn network is 10.8.0.X
- pivpn help
Xem file config:
$sudo cat /etc/openvpn/easy-rsa/pki/Default.txt
client
dev tun
proto tcp
remote mydns.ddns.net 443
...
$cat /etc/openvpn/server.conf
dev tun
proto tcp
port 443
server 10.8.0.0 255.255.255.0
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
cipher AES-256-CBC
auth SHA256
user nobody
group nogroup
....
CORBAR
Như đã giới thiệu có hai cách để làm ứng dụng client-server đó là XML-RPC và SOAP, chúng đều dựa vào cơ chế RPC và đóng gói/phân tích XML.
Trong bài viết này giới thiệu một phương pháp hoàn toàn khác biệt gọi là CORBAR.
Dưới đây là bảng so sánh giữa Web Services (XML-RPC, SOAP) với CORBAR:
Xem chi tiết tại đây.
Để build một hệ thống client-server chúng ta sử dụng thư viện omniORB.
1. Build omniORB
Thư viện phụ thuộc:
- openssl
Build omniORB-4.2.0 for host:
yum install openssl-devel
yum install python-devel
./configure --prefix=/path/to/install
make
make install
Build omniORB-4.2.0 for board:
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
export CROSS=arm-none-linux-gnueabi-
export HOST=arm-none-linux-gnueabi
DEPEND_LIB_DIR=/path/to/dependent/install
export CFLAGS=-I${DEPEND_LIB_DIR}/include
export CPPFLAGS=-I${DEPEND_LIB_DIR}/include
export LDFLAGS=-L${DEPEND_LIB_DIR}/lib
export PKG_CONFIG_PATH=${DEPEND_LIB_DIR}/lib/pkgconfig
export LD_LIBRARY_PATH=${DEPEND_LIB_DIR}/lib
export PATH=$PATH:${DEPEND_LIB_DIR}/bin:${DEPEND_LIB_DIR}/sbin
./configure --prefix=$PREFIX --host=${HOST} --build=x86_64-linux-gnu \
CC=${CROSS}gcc \
CXX=${CROSS}g++
"build cccp, cxx, omkdepend for host"
make CC=gcc -C src/tool/omniidl/cxx/cccp
make CXX=g++ -C src/tool/omniidl/cxx
make CC=gcc -C src/tool/omkdepend
"There are some small changes required in the omniORB build system:
Edit dir.mk file in following directories:"
src/appl/omniMapper/dir.mk
src/appl/omniNames/dir.mk
src/appl/utils/catior/dir.mk
src/appl/utils/convertior/dir.mk
src/appl/utils/genior/dir.mk
src/appl/utils/nameclt/dir.mk
@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))
==> @(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))
"cross"
make
make install
Tag :
Networking
gSOAP
Tương tự như XML-RPC thì SOAP cũng là một giao thức dùng để làm ứng dụng web service để server phục vụ yêu cầu của client, trong đó client gọi một function đến server để server thực hiện function đó và trả về kết quả.
Nếu so sánh thì XML-RPC thực sự đơn giản, dễ dàng để thực hiện trong khi đó SOAP thì phức tạp và mạnh mẽ hơn nhiều.
Trong bài viết này chúng ta sẽ tiến hành build thư viện gSOAP, viết ứng dụng client-server demo cho giao thức SOAP. Hiện tại gSOAP là một thư viện được dùng phổ biến bởi rất nhiều hãng lớn trên thế giới, nó vẫn liên tục được cập nhật và phát triển.
1. Build gSOAP
- Download source gSOAP (version gSOAP-2.8)
- Thư viện phụ thuộc
+ openssl
- Build gSOAP
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
export CROSS=arm-none-linux-gnueabi-
export HOST=arm-none-linux-gnueabi
DEPEND_LIB_DIR=/path/to/dependent/install
export CFLAGS=-I${DEPEND_LIB_DIR}/include
export CPPFLAGS=-I${DEPEND_LIB_DIR}/include
export LDFLAGS=-L${DEPEND_LIB_DIR}/lib
export PKG_CONFIG_PATH=${DEPEND_LIB_DIR}/lib/pkgconfig
export LD_LIBRARY_PATH=${DEPEND_LIB_DIR}/lib
export PATH=$PATH:${DEPEND_LIB_DIR}/bin:${DEPEND_LIB_DIR}/sbin
"buid soapcpp2 for host first"
./configure
make CC=gcc CXX=g++ -C gsoap/src
export PREFIX=/path/to/gsoap/install
./configure --prefix=$PREFIX --host=${HOST} \
CC=${CROSS}gcc \
CXX=${CROSS}g++ \
--with-openssl=${DEPEND_LIB_DIR}
"Modify config.h which have just is generated
comment #define malloc rpl_malloc
Note: fixbug ::malloc has not been declared
"
make
make install
2. Giới thiệu gSOAP
Sau khi build xong gSoap chúng ta sẽ có hai chương trình chính trong thư mục bin:
2.1 soapcpp2 (stub/skeleton generator)
soapcpp2 -c <name of generated .h file e.g chatpp.h> cho chương trình C
soapcpp2 <name of generated .h file> hoặc
soapcpp2 -i <name of generated .h file e.g chatpp.h> cho chương trình C++
Chương trình tạo ra các file.c và file.cpp implement các function đã define trong file.h
Trong gsoap-2.8/gsoap/bin/win32 đã có sẵn hai chương trình này cho Windows OS.
2.2 wsdl2h (schema importer)
wsdl2h <path and name of .wsdl file> -o <name of generated .h file e.g chatpp.h>
file.wsdl là file mô tả về các function/kết nối mà một web service nào đó đang chạy. Chương trình wsdl2h sẽ phân tích file.wsdl này để tạo ra file.h từ đó sẽ dùng để viết một chương trình client cho web service đã có đó.
2.3 Nguyên lý hoạt động gSOAP
3. Ví dụ
Xét ví dụ soap-2.8/gsoap/samples/calc và soap-2.8/gsoap/samples/calc++
calc.h
File này định nghĩa các function và các cài đặt về gsoap ns.
//gsoap ns service name: calc Simple calculator service
//gsoap ns service protocol: SOAP
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service namespace: http://10.49.46.201:2012/calc.wsdl
//gsoap ns service location: http://10.49.46.201:2012
//gsoap ns schema namespace: urn:calc
Với http://10.49.46.201:2012 máy Server có địa chỉ IP: 10.49.46.201, serrvice chạy qua port 2012.
Build ứng dụng calc:
DEPEND_LIB_DIR=/path/to/gsoap-2.8-host/install
export CFLAGS="-I${DEPEND_LIB_DIR}/include -DWITH_OPENSSL"
export CPPFLAGS=-I${DEPEND_LIB_DIR}/include
export LDFLAGS=-L${DEPEND_LIB_DIR}/lib
export PKG_CONFIG_PATH=${DEPEND_LIB_DIR}/lib/pkgconfig
export LD_LIBRARY_PATH=${DEPEND_LIB_DIR}/lib
export PATH=$PATH:${DEPEND_LIB_DIR}/bin:${DEPEND_LIB_DIR}/sbin
export LIBS="-lm -lssl -lcrypto -lpthread"
Copy stdsoap2.c stdsoap2.h from gsoap-2.8/gsoap to samples/calc
Copy stdsoap2.cpp stdsoap2.h from gsoap-2.8/gsoap to samples/calc++
Compilation in C (see samples/calc):
soapcpp2 -c calc.h
cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c ${CFLAGS} ${LDFLAGS} ${LIBS}
cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c ${CFLAGS} ${LDFLAGS} ${LIBS}
Compilation in C++ (see samples/calc++):
soapcpp2 -i calc.h
cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp ${CFLAGS} ${LDFLAGS} ${LIBS}
cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp ${CFLAGS} ${LDFLAGS} ${LIBS}
Chạy chương trình
server
$ ./calcserver 2012
client
$ ./calcclient add 2 3
Tag :
Networking
Dynamic DNS
Một số khái niệm cơ bản về mạng cần biết trước khi đọc bài viết này:
- IP public, IP private
- DNS
- NAT
Trong thực tế mạng internet mà chúng ta dùng tại các hộ gia đình đều được các nhà cung cấp dịch vụ internet (ISP) cấp phát địa chỉ IP public động, nó sẽ được cấp phát lại mỗi khi modem nhà chúng ta bj reset lại, để có thể xem được địa chỉ IP public chúng ta vào một số trang web có khả năng xem IP ví dụ như https://www.whatismyip.com/ .
Dynamic DNS là một chương trình máy tính tự động cập nhật sự thay đổi IP public lên một Nameserver nào đó mà chúng ta setup trước. Một ví dụ đơn giản chúng ta có Nameserver với một domainname là mywebserver.no-ip.org được trỏ đến địa chỉ IP public 123.26.23.65, vì một lý do nào đó modem bị reset và ISP sẽ cấp lại cho chúng ta địa chỉ mới là 123.26.66.36, chương trình Dynamic DNS chạy trên của chúng ta sẽ phát hiện ra sự thay đổi này và sẽ tự động cập nhật lại địa chỉ IP mới lên nameserver, do đó mywebserver.no-ip.org bây giờ sẽ trỏ đến địa chỉ mới là 123.26.66.36.
Dynamic DNS thường được dùng khi chúng ta cài đặt một server nào đó trong một kết nối mà IP public thường bị thay đổi. Chương trình Dynamic DNS được cài trên các máy tính trong mạng local ví dụ nhử PC1 hoặc PC2 như trong hình ví dụ trên.
Trong bài viết này sẽ hướng dẫn build một chương trình dynamic dns để cập nhật IP lên nameserver của noip.com, một trang cung cấp dịch vụ dynamic dns miễn phí. Mục đích của việc này là cập nhật địa chỉ IP của một web server mà bạn đã build trước đó như hình trên.
Các bước thực hiện:
- Build web server với địa chỉ local 192.168.1.2
- Login vào router/modem nhà bạn và tiến hành NAT dịch vụ web đến địa chỉ IP 192.168.1.2 và port 80 (port mặc định của dịch vụ web)
Note: Nếu chỉ để test chương trình Dynamic DNS thì bạn không cần thực hiện 2 bước trên, chỉ cần build chương trình Dynamic DNS trên một máy bất kì ví dụ máy PC2 như trên hình.
- Vào trang web https://www.noip.com đăng ký một tài khoản free
- Đăng nhập và tạo ra domainname (có thể tạo tối đa 3 domain)
- Vào mục Download client để tải chương trình Dynamic DNS Update Client for Linux
- Giải nén gói noip-duc-linux vừa tải về
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
export CROSS=arm-none-linux-gnueabi-
export HOST=arm-none-linux-gnueabi
make CC=${CROSS}gcc PREFIX=/path/to/install
- Tạo file cấu hình cho chương trình, các thông tin cần có bao gồm:
+ username: email đăng ký tài khoản noip.com <abc@gmail.com >
+ password: mật khẩu đăg nhập noip.com <123456>
+ domain name: tên miền bạn tạo ra ở bước trên <duyninh.ddns.net, testdns.ddns.net>
./noip2 -C -U 1 -u abc@gmail.com -p 123456
Auto configuration for Linux client of no-ip.com.
2 hosts are registered to this account.
Do you wish to have them all updated?[N] (y/N) N
Do you wish to have host [duyninh.ddns.net] updated?[N] (y/N) N
Do you wish to have host [testdns.ddns.net] updated?[N] (y/N) y
New configuration file '/path/to/install/etc/no-ip2.conf' created.
Nếu có nhiều domain bạn có thể tùy chọn update cho tất cả hoặc một domain riêng nào đó.
- Chạy chương trình
./noip2
- Bạn vào lại trang quản lý domain của noip.com để xem lại kết quả, có thể thử reset lại modem vài lần để kiểm tra sự thay đổi IP public và sự cập nhật lên server của noip.com
Tag :
Networking