Tôi đang chơi với nftables và quan sát hành vi kỳ lạ mà tôi không thể giải thích được.
Tôi có ba máy ảo, nguồn
, bộ định tuyến
và điểm đến
. Tất cả đều chạy Oracle EL 8.5 mới nhất và được cấu hình thông qua nft.
nguồn
có giao diện mạng duy nhất enp0s8
với IP 10.111.111.1 trong /24 mạng con.
bộ định tuyến
có hai giao diện mạng: enp0s8
với IP 10.111.111.2 trong /24 mạng con và enp0s9
với IP 10.100.100.2 trong /24 mạng con.
điểm đến
có giao diện mạng duy nhất enp0s8
với IP 10.100.100.1 trong /24 mạng con.
Mục tiêu của tôi là có điểm đến
ẩn từ nguồn
đứng sau NAT, với IP 10.200.200.1. Điều tôi đã làm:
- Đã bật định tuyến IP trên
bộ định tuyến
.
- Đã chặn truy cập trực tiếp từ 10.111.111.0/24 đến 10.100.100.0/24 trên
bộ định tuyến
.
- Đã thêm tuyến tĩnh 10.200.200.0/24 qua 10.111.111.2 (
bộ định tuyến
) trên nguồn
.
- Đã cấu hình NAT trên
bộ định tuyến
như sau:
định tuyến trước chuỗi {
gõ nat hook prerouting ưu tiên dstnat; chính sách chấp nhận;
iifname "enp0s8" ip Daddr 10.200.200.1 dnat thành 10.100.100.1
}
chuyển tiếp chuỗi {
gõ nat hook postrouting ưu tiên srcnat; chính sách chấp nhận;
ip saddr 10.100.100.1 oifname "enp0s8" chuyển sang 10.200.200.1
}
Mọi thứ hoạt động như mong đợi, điểm đến
có thể truy cập từ nguồn
chỉ là 10.200.200.1 chứ không phải 10.100.100.1 (chắc chắn, tôi biết làm việc dưới quyền root là không tốt, đó chỉ là máy ảo thử nghiệm):
[root@source ~]# ping 10.100.100.1
PING 10.100.100.1 (10.100.100.1) 56(84) byte dữ liệu.
^C
--- Thống kê ping 10.100.100.1 ---
Truyền 15 gói, nhận 0 gói, mất gói 100%, thời gian 14320ms
[root@source ~]# ping 10.200.200.1
PING 10.200.200.1 (10.200.200.1) 56(84) byte dữ liệu.
64 byte từ 10.200.200.1: icmp_seq=1 ttl=63 time=0,554 ms
64 byte từ 10.200.200.1: icmp_seq=2 ttl=63 time=1,80 ms
64 byte từ 10.200.200.1: icmp_seq=3 ttl=63 time=1,84 ms
^C
--- Thống kê ping 10.200.200.1 ---
Truyền 3 gói, nhận 3 gói, mất gói 0%, thời gian 2043ms
rtt tối thiểu/trung bình/tối đa/mdev = 0,554/1,397/1,836/0,598 ms
Nhưng khi tôi thực hiện theo dõi hoặc gửi ping với TTL=1, thư trả lời có IP 10.200.200.1, thay vì bộ định tuyến
IP của 10.111.111.2:
[root@source ~]# theo dõi 10.200.200.1
theo dõi tới 10.200.200.1 (10.200.200.1), tối đa 30 bước nhảy, gói 60 byte
1 10.200.200.1 (10.200.200.1) 0,752 mili giây 0,679 mili giây 0,984 mili giây
2 10.200.200.1 (10.200.200.1) 1.181 mili giây 1.130 mili giây 1.070 mili giây
[root@source ~]# ping 10.200.200.1 -c 1 -t 1
PING 10.200.200.1 (10.200.200.1) 56(84) byte dữ liệu.
Từ 10.200.200.1 icmp_seq=1 Đã vượt quá thời gian tồn tại
--- Thống kê ping 10.200.200.1 ---
Đã truyền 1 gói, nhận 0, lỗi +1, mất gói 100%, thời gian 0ms
Nếu tôi làm tương tự với bất kỳ địa chỉ nào khác trong mạng con 10.200.200.0/24, các câu trả lời có IP chính xác:
[root@source ~]# ping 10.200.200.2 -c 1 -t 1
PING 10.200.200.2 (10.200.200.2) 56(84) byte dữ liệu.
Từ 10.111.111.2 icmp_seq=1 Đã vượt quá thời gian tồn tại
--- Thống kê ping 10.200.200.2 ---
Đã truyền 1 gói, nhận 0, lỗi +1, mất gói 100%, thời gian 0ms
Ai đó có thể vui lòng làm rõ lý do tại sao trong trường hợp đầu tiên ICMP TTL vượt quá trả lời có IP của đích cuối cùng và trong trường hợp thứ hai, nó có IP của bộ định tuyến không?