Tôi đang gặp một vấn đề kỳ lạ mà tôi không thể tìm ra - vì vậy tôi đã hy vọng ai đó ở đây có thể giúp tôi một tay.

Trước hết, mục tiêu cuối cùng là một máy chủ cụ thể trong mạng của tôi chạy kết nối IPSEC đến một công ty khác và tôi muốn tất cả các máy chủ khác định tuyến lưu lượng truy cập cho IP trên mạng đó thông qua máy chủ duy nhất này.

Máy chủ 1 trong ví dụ này là máy chủ chạy kết nối IPSEC. (CentOS 6.6)

Máy chủ 2 trong ví dụ này là một máy chủ ứng dụng sẽ định tuyến lưu lượng truy cập chỉ cho IP cụ thể đó thông qua máy chủ 1 (CentOS 6.5)

Một số IP sẽ được sử dụng bên dưới:

Máy chủ 1

Server 1 Public IP: x.x.x.x
Server 1 Public Broadcast: x.x.x.y
Server 1 Public Gateway: x.x.x.z
Server 1 Internal IP: 10.0.64.10/24

Máy chủ 2

Server 2 Public IP: y.y.y.y
Server 2 Public Broadcast: y.y.y.z
Server 2 Public Gateway: y.y.y.a
Server 2 Internal IP: 10.0.64.150/24

Các máy chủ đó có đầy đủ kết nối nội bộ giữa chúng (tức là tôi có thể ping, ssh, v.v. từ máy này sang máy khác mà không có vấn đề gì). Cả hai đều có toàn quyền truy cập internet và có thể truy cập theo cách đó


Máy chủ 1

Đây là một ip cho điều đó

# ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:99:12:85 brd ff:ff:ff:ff:ff:ff
    inet x.x.x.x/28 brd x.x.x.y scope global eth0
    inet6 xxxx:xxxx:xxxx:xxxx/64 scope link
       valid_lft forever preferred_lft forever
3: eth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:99:12:8f brd ff:ff:ff:ff:ff:ff
    inet 10.0.64.10/24 brd 10.0.64.255 scope global eth1
    inet6 fe80::20c:29ff:fe99:128f/64 scope link
       valid_lft forever preferred_lft forever

Đây là một tuyến đường ip

# ip route
x.x.x.y/28 dev eth0  proto kernel  scope link  src x.x.x.x
10.0.64.0/24 dev eth1  proto kernel  scope link  src 10.0.64.10
169.254.0.0/16 dev eth0  scope link  metric 1002
169.254.0.0/16 dev eth1  scope link  metric 1003
default via x.x.x.z dev eth0

Đây là một sysctl -p

# sysctl -p
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.default.proxy_arp = 1
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 1

Máy chủ 2

Tôi đã thêm một ip thử nghiệm duy nhất (8.8.8.8) vào máy chủ hai để kiểm tra xem nó có hoạt động hay không trước khi đưa IPSEC vào phương trình

Đây là một ip a

# ip a
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:0c:29:15:8b:01 brd ff:ff:ff:ff:ff:ff
    inet y.y.y.y/29 brd y.y.y.z scope global eth0
    inet6 fe80::20c:29ff:fe15:8b01/64 scope link
       valid_lft forever preferred_lft forever
3: eth1:  mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:0c:29:15:8b:0b brd ff:ff:ff:ff:ff:ff
    inet 10.0.64.150/24 brd 10.0.64.255 scope global eth1
    inet6 fe80::20c:29ff:fe15:8b0b/64 scope link
       valid_lft forever preferred_lft forever

Đây là một tuyến đường ip

# ip route
8.8.8.8 via 10.0.64.10 dev eth1
y.y.y.z/29 dev eth0  proto kernel  scope link  src y.y.y.y
10.0.64.0/24 dev eth1  proto kernel  scope link  src 10.0.64.150
default via y.y.y.a dev eth0

Bây giờ khi tôi thử ping từ Máy chủ 2 -> 8.8.8.8, đây là tcpdumps từ mỗi máy chủ:

Máy chủ 2

Nếu tôi tcpdump trên eth0, tôi không nhận được kết quả phù hợp nào (vì vậy tuyến đường xuất hiện đúng!). eth1 nhận được các trận đấu:

# tcpdump -vvv -i eth1 -n host 8.8.8.8
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
11:25:55.609902 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
    10.0.64.150 > 8.8.8.8: ICMP echo request, id 17999, seq 1, length 64
11:25:56.609262 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
    10.0.64.150 > 8.8.8.8: ICMP echo request, id 17999, seq 2, length 64

Máy chủ 1 (Cổng hy vọng cho 8.8.8.8)

Trên eth1 (Riêng tư)

# tcpdump -vv -i eth1 -n host 8.8.8.8
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes

11:27:20.608766 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
    10.0.64.150 > 8.8.8.8: ICMP echo request, id 17999, seq 86, length 64
11:27:21.608738 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
    10.0.64.150 > 8.8.8.8: ICMP echo request, id 17999, seq 87, length 64

Trên eth0 (công khai)

# tcpdump -vv -i eth0 -n host 8.8.8.8
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:29:04.608773 IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
    10.0.64.150 > 8.8.8.8: ICMP echo request, id 17999, seq 190, length 64
11:29:05.608800 IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
    10.0.64.150 > 8.8.8.8: ICMP echo request, id 17999, seq 191, length 64

Tôi đã tắt FW trên cả hai (như một thử nghiệm), đảm bảo không có bất kỳ quy tắc chặn nào đối với lưu lượng FORWARD (như một thử nghiệm riêng biệt) và tôi không bao giờ nhận được lưu lượng truy cập của mình từ Máy chủ 2 đến 8.8.8.8. Tôi cũng đã thử thay thế 8.8.8.8 cho một máy chủ khác có thể truy cập được từ cả hai máy chủ và điều tương tự cũng xảy ra.

Tôi sẵn sàng đón nhận bất kỳ đề xuất nào - tôi rất bối rối :)

Cảm ơn trước, Ian

answer

Điều này đã được giải quyết!

Tôi đã thiếu quy tắc sau trong bộ quy tắc IPTables của mình:

iptables -t nat -I POSTROUTING 1 -o eth0 --jump MASQUERADE