Linux

iptables 無法通過第二個介面允許 ssh

  • July 28, 2014

我遇到了一個問題,因為我無法從我的第二個介面 (eth2) 使用我目前的防火牆規則執行 SSH 傳出連接。

我嘗試連接的機器有兩個名為 eth1 和 eth2 的介面。它們的 IP 地址分別為 192.168.0.18(遮罩 255.255.255.0)和 10.30.25.1(遮罩 255.255.255.248)。

這是我的 iptables 規則集的輸出:

# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source          destination
 26  4970 ACCEPT     all  --  lo     *       0.0.0.0/0       0.0.0.0/0
245 18008 ACCEPT     tcp  --  eth1   *       0.0.0.0/0       0.0.0.0/0     state RELATED,ESTABLISHED
  0     0 ACCEPT     udp  --  eth1   *       0.0.0.0/0       0.0.0.0/0     udp spt:53 dpts:1024:65535
  0     0 ACCEPT     tcp  --  eth1   *       192.168.0.0/24  0.0.0.0/0     tcp spts:1024:65535 dpt:22 state NEW
 82 12248 DROP       all  --  *      *       0.0.0.0/0       0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source          destination
 0     0 ACCEPT     all  --  eth2   eth1    0.0.0.0/0       0.0.0.0/0     state RELATED,ESTABLISHED
 0     0 ACCEPT     all  --  eth1   eth2    0.0.0.0/0       0.0.0.0/0     state NEW,RELATED,ESTABLISHED
 0     0 DROP       all  --  *      *       0.0.0.0/0       0.0.0.0/0

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source          destination
26  4970 ACCEPT     all  --  *      lo      0.0.0.0/0       0.0.0.0/0
173 20104 ACCEPT     all  --  *      eth1    0.0.0.0/0       0.0.0.0/0     state RELATED,ESTABLISHED
 5   300 ACCEPT     all  --  *      eth2    0.0.0.0/0       0.0.0.0/0     state RELATED,ESTABLISHED
 0     0 ACCEPT     udp  --  *      eth1    0.0.0.0/0       0.0.0.0/0     udp spts:1024:65535 dpt:53
 0     0 ACCEPT     tcp  --  *      eth1    0.0.0.0/0       0.0.0.0/0     tcp dpt:22
 1    60 ACCEPT     tcp  --  *      eth2    0.0.0.0/0       0.0.0.0/0     tcp dpt:22
 7   564 DROP       all  --  *      *       0.0.0.0/0       0.0.0.0/0

使用此規則集,我可以毫無問題地從 192.168.0.18 (eth1) SSH 連接到 192.168.0.0/24 子網上的任何機器。但是,當我嘗試通過另一個介面(eth2 10.30.25.1)將伺服器連接到 10.30.25.0/29 上的機器時,它無法建立連接。

然後我嘗試刷新規則並執行以下操作:

iptables --flush
iptables -t nat --flush
iptables -t mangle --flush
iptalbes -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables-save

允許一切,它可以正常工作,這意味著目標機器已啟動並接受連接,並且我的路由表應該沒有問題。

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.30.25.0      0.0.0.0         255.255.255.248 U     0      0        0 eth2
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth2
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth1

然而我顯然不想這樣做。基本上我的規則集中有問題,但我無法弄清楚。我雖然在 SSH (22) 的 OUTPUT 策略中有一個 ACCEPT 可以解決問題,但它失敗了。

我在 VMWARE 上執行 CentOS 6.5 x86_64。

您的問題是您不允許該介面上的返回半數據包。嘗試

iptables -I INPUT 3 -i eth2 -m state --state ESTABLISHED -j ACCEPT

這是有問題的規則:

245 18008 ACCEPT     tcp  --  eth1   *       0.0.0.0/0       0.0.0.0/0     state RELATED,ESTABLISHED

您只允許在 eth1 介面上返回輸入流量。去掉這個限制,你會發現你在 eth2 上的傳出流量開始工作了。

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