IPTABLES nat 用 CSF 維護源 IP 地址
我們在虛擬化 (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
編輯。