Iptables

IPTABLES nat 用 CSF 維護源 IP 地址

  • August 7, 2020

我們在虛擬化 (OpenVZ) 環境中成功使用 CSF 已經有一段時間了,它結合了 venet 和橋接介面,因此我們可以使用公共 IP + 本地定址的虛擬系統。

Kernel IP routing table
Destination       Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.100        0.0.0.0         255.255.255.255 UH    0      0        0 venet0
xxx.xxx.xxx.24    0.0.0.0         255.255.255.255 UH    0      0        0 venet0
xxx.xxx.xxx.0     0.0.0.0         255.255.255.0   U     0      0        0 vmbr0
10.0.0.0          0.0.0.0         255.255.255.0   U     0      0        0 vmbr10
0.0.0.0           xxx.xxx.xxx.254 0.0.0.0         UG    0      0        0 vmbr0

我們通過 iptables 規則路由“本地”ips 的流量:

iptables -t nat -A POSTROUTING -s "10.0.0.0/24" -o vmbr0 -j MASQUERADE

/proc/sys/net/ipv4/ip_forward 值明顯設置為 1

主機和 venet 聯網機器執行自己的 CSF 安裝,該安裝為此設置創建所有防火牆規則,其中包括創建“重定向”到內部 IP 的可能性。

有了這個,我們可以打開主機 IP 上的特定埠,這些埠由本地網路上的本地內部虛擬機提供服務。CSF 創建的一長串防火牆規則包括:

Chain PREROUTING (policy ACCEPT 53M packets, 15G bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DNAT       tcp  --  !lo    *       0.0.0.0/0            XXX.XXX.XXX.184      tcp dpt:5100 to:10.0.0.100:5000 

Chain POSTROUTING (policy ACCEPT 9700K packets, 615M bytes)
num   pkts bytes target     prot opt in     out     source               destination         

3        0     0 SNAT       tcp  --  *      !lo     0.0.0.0/0            10.0.0.100          to:XXX.XXX.XXX.184 
8       10   600 MASQUERADE  all  --  *      vmbr0   10.0.0.0/24          0.0.0.0/0           

CSF 防火牆上的重定向功能有效,但報告的 IP 是主機 IP,而不是原始 IP,因此我們不能使用目標虛擬系統上的另一個 CSF 實例(或簡單的防火牆規則)來限制它。我們知道,在 PREROUTING 上,它們也不能被限制在主機 CSF 上。

CSF 自述文件實際上聲明*“所有到另一個 IP 地址的重定向將始終顯示在目標伺服器上,其中包含該伺服器的源,而不是原始 IP 地址。”* 所以這是一個標準功能。

CSF 支持 postrules.sh 文件,我們可以在其中手動包含 NAT 規則,但我們不確定是否可以使用 IPTABLES SNAT 和/或 DNAT 將“真實”源 IP 傳遞到 NAT IP 的目標。

問題:

我們不確定是否可以使用 IPTABLES SNAT 和/或 DNAT 將“真實”源 IP 傳遞到目的地。

回答:

是的,這是可能的,如果您使用 CSF,以下是如何做到這一點。不要依賴 CSF 的重定向功能,即在 中具有類似於以下內容的行/etc/csf/csf.redirect

XXX.XXX.XXX.184|2222|10.0.0.100|22|tcp

相反,將以下iptables命令放入/etc/csf/csfpost.sh

/sbin/iptables -I FORWARD -i vmbr0 -o vmbr10 -d 10.0.0.0/24 -j ACCEPT
/sbin/iptables -I FORWARD -i vmbr0 -o vmbr10 -d 10.0.0.0/24 -j LOCALINPUT
/sbin/iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.100:22

測試:

$ ssh xxx.xxx.xxx.184 -p 2222 'netstat -tn'
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0     72 10.0.0.100:22           xxx.xxx.xxx.199:55812   ESTABLISHED

解釋:

/sbin/iptables --table nat --append PREROUTING --in-interface vmbr0 --protocol tcp --match tcp --dport 2222 --jump DNAT --to-destination 10.0.0.100:22

此行將通過 port 上的外部介面傳入的 TCP 流量重定向到 port上2222的內部地址。10.0.0.100``22

  • /sbin/iptables需要完整的iptables執行檔。
  • --table nat處理 nat(網路地址轉換)表。
  • --append PREROUTING``PREROUTING將此規則附加在鏈中所有現有規則之後。
  • --in-interface vmbr0擷取vmbr0介面上的所有流量。
  • --protocol tcp僅擷取 tcp 流量。
  • --match tcp使用 tcp 模組。
  • --dport 2222僅擷取定向到埠的流量2222
  • --jump DNAT執行目標網路地址轉換。
  • --to-destination 10.0.0.100:22將目標地址更改為10.0.0.100,將目標埠更改為22
/sbin/iptables --insert FORWARD --in-interface vmbr0 --out-interface vmbr10 --destination 10.0.0.0/24 --jump LOCALINPUT

這一行允許不要僅僅因為我們正在重定向而跳過所有 CSF 的過濾。

  • /sbin/iptables需要完整的iptables執行檔。
  • --insert FORWARD``FORWARD在鏈中現有規則之前插入此規則。這是重定向數據包的去向,與INPUT鏈相反。
  • --in-interface vmbr0匹配進入vmbr0介面的流量。
  • --out-interface vmbr10匹配從vmbr0介面流出的流量作為重定向的效果。
  • --destination 10.0.0.0/24僅匹配發往(重定向到)內部網路的流量。
  • --jump LOCALINPUT穿過LOCALINPUT鏈條。這是 CSF 執行其眾所周知的所有良好過濾的地方,防止被禁止和列入黑名單的 IP 進入系統。使用此規則,我們將 CSF 的過濾擴展到內部網路上的所有主機(而不是僅針對執行 CSF 的主機的流量)。
/sbin/iptables --insert FORWARD --in-interface vmbr0 --out-interface vmbr10 --destination 10.0.0.0/24 --jump ACCEPT

此行將所有剩餘的轉發流量傳遞到內部主機。

  • /sbin/iptables需要完整的iptables執行檔。
  • --insert FORWARD``FORWARD在鏈中現有規則之前插入此規則。在鏈中執行所有歸檔後,將評估此規則LOCALINPUT
  • --in-interface vmbr0匹配進入vmbr0介面的流量。
  • --out-interface vmbr10匹配從vmbr0介面流出的流量作為重定向的效果。
  • --destination 10.0.0.0/24僅匹配發往(重定向到)內部網路的流量。
  • --jump ACCEPT在 CSF 完成所有過濾(在LOCALINPUT鏈中)之後,我們希望剩餘的數據包被ACCEPT編輯。

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