IP 轉發、偽裝、NAT
我的目標上有一個物理介面
eth0
,執行 Linux。該介面的 IP 地址為 172.16.81。x(公共 IP)。我必須創建一個
eth0:1
IP 地址為 173.1.1 的虛擬介面。x。我將使用 IP 地址 173.1.1 執行具有自定義埠 49155 的套接字伺服器。x。從另一台 PC/目標我應該無法 ping 173.1.1。x。但是,我將在另一台 PC 上執行套接字客戶端程序。此客戶端應該能夠連接到 172.16.81 上的埠 49155。x公共 IP。
我試過NAT,橋接但不成功。
使用以下 iptable 規則,能夠建立伺服器<–>客戶端通信:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward sudo iptables -A FORWARD -i ens33 -o 173.1.1.6 -p tcp --syn --dport 49155 -m conntrack --ctstate NEW -j ACCEPT sudo iptables -A FORWARD -i ens33 -o 173.1.1.6 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -A FORWARD -i ens33 -o 173.1.1.6 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 49155 -j DNAT --to-destination 173.1.1.6 sudo iptables -t nat -A POSTROUTING -o ens33 -p tcp --dport 49155 -d 173.1.1.6 -j SNAT --to-source 192.168.233.251 sudo iptables -A INPUT -m tcp -p tcp -s 192.168.233.251 --dport 49155 -j ACCEPT
此時仍然可以從外部 PC ping 173.1.1.6。
但是我還必須使 173.1.1.6 對外部世界不可見,因為我添加了以下規則:
sudo iptables -A INPUT -d 173.1.1.6 -j DROP sudo iptables -A OUTPUT -s 173.1.1.6 -j DROP sudo iptables -A FORWARD -s 173.1.1.6 -j DROP
在此 ping 被阻止後。伺服器 <–> 客戶端通信也不會發生。
雖然我不知道您最終實際嘗試設置或實現的目標是什麼,但考慮到以下情況:
- 您在同一主機上配置了兩個 IP 地址(無論它們是否配置在同一網路介面上)
- 您有一些綁定到其中一個地址的伺服器程序
- 您不希望其他主機能夠通過上述程序綁定的地址訪問此主機(無論它們是否正在嘗試連接到該程序/埠)。
- 您希望其他主機能夠使用未綁定的其他地址連接到上述程序。
不管以上在任何情況下是否有意義,您都可以使用以下 iptables 規則來做到這一點:
(假設它有 和 的 IP 地址,
192.168.1.2
並且192.168.2.2
伺服器程序綁定到192.168.2.2:80
,我希望其他主機能夠連接到它192.168.1.2:8080
)iptables -t raw -I PREROUTING -d 192.168.2.2 -j DROP iptables -t nat -I PREROUTING -d 192.168.1.2 -p tcp --dport 8080 -j DNAT --to-destination 192.168.2.2:80
(注意:這些規則適用於主機本身,而不是其網關左右;由於您包含
FORWARD
了我無法理解的規則,所以我不知道您在做什麼或在哪裡做)這裡的關鍵是使用
raw (PREROUTING)
而不是filter (INPUT)
丟棄不需要的流量,因為filter (INPUT)
它與 after is 匹配nat (PREROUTING)
。您可能不想將入站介面匹配 (
-i
) 添加到第一條規則,因為您顯然希望地址完全“不可見”。(好吧,也許你想要! -i
……再說一次,我不知道你到底想做什麼,所以。)對於第二個,這取決於你希望 DNAT 在什麼情況下發生。作為記錄,無論如何,我認為您沒有任何理由為此目的使用公共 IP(儘管公平地說,即使您使用私有 IP,您也需要選擇一個與私有子網不衝突的該主機需要到達的位置)。
PS 據我所知,您所說的“虛擬介面”只不過是一種在一個網路介面上配置多個 IP 地址的古老方法。