Centos

僅為某些主機通過私有 IP 路由流量 - CentOS 6.6

  • April 27, 2015

我遇到了一個我無法弄清楚的奇怪問題 - 所以我希望這裡有人能幫幫我。

首先,最終目標是我網路中的特定伺服器執行與另一家公司的 IPSEC 連接,我希望所有其他伺服器通過這台伺服器為該網路上的 IP 路由流量。

此範例中的伺服器 1 是執行 IPSEC 連接的伺服器。(CentOS 6.6)

此範例中的伺服器 2 是一個應用程序伺服器,它將僅通過伺服器 1 為該特定 IP 路由流量。(CentOS 6.5)

以下將使用的一些IP:

伺服器 1

伺服器 1 公網 IP:xxxx
伺服器 1 公共廣播:xxxy
伺服器 1 公共網關:xxxz
伺服器 1 內部 IP:10.0.64.10/24

伺服器 2

伺服器 2 公網 IP:yyyy
伺服器 2 公共廣播:yyyz
伺服器 2 公共網關:yyya
伺服器 2 內部 IP:10.0.64.150/24

這些伺服器在它們內部之間具有完全連接(即我可以從一個到另一個毫無問題地 ping、ssh 等)。他們也都可以完全訪問網際網路,並且可以通過這種方式訪問


伺服器 1

這是一個ip a

# ip一個
1: lo: man 65536 qdisc noqueue state UNKNOWN
連結/環回 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 範圍主機 lo
inet6 ::1/128 範圍主機
valid_lft 永遠首選_lft 永遠
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
連結/乙太 00:0c:29:99:12:85 brd ff:ff:ff:ff:ff:ff
inet xxxx/28 brd xxxy 範圍全域 eth0
inet6 xxxx:xxxx:xxxx:xxxx/64 範圍連結
valid_lft 永遠首選_lft 永遠
3:eth1:mtu 1500 qdisc pfifo_fast state UP qlen 1000
連結/乙太 00:0c:29:99:12:8f brd ff:ff:ff:ff:ff:ff
inet 10.0.64.10/24 brd 10.0.64.255 範圍全域 eth1
inet6 fe80::20c:29ff:fe99:128f/64 範圍連結
valid_lft 永遠首選_lft 永遠

這是一個ip路由

# ip路由
xxxy/28 dev eth0 proto 核心範圍連結 src xxxx
10.0.64.0/24 dev eth1 proto 核心範圍連結 src 10.0.64.10
169.254.0.0/16 dev eth0 範圍連結指標 1002
169.254.0.0/16 dev eth1 範圍連結指標 1003
預設通過 xxxz dev eth0

這是一個sysctl -p

# sysctl -p
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
核心.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
核心.msgmnb = 65536
核心.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
核心.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 1

伺服器 2

在將 IPSEC 帶入等式之前,我已向伺服器 2 添加了一個測試 IP(8.8.8.8)以測試它是否有效

這是一個ip

# ip一個
1: lo: man 16436 qdisc noqueue state UNKNOWN
連結/環回 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 範圍主機 lo
inet6 ::1/128 範圍主機
valid_lft 永遠首選_lft 永遠
2: eth0: mtu 1500 qdisc mq 狀態 UP qlen 1000
連結/乙太 00:0c:29:15:8b:01 brd ff:ff:ff:ff:ff:ff
inet yyyy/29 brd yyyz 範圍全球 eth0
inet6 fe80::20c:29ff:fe15:8b01/64 範圍連結
valid_lft 永遠首選_lft 永遠
3: eth1: mtu 1500 qdisc mq state UP qlen 1000
連結/乙太 00:0c:29:15:8b:0b brd ff:ff:ff:ff:ff:ff
inet 10.0.64.150/24 brd 10.0.64.255 範圍全域 eth1
inet6 fe80::20c:29ff:fe15:8b0b/64 範圍連結
valid_lft 永遠首選_lft 永遠

這是一個ip路由

# ip路由
8.8.8.8 通過 10.0.64.10 開發 eth1
yyyz/29 dev eth0 proto 核心範圍連結 src yyyy
10.0.64.0/24 dev eth1 proto 核心範圍連結 src 10.0.64.150
預設通過 yyya dev eth0

現在,當我嘗試從伺服器 2 -> 8.8.8.8 執行 ping 操作時,這裡是每個伺服器的 tcpdump:

伺服器 2

如果我在 eth0 上進行 tcpdump,我沒有得到任何匹配項(因此路由顯示正確!)。eth1 得到匹配:

# tcpdump -vvv -i eth1 -n 主機 8.8.8.8
tcpdump:監聽 eth1,鏈路類型 EN10MB(乙太網),擷取大小 65535 字節
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 回應要求,id 17999,seq 1,長度 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 回應要求,id 17999,seq 2,長度 64

伺服器 1(8.8.8.8 的有希望的網關)

在 eth1 上(私人)

# tcpdump -vv -i eth1 -n 主機 8.8.8.8
tcpdump:監聽 eth1,鏈路類型 EN10MB(乙太網),擷取大小 65535 字節

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 回應要求,id 17999,seq 86,長度 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 回應要求,id 17999,seq 87,長度 64

在 eth0(公共)上

# tcpdump -vv -i eth0 -n 主機 8.8.8.8
tcpdump:監聽 eth0,鏈路類型 EN10MB(乙太網),擷取大小 65535 字節
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 回應要求,id 17999,seq 190,長度 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 回應要求,id 17999,seq 191,長度 64

我已經在兩者上都禁用了 FW(作為測試),確保對 FORWARD 流量沒有任何阻止規則(作為單獨的測試),而且我從來沒有讓我的流量從伺服器 2 到 8.8.8.8。我還嘗試將 8.8.8.8 替換為可從兩台伺服器訪問的另一台伺服器,並且發生了同樣的事情。

我願意接受任何建議 - 我非常困惑:)

在此先感謝,伊恩

這解決了!

我的 IPTables 規則集中缺少以下規則:

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

引用自:https://serverfault.com/questions/685647