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







Thursday, January 2, 2020

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.

For Ex:


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
....








Tuesday, December 31, 2019

IPSec VPN (Strongswan)


1. Các khái niệm
1.1 VPN

1.2 IPSec
- Mã hóa
- Xác thực

- Giao thức (ESP, AH)
- Chế độ (Transport, Tunnel)

- Nguyên lý hoạt động

2. Xây dựng thiết bị chạy IPSec VPN









Saturday, October 17, 2015

CORBAR




Như đã giới thiệu có hai cách để làm ứng dụng client-server đó là XML-RPCSOAP, 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  
   


































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  



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

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -