Bài 6: Cài đặt net-to-net VPN với OpenSWAN
Trong bài này, 2 mạng nội bộ “ở xa” 192.168.3.0/24 và 192.168.4.0/24 cần được kết nối VPN với nhau qua môi trường Internet để các trạm trong 2 mạng này có thể trao đổi dữ liệu bảo mật với nhau, giống như hai mạng này đang kết nối trực tiếp. OpenVPN có thể sử dụng để thiết lập mô hình net-to-net VPN, tuy nhiên trong bài này ta sử dụng OpenSWAN để thiết lập VPN trên nền IPSec (OpenVPN không sử dụng IPSec). Các bước tiến hành như sau:
- Kiểm tra đảm bảo kết nối trước VPN.
- Cài đặt OpenSWAN, thiết lập cấu hình và kết nối VPN giữa 2 mạng nội bộ.
Thiết lập địa chỉ IP và default gateway trên các trạm C3, Cx:
[root@C3 ~]#
ifconfig -a
eth2 Link encap:Ethernet HWaddr 08:00:27:84:C3:02
inet addr:192.168.3.7 Bcast:192.168.3.255 Mask:255.255.255.0
inet6 addr: fec3::7/64 Scope:Site
inet6 addr: fe80::a00:27ff:fe84:c302/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6220956 errors:0 dropped:0 overruns:0 frame:0
TX packets:967921 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:9328377006 (8.6 GiB) TX bytes:402151217 (383.5 MiB)
[root@C3 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth2
0.0.0.0 192.168.3.2 0.0.0.0 UG 0 0 0 eth2
Thiết lập bảng routing trên các router R4, R5, R6:
[root@R4 ~]#
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3
203.162.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth4
205.192.25.0 203.162.5.1 255.255.255.0 UG 0 0 0 eth4
[root@R5 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
203.162.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3
205.192.25.0 0.0.0.0 255.255.255.0 U 0 0 0 eth4
[root@R6 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.4.0 0.0.0.0 255.255.255.0 U 1 0 0 eth4
203.162.5.0 205.192.25.1 255.255.255.0 UG 0 0 0 eth3
205.192.25.0 0.0.0.0 255.255.255.0 U 1 0 0 eth3
Thiết lập NAT trên R6 để kiểm tra kết nối giữa Cx đến R4:
[root@R6 ~]#
service iptables restart
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
[root@R6 ~]# iptables -F
[root@R6 ~]# iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j MASQUERADE
[root@R6 ~]# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.4.0/24 anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Kiểm tra kết nối giữa Cx và R4 bằng lệnh ping:
[root@Cx ~]# ping -c 3 203.162.5.11
PING 203.162.5.11 (203.162.5.11) 56(84) bytes of data.
64 bytes from 203.162.5.11: icmp_seq=1 ttl=62 time=1.89 ms
64 bytes from 203.162.5.11: icmp_seq=2 ttl=62 time=1.56 ms
64 bytes from 203.162.5.11: icmp_seq=3 ttl=62 time=1.70 ms
Hiển nhiên thấy rằng Cx chưa thể kết nối đến C3:
[root@Cx ~]# ping -c 3 192.168.3.7
PING 192.168.3.7 (192.168.3.7) 56(84) bytes of data.
From 192.168.4.1 icmp_seq=1 Destination Net Unreachable
From 192.168.4.1 icmp_seq=2 Destination Net Unreachable
From 192.168.4.1 icmp_seq=3 Destination Net Unreachable
Thao tác tương tự để kiểm tra kết nối giữa C3 và R6. Khi các đường kết nối đã thông, ta sẽ tiến hành cài đặt VPN để các trạm C3 và Cx có thể kết nối với nhau như trong cùng một mạng nội bộ.
Cài đặt openswan trên R4 và R6 với yum:
> yum install openswan
. . .
Thiết lập các thông số hệ thống để hỗ trợ IPSec và kiểm tra cấu hình:
>
cat /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.eth3.accept_redirects = 0
net.ipv4.conf.eth3.send_redirects = 0
net.ipv4.conf.eth4.accept_redirects = 0
net.ipv4.conf.eth4.send_redirects = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0
net.ipv4.conf.eth2.rp_filter = 0
net.ipv4.conf.eth3.rp_filter = 0
net.ipv4.conf.eth4.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
> sysctl -p
> ipsec verify
Verifying installed system and configuration files
Version check and ipsec on-path [OK]
Libreswan 3.15 (netkey) on 2.6.32-642.3.1.el6.x86_64
Checking for IPsec support in kernel [OK]
NETKEY: Testing XFRM related proc values
ICMP default/send_redirects [OK]
ICMP default/accept_redirects [OK]
XFRM larval drop [OK]
Pluto ipsec.conf syntax [OK]
Hardware random device [N/A]
Two or more interfaces found, checking IP forwarding [OK]
Checking rp_filter [OK]
Checking that pluto is running [OK]
Pluto listening for IKE on udp 500 [OK]
Pluto listening for IKE/NAT-T on udp 4500 [OK]
Pluto ipsec.secret syntax [OK]
Checking 'ip' command [OK]
Checking 'iptables' command [OK]
Checking 'prelink' command does not interfere with FIPSChecking for obsolete ipsec.conf options [OK]
Opportunistic Encryption [DISABLED]
Thiết lập cấu hình IPSec trên R4 để tạo đường hầm:
[root@R4 ~]#
cat /etc/ipsec.conf
config setup
protostack=netkey
logfile=/var/log/pluto.log
plutodebug=all
dumpdir=/var/run/pluto/
nat_traversal=yes
oe=off
conn net-to-net-vpn
authby=secret
auto=start
ike=3des-md5
## phase 1 ##
keyexchange=ike
## phase 2 ##
phase2=esp
phase2alg=3des-md5
compress=no
pfs=yes
type=tunnel
# left=<siteA-public-IP>
left=203.162.5.11
# leftsourceip=<siteA-public-IP>
leftsourceip=203.162.5.11
# leftsubnet=<siteA-private-subnet>/netmask
leftsubnet=192.168.3.0/24
# right=<siteB-public-IP>
right=205.192.25.12
# rightsubnet=<siteB-private-subnet>/netmask
rightsubnet=192.168.4.0/24
# rightsourceip=<siteB-public-IP>
rightsourceip=205.192.25.12
[root@R4 ~]# cat /etc/ipsec.secrets
205.192.25.12 203.162.5.11: PSK "pre-shared-key"
Tương tự trên R6:
[root@R6 ~]#
cat /etc/ipsec.conf
config setup
protostack=netkey
logfile=/var/log/pluto.log
plutodebug=all
dumpdir=/var/run/pluto/
nat_traversal=yes
oe=off
conn net-to-net-vpn
authby=secret
auto=start
ike=3des-md5
## phase 1 ##
keyexchange=ike
## phase 2 ##
phase2=esp
phase2alg=3des-md5
compress=no
pfs=yes
type=tunnel
# left=<siteA-public-IP>
left=203.162.5.11
# leftsourceip=<siteA-public-IP>
leftsourceip=203.162.5.11
# leftsubnet=<siteA-private-subnet>/netmask
leftsubnet=192.168.3.0/24
# right=<siteB-public-IP>
right=205.192.25.12
# rightsubnet=<siteB-private-subnet>/netmask
rightsubnet=192.168.4.0/24
# rightsourceip=<siteB-public-IP>
rightsourceip=205.192.25.12
[root@R6 ~]# cat /etc/ipsec.secrets
205.192.25.12 203.162.5.11: PSK "pre-shared-key"
Khởi động tiến trình ipsec trên R4 và R6 với các thông số cấu hình vừa thiết lập.
[root@R4 ~]#
service ipsec restart
Missing control file /var/run/pluto/pluto.ctl - is pluto running?
Starting pluto IKE daemon for IPsec: . [ OK ]
[root@R6 ~]# service ipsec restart
Missing control file /var/run/pluto/pluto.ctl - is pluto running?
Starting pluto IKE daemon for IPsec: . [ OK ]
Sử dụng wireshark trên router R5 để kiểm tra các gói tin trao đổi giữa R4 và R6, có thể thấy các gói tin ISAKMP được gửi qua lại theo chuẩn IPSec:
Nếu không có lỗi gì xảy ra, đường hầm IPSec được thiết lập thành công giữa R4 và R6. Có thể sử dụng ipsec status để kiểm tra trạng thái của đường hầm này:
[root@R6 ~]# ipsec status
. . .
000 Connection list:
000
000 "net-to-net-vpn": 192.168.4.0/24===205.192.25.12<205.192.25.12>...203.162.5.11<203.162.5.11>===192.168.3.0/24; erouted; eroute owner: #2
000 "net-to-net-vpn": oriented; my_ip=205.192.25.12; their_ip=203.162.5.11
000 "net-to-net-vpn": xauth info: us:none, them:none, my_xauthuser=[any]; their_xauthuser=[any]
000 "net-to-net-vpn": modecfg info: us:none, them:none, modecfg policy:push, dns1:unset, dns2:unset, domain:unset, banner:unset;
000 "net-to-net-vpn": labeled_ipsec:no;
000 "net-to-net-vpn": policy_label:unset;
000 "net-to-net-vpn": ike_life: 3600s; ipsec_life: 28800s; rekey_margin: 540s; rekey_fuzz: 100%; keyingtries: 0;
000 "net-to-net-vpn": retransmit-interval: 500ms; retransmit-timeout: 60s;
000 "net-to-net-vpn": sha2_truncbug:no; initial_contact:no; cisco_unity:no; send_vendorid:no;
000 "net-to-net-vpn": policy: PSK+ENCRYPT+TUNNEL+PFS+UP+IKEV1_ALLOW+IKEV2_ALLOW+SAREF_TRACK+IKE_FRAG_ALLOW;
000 "net-to-net-vpn": conn_prio: 24,24; interface: eth3; metric: 0; mtu: unset; sa_prio:auto; nflog-group: unset;
000 "net-to-net-vpn": dpd: action:hold; delay:0; timeout:0; nat-t: force_encaps:no; nat_keepalive:yes; ikev1_natt:both
000 "net-to-net-vpn": newest ISAKMP SA: #1; newest IPsec SA: #2;
000 "net-to-net-vpn": IKE algorithms wanted: 3DES_CBC(5)_000-MD5(1)_000-MODP2048(14), 3DES_CBC(5)_000-MD5(1)_000-MODP1536(5), 3DES_CBC(5)_000-MD5(1)_000-MODP1024(2)
000 "net-to-net-vpn": IKE algorithms found: 3DES_CBC(5)_192-MD5(1)_128-MODP2048(14), 3DES_CBC(5)_192-MD5(1)_128-MODP1536(5), 3DES_CBC(5)_192-MD5(1)_128-MODP1024(2)
000 "net-to-net-vpn": IKE algorithm newest: 3DES_CBC_192-MD5-MODP2048
000 "net-to-net-vpn": ESP algorithms wanted: 3DES(3)_000-MD5(1)_000
000 "net-to-net-vpn": ESP algorithms loaded: 3DES(3)_000-MD5(1)_000
000 "net-to-net-vpn": ESP algorithm newest: 3DES_000-HMAC_MD5; pfsgroup=<Phase1>
000
000 Total IPsec connections: loaded 1, active 1
000
000 State Information: DDoS cookies not required, Accepting new IKE connections
000 IKE SAs: total(1), half-open(0), open(0), authenticated(1), anonymous(0)
000 IPsec SAs: total(1), authenticated(1), anonymous(0)
000
000 #2: "net-to-net-vpn":500 STATE_QUICK_I2 (sent QI2, IPsec SA established); EVENT_SA_REPLACE in 27721s; newest IPSEC; eroute owner; isakmp#1; idle; import:admin initiate
000 #2: "net-to-net-vpn" esp.7a7a2cc6@203.162.5.11 esp.36a51eab@205.192.25.12 tun.0@203.162.5.11 tun.0@205.192.25.12 ref=0 refhim=4294901761 Traffic: ESPout=0B ESPin=0B! ESPmax=4194303B
000 #1: "net-to-net-vpn":500 STATE_MAIN_I4 (ISAKMP SA established); EVENT_SA_REPLACE in 2280s; newest ISAKMP; lastdpd=-1s(seq in:0 out:0); idle; import:admin initiate
000
000 Bare Shunt list:
000
Khi đường hầm được thiết lập, bảng routing trên R4 và R6 được tự động cập nhật thêm đường kết nối đến các mạng nội bộ ở xa tương ứng là 192.168.4.0 và 192.168.3.0:
[root@R4 ~]#
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.4.0 0.0.0.0 255.255.255.0 U 0 0 0 eth4
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3
203.162.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth4
205.192.25.0 203.162.5.1 255.255.255.0 UG 0 0 0 eth4
[root@R6 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.4.0 0.0.0.0 255.255.255.0 U 1 0 0 eth4
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3
203.162.5.0 205.192.25.1 255.255.255.0 UG 0 0 0 eth3
205.192.25.0 0.0.0.0 255.255.255.0 U 1 0 0 eth3
Lúc này, vai trò của cấu hình NAT với iptables không cần thiết nữa. Hai mạng nội bộ 192.168.3.0 và 192.168.4.0 coi như đang kết nối trực tiếp bằng đường hầm giữa R4 và R6. Có thể hủy bỏ cấu hình NAT hoặc dừng dịch vụ iptables trên các router R4 và R6.
[root@R6 ~]# service iptables stop
iptables: Setting chains to policy ACCEPT: nat filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
Kiểm tra kết nối giữa các trạm C3 và Cx bằng lệnh ping:
[root@Cx ~]# ping -c 3 192.168.3.7
PING 192.168.3.7 (192.168.3.7) 56(84) bytes of data.
64 bytes from 192.168.3.7: icmp_seq=1 ttl=62 time=2.71 ms
64 bytes from 192.168.3.7: icmp_seq=2 ttl=62 time=2.91 ms
64 bytes from 192.168.3.7: icmp_seq=3 ttl=62 time=2.65 ms
Trong quá trình ping giữa Cx và C3, sử dụng wireshark trên R5 để kiểm tra các gói tin gửi giữa R4 và R6. Có thể thấy không có gói tin ICMP nào được lưu chuyển. Hay đúng hơn là các gói ICMP này đã được mã hóa bên trong các gói ESP theo chuẩn IPSec: