Bài số 2: Thiếp lập IPSec cơ chế tunnel

Tiếp tục sử dụng kết nối mạng trong bài trước. Giả sử xuất hiện nhu cầu tất cả các trạm giữa 2 mạng 192.168.0.0/24 và 192.168.2.0/24 cần trao đổi dữ liệu bảo mật. Chế độ transport như bài trước vẫn có thể áp dụng nhưng phải cấu hình IPSec trên tất cả các trạm (rất tốn công sức quản trị). Thay vào đó, cơ chế đường hầm giữa router R1 và R2 có thể được sử dụng. Các bước thực hiện bao gồm:

  • Cài đặt IPSec trên R1 và R2, chuẩn bị khóa cho các thuật toán mã hóa & tạo cơ sở dữ liệu chính sách bảo mật (SPD) và liên kết bảo mật (SAD) trên R1 và R2.
  • Chạy thử hệ thống và theo dõi, so sánh các dòng dữ liệu bảo mật & không bảo mật.

Bước 1: thiết lập môi trường & cấu hình IPSec trên R1&R2

Sau khi cài đặt ipsec-tools trên R1&R2 và sử dụng dd kết hợp xxd để chuẩn bị khóa tạo các file cấu hình setkey trên R1&R2. Để đơn giản, cấu hình sẽ được khai báo cho riêng giao thức ESP (không sử dụng AH):

[root@R1 ~]# cat /etc/setkey.conf 
#!/usr/sbin/setkey -f

# Configuration for 192.168.1.1

# Flush the SAD and SPD
flush;
spdflush;

# ESP SAs using 192 bit long keys (168 + 24 parity)
add 192.168.1.2 192.168.1.1 esp 0x201 -m tunnel -E 3des-cbc
0x98a7ca89b932fb3b1705928499f0fd01d7a64cc5380f3ff6;
add 192.168.1.1 192.168.1.2 esp 0x301 -m tunnel -E 3des-cbc
0x0f400582883897193fd8664db0df192ac94f20f261447d2d;

# Security policies tunnel mode

spdadd 192.168.0.0/24 192.168.2.0/24 any -P out ipsec
           esp/tunnel/192.168.1.1-192.168.1.2/require;

spdadd 192.168.2.0/24 192.168.0.0/24 any -P in ipsec
           esp/tunnel/192.168.1.2-192.168.1.1/require;


[root@R2 ~]# cat /etc/setkey.conf 
#!/usr/sbin/setkey -f

# Configuration for 192.168.1.2

# Flush the SAD and SPD
flush;
spdflush;

# ESP SAs using 192 bit long keys (168 + 24 parity)
add 192.168.1.2 192.168.1.1 esp 0x201 -m tunnel -E 3des-cbc
0x98a7ca89b932fb3b1705928499f0fd01d7a64cc5380f3ff6;
add 192.168.1.1 192.168.1.2 esp 0x301 -m tunnel -E 3des-cbc 
0x0f400582883897193fd8664db0df192ac94f20f261447d2d;

# Security policies tunnel mode

spdadd 192.168.0.0/24 192.168.2.0/24 any -P in ipsec
           esp/tunnel/192.168.1.1-192.168.1.2/require;

spdadd 192.168.2.0/24 192.168.0.0/24 any -P out ipsec
           esp/tunnel/192.168.1.2-192.168.1.1/require;
			 

Một số điểm lưu ý:

  • Khi khai báo các SA với lệnh add, địa chỉ IP của router 2 đầu hầm (R1&R2) được sử dụng cùng với tham số  -m tunnel.
  • Khi khai báo các SP, địa chỉ nguồn & đích của các dòng dữ liệu được khai báo theo địa chỉ mạng, cùng với thông tin về đường hầm.

Khởi tạo cơ sở dữ liệu SPD & SAD với setkey -f và kiểm tra với tham số -D & -PD:

[root@R2 ~]# setkey -f /etc/setkey.conf 
[root@R2 ~]# setkey -D
192.168.1.1 192.168.1.2 
	esp mode=tunnel spi=769(0x00000301) reqid=0(0x00000000)
	E: 3des-cbc  0f400582 88389719 3fd8664d b0df192a c94f20f2 61447d2d
	seq=0x00000000 replay=0 flags=0x00000000 state=mature 
	created: Aug  6 10:20:04 2016	current: Aug  6 10:20:10 2016
	diff: 6(s)	hard: 0(s)	soft: 0(s)
	last:                     	hard: 0(s)	soft: 0(s)
	current: 0(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 0	hard: 0	soft: 0
	sadb_seq=1 pid=14093 refcnt=0
192.168.1.2 192.168.1.1 
	esp mode=tunnel spi=513(0x00000201) reqid=0(0x00000000)
	E: 3des-cbc  98a7ca89 b932fb3b 17059284 99f0fd01 d7a64cc5 380f3ff6
	seq=0x00000000 replay=0 flags=0x00000000 state=mature 
	created: Aug  6 10:20:04 2016	current: Aug  6 10:20:10 2016
	diff: 6(s)	hard: 0(s)	soft: 0(s)
	last:                     	hard: 0(s)	soft: 0(s)
	current: 0(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 0	hard: 0	soft: 0
	sadb_seq=0 pid=14093 refcnt=0
[root@R2 ~]# setkey -PD
192.168.2.0/24[any] 192.168.0.0/24[any] 255
	out prio def ipsec
	esp/tunnel/192.168.1.2-192.168.1.1/require
	created: Aug  6 10:20:04 2016  lastused:                     
	lifetime: 0(s) validtime: 0(s)
	spid=577 seq=1 pid=14094
	refcnt=1
192.168.0.0/24[any] 192.168.2.0/24[any] 255
	fwd prio def ipsec
	esp/tunnel/192.168.1.1-192.168.1.2/require
	created: Aug  6 10:20:04 2016  lastused:                     
	lifetime: 0(s) validtime: 0(s)
	spid=570 seq=2 pid=14094
	refcnt=1
192.168.0.0/24[any] 192.168.2.0/24[any] 255
	in prio def ipsec
	esp/tunnel/192.168.1.1-192.168.1.2/require
	created: Aug  6 10:20:04 2016  lastused:                     
	lifetime: 0(s) validtime: 0(s)
	spid=560 seq=0 pid=14094
	refcnt=1
			 

Bước 2: Kiểm tra các dòng dữ liệu

Tạo một dòng dữ liệu ICMP giữa C0 với C2 bằng lệnh ping:

[root@C0 ~]# ping 192.168.2.7
PING 192.168.2.7 (192.168.2.7) 56(84) bytes of data.
64 bytes from 192.168.2.7: icmp_seq=1 ttl=62 time=9.51 ms
64 bytes from 192.168.2.7: icmp_seq=2 ttl=62 time=2.06 ms
64 bytes from 192.168.2.7: icmp_seq=3 ttl=62 time=2.20 ms
^C
--- 192.168.2.7 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2411ms
rtt min/avg/max/mdev = 2.063/4.594/9.516/3.481 ms

Dùng Wireshark để theo dõi các gói tin trao đổi giữa R1 và R2. Không thấy xuất hiện các gói tin ICMP mà thay vào đó là các gói ESP với SPI tương ứng như khai báo trong cơ sở dữ liệu SPD và SAD.

Tiếp tục sử dụng ping để tạo các dòng dữ liệu ICMP giữa C0 với C1 hoặc C2 với C1 và kiểm tra các gói tin trên đường truyền. Gói tin ICMP lại xuất hiện mà không được mã hóa.


Cơ chế IPSec (cả 2 chế độ transport và tunnel) hoạt động xen giữa tầng IP và tầng trên, nên nó độc lập với tầng trên. Có thể sử dụng iperf3 để tạo các dòng dữ liệu TCP hoặc UDP giữa C0 và C2 rồi kiểm soát các gói tin giữa R1&R2. Tương tự như khi ping, iperf3 hoạt động bình thường như trong chế độ không bảo mật, tuy nhiên các gói tin TCP hoặc UDP sẽ không được nhìn thấy trên đường truyền giữa R1&R2. Thay vào đó là các gói ESP.

[root@C2 ~]# iperf3 -s -p 5001
-----------------------------------------------------------
Server listening on 5001
-----------------------------------------------------------
Accepted connection from 192.168.0.7, port 46013
[  5] local 192.168.2.7 port 5001 connected to 192.168.0.7 port 46014
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  1.78 MBytes  14.9 Mbits/sec                 
[  5]   1.00-2.00   sec  2.21 MBytes  18.5 Mbits/sec                 
[  5]   2.00-3.00   sec  1.81 MBytes  15.1 Mbits/sec                 
[  5]   3.00-3.17   sec   190 KBytes  9.15 Mbits/sec                 
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-3.17   sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-3.17   sec  5.98 MBytes  15.8 Mbits/sec                  receiver

 

[root@C0 ~]# iperf3 -t 3 -c 192.168.2.7 -p 5001
Connecting to host 192.168.2.7, port 5001
[  4] local 192.168.0.7 port 46014 connected to 192.168.2.7 port 5001
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  2.13 MBytes  17.9 Mbits/sec    0    176 KBytes      
[  4]   1.00-2.00   sec  2.28 MBytes  19.2 Mbits/sec    0    264 KBytes      
[  4]   2.00-3.00   sec  1.97 MBytes  16.6 Mbits/sec    0    341 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-3.00   sec  6.39 MBytes  17.9 Mbits/sec    0             sender
[  4]   0.00-3.00   sec  5.98 MBytes  16.7 Mbits/sec                  receiver