问题

问题

我正在使用以下规则将端口从我的主机(192.168.1.4@MY_LAN)转发到我的虚拟机( ) :10.0.10.5@HOSTiptables

HOST:~$ iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.0.10.5:80

192.168.1.4:80如果我向内部发出请求MY_LAN,我会得到正确的回应。

但是,HOST 上没有监听端口 80:

HOST:~$ netstat -anp | grep 80 | grep -w LISTEN
# nothing shown here 

...因此当我将我的主机连接到 VPN 时,我无法连接到HOST:80VPN_SERVER

VPN_SERVER:~$ curl http://192.168.30.11:80
curl: (7) Failed to connect to 192.168.30.11 port 80: Connection refused

如果我使用转发连接socat,则一切都正常工作(基于这个帖子):

HOST:~$ sudo socat TCP-LISTEN:80,su=nobody,fork,reuseaddr TCP-CONNECT:10.0.10.5:80
VPN_SERVER:~$ curl http://192.168.30.11:80
<html>
<head><title>Hello world!</title></head>
<body>
</body>
</html>

问题

我怎样才能摆脱这种socat解决方法并仅使用来实现这种类型的连接iptables

答案1

有两件事:

  1. 端口转发无需监听套接字即可工作,它只是重写目标地址和/或端口。因此,转发端口号的监听套接字列表为空是正常情况。
  2. 本地发起的数据包(来自HOST其自身)不会通过该POSTROUTING链。您应该在链下添加另一条DNAT规则nat/OUTPUT
iptables -t nat -A OUTPUT \
         -d 192.168.30.11 \
         -p tcp --dport 80 \
    -j DNAT --to 10.0.10.5:80

答案2

我认为这是一个路由问题

尝试添加伪装规则。类似这样的事情:

iptables -t nat -A POSTROUTING -p tcp --dport 80 -d 10.10.10.5 -j MASQUERADE

相关内容