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

Bước 1: Kiểm tra cấu hình kết nối mạng khi chưa có VPN

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 CxR4 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 C3R6. Khi các đường kết nối đã thông, ta sẽ tiến hành cài đặt VPN để các trạm C3Cx có thể kết nối với nhau như trong cùng một mạng nội bộ.

Bước 2: Cài đặt openswan trên các router R4 và R6

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 R4R6 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 R4R6. 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 R4R6 đượ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 R4R6. 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 C3Cx 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 CxC3, 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: