无法使用 iptables NAT 从外部世界访问内部 IP

无法使用 iptables NAT 从外部世界访问内部 IP

我有 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

相关内容