設置埠偵聽和轉發
我知道,有很多關於開放埠和埠轉發的問題。我嘗試了幾乎所有的答案,但我無法讓它對我有用。
我正在虛擬機中執行全新安裝的 Kubuntu。
我只是想轉發所有流量
$$ myip $$:80 到 localhost:8080。出於測試目的,我使用 netcat 來監聽我的埠。 所以這是我的完整設置(在這些命令之前,我刪除了所有 iptable 規則,包括 PRE/POSTROUTING):
sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080 sudo iptables -A INPUT -j ACCEPT sudo iptables -A FORWARD -j ACCEPT
據我了解,現在所有連接都將被接受並允許轉發(對於所有連接)。此外,預路由會將埠 80 上的所有流量路由到 localhost:8080。
現在我聽:
sudo nc -l 10.0.2.15 80 sudo nc -l localhost 8080
我在同一台機器上使用以下命令:
curl -XPUT http://10.0.2.15:80/ curl -XPUT http://127.0.0.1:8080/
理論上,我的第二個聽眾應該看到這兩個命令。實際上,第一個偵聽器將收到第一個命令,第二個偵聽器將收到第二個命令。如果我從另一台機器上嘗試命令**curl -XPUT http://10.0.2.15:80/**將導致拒絕連接錯誤。但是我接受與 iptables 配置的任何連接,不是嗎?
我也對 POSTROUTING 做了一些實驗,但從未成功。我錯過了什麼?我現在嘗試了 3 小時…感謝您的幫助。
//編輯:我可以從另一台機器上成功地 ping 虛擬機。反之亦然。
好的,我找到了解決方案。事實證明,我並沒有那麼錯,但是缺少了一些東西:
sysctl -w net.ipv4.conf.eth0.route_localnet=1
感謝Ipor Sircer指出,核心將丟棄 127.0.0.1 的數據包,感謝這篇文章,指出如何規避這個限制。
因此,如果有人需要做類似的事情(即在虛擬機上設置埠轉發到 localhost),這裡再次使用我正在使用的完整設置:
sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080 sudo sysctl -w net.ipv4.conf.eth0.route_localnet=1
當然,將埠和介面更改為您的設置。即在您的界面的倒數第二個和最後一個命令中更改**–dport和–to-destination** AND eth0 。
還要確保每台機器都可以真正相互交談——通常對於虛擬機,你需要做一些額外的設置。