我正在使用以下规则将端口从我的主机(192.168.1.4@MY_LAN
)转发到我的虚拟机( ) :10.0.10.5@HOST
iptables
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:80
:VPN_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
有两件事:
- 端口转发无需监听套接字即可工作,它只是重写目标地址和/或端口。因此,转发端口号的监听套接字列表为空是正常情况。
- 本地发起的数据包(来自
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