我有以下 iptables 规则,将端口 2222 上的传入 ssh 流量转发到同一主机上的 vmware“vmnet”网络中运行的虚拟机。
192.168.1.1 192.168.1.40
+---------+ +------+ +-----------------+
| network |---->| host |__ | virtual machine |
+---------+ +------+ \\__+-----------------+
192.168.2.1 \_____192.168.2.22
在虚拟机的auth.log中,远程登录的传入IP地址始终是转发数据包的主机的IP。 如何保存远程 IP 信息?
*filter
:INPUT ACCEPT [593178:45807398]
:FORWARD ACCEPT [881:158378]
:OUTPUT ACCEPT [859348:1232593358]
-A FORWARD -d 192.168.2.22/32 -o vmnet99 -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT
*nat
:PREROUTING ACCEPT [943:138565]
:INPUT ACCEPT [658:122878]
:OUTPUT ACCEPT [3266:229178]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 2222 -j DNAT --to-destination 192.168.2.22:22
-A POSTROUTING -j MASQUERADE
COMMIT
答案1
你的最后一条 iptables 规则,
-A POSTROUTING -j MASQUERADE
伪装所有离开主机的数据包,包括发往虚拟机的数据包:这就是为什么您在客户机上看到所有数据包都来自主机的原因。您应该将伪装限制在离开主机前往互联网的数据包上,例如
-A POSTROUTING -o eth0 -j MASQUERADE
如果您将 eth0 称为连接到 Internet 的接口。
编辑:
如果问题是我还需要什么为了使 IP 转发正常工作,一个充分的答案是:
sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.2.22:22