我有 2 台虚拟机,一台充当路由器和 Ubuntu 服务器,并通过桥接连接连接到主机,另一台是 Kali 机器,通过仅主机连接连接到服务器虚拟机。
Kali机器的IP为192.168.0.40,服务器的IP为172.16.23.100。
我设置的 iptables 规则如下:
Chain PREROUTING (policy ACCEPT 114 packets, 20912 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT all -- ens33 * 0.0.0.0/0 172.16.23.101 to:192.168.0.40
Chain INPUT (policy ACCEPT 60 packets, 8700 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 6 packets, 422 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 6 packets, 422 bytes)
pkts bytes target prot opt in out source destination
2 168 MASQUERADE all -- * ens33 192.168.0.0/24 0.0.0.0/0
0 0 SNAT all -- * ens33 192.168.0.40 0.0.0.0/0 to:172.16.23.101
从外部的 Kali 机器进入主机很顺利,但是当我尝试通过简单的 ping 或 ssh 从主机进入 Kali 机器时,却无法通行。
我是否需要设置 DNAT 以仅使用特定端口工作?
根据@grawity 的请求,iptables-save 生成的文件
# Generated by iptables-save v1.6.0 on Thu Jul 27 06:58:13 2017
*filter
:INPUT ACCEPT [686:75420]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [485:45172]
-A FORWARD -i ens33 -o ens38 -j ACCEPT
-A FORWARD -i ens38 -o ens33 -j ACCEPT
COMMIT
# Completed on Thu Jul 27 06:58:13 2017
# Generated by iptables-save v1.6.0 on Thu Jul 27 06:58:13 2017
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [4:240]
:POSTROUTING ACCEPT [4:240]
-A PREROUTING -d 172.16.23.101/32 -i ens33 -j DNAT --to-destination 192.168.0.40
-A POSTROUTING -s 192.168.0.0/24 -o ens33 -j MASQUERADE
-A POSTROUTING -s 192.168.0.40/32 -o ens33 -j SNAT --to-source 172.16.23.101
COMMIT
# Completed on Thu Jul 27 06:58:13 2017
当我在路由器/服务器上运行 tcpdump 时,它显示它正在向 172.16.23.101 地址发送 arp 请求,但没有返回任何内容,我不明白为什么如果它在 PREROUTING 链中,它就没有被 NAT 规则捕获
答案1
问题不在于 iptables 规则,那些规则都很好。但是当尝试访问 172.16.23.101 时,它发送 arp 请求以查看谁拥有该地址,但没有人。
所以我为 ens33 添加了一个子接口并赋予了该地址
我在“/etc/network/interfaces”文件中添加了以下行
auto ens33:1
iface ens33:1 inet static
address 172.16.23.101
netmask 255.255.0.0
然后,如果我使用服务器上运行的 tcpdump ping 172.16.23.101,我可以看到 ttl 为 63,这意味着它通过了一个第 3 层设备,因为 Linux 的默认 ttl 为 64