设置端口监听和转发

设置端口监听和转发

我知道,关于打开端口和端口转发的问题有很多。我尝试了几乎所有的答案,但我无法让它为我工作。

我正在虚拟机中运行全新安装的 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在您的界面的倒数第二个和最后一个命令中。

还要确保每台机器都能真正互相通信 - 通常对于虚拟机,您需要做一些额外的设置。

相关内容