我知道,关于打开端口和端口转发的问题有很多。我尝试了几乎所有的答案,但我无法让它为我工作。
我正在虚拟机中运行全新安装的 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 -XPUThttp://10.0.2.15:80/会导致拒绝连接错误。但我接受任何与 iptables 配置有关系,不是吗?
我也对 POSTROUTING 进行了一些实验,但从未成功。我错过了什么?我尝试了 3 小时左右……感谢您的帮助。
//编辑:我可以从另一台机器成功 ping 虚拟机。反之亦然。
答案1
好的,我找到了解决方案。事实证明,我并没有错,但缺少了一些东西:
sysctl -w net.ipv4.conf.eth0.route_localnet=1
谢谢伊波尔·西尔瑟谁指出,内核将丢弃带有 127.0.0.1 的数据包,这要归功于这个帖子,指出了如何规避这一限制。
因此,如果有人需要做类似的事情(即在虚拟机上设置到本地主机的端口转发),这里再次提供我正在使用的完整设置:
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和--到目的地 和 eth0在您的界面的倒数第二个和最后一个命令中。
还要确保每台机器都能真正互相通信 - 通常对于虚拟机,您需要做一些额外的设置。