![NAT默认允许从外部访问内部网络(或路由器的本地接口)吗?](https://linux22.com/image/62167/NAT%E9%BB%98%E8%AE%A4%E5%85%81%E8%AE%B8%E4%BB%8E%E5%A4%96%E9%83%A8%E8%AE%BF%E9%97%AE%E5%86%85%E9%83%A8%E7%BD%91%E7%BB%9C%EF%BC%88%E6%88%96%E8%B7%AF%E7%94%B1%E5%99%A8%E7%9A%84%E6%9C%AC%E5%9C%B0%E6%8E%A5%E5%8F%A3%EF%BC%89%E5%90%97%EF%BC%9F.png)
我使用的是较旧的 SOHO 路由器wl500gP(它是v1,但我认为这并不重要)与自定义奥列格固件。我的拓扑如下所示:
192.168.3.3 192.168.3.2 NAT 192.168.2.1 192.168.2.170 (DHCP)
PC1<--------------------------->(WAN)wl500gP(LAN)<-------------------------------->PC2
根据网络界面,我在路由器上启用了 NAT(下面是一些输出,您可以验证它,因为使用自定义固件,路由器是 Linux 盒子)。
现在我发现:我可以从PC1访问路由器的LAN接口,但无法从PC1访问PC2。我不确定从外部世界访问(甚至部分)内部网络是否是正常的 NAT 行为。不是所有被转换的地址都隐藏在NAT后面吗?据我所知,我还没有设置虚拟服务器、端口转发、DMZ 等。以下是我的实验:
# PC1:
└──> ping 192.168.2.1
connect: Network is unreachable
└──> sudo route add -net 192.168.2.0 netmask 255.255.255.0 dev eth0
└──> ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_req=1 ttl=64 time=0.873 ms
64 bytes from 192.168.2.1: icmp_req=2 ttl=64 time=0.405 ms
64 bytes from 192.168.2.1: icmp_req=3 ttl=64 time=0.415 ms
64 bytes from 192.168.2.1: icmp_req=4 ttl=64 time=0.399 ms
^C
--- 192.168.2.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2998ms
rtt min/avg/max/mdev = 0.399/0.523/0.873/0.202 ms
└──> ping 192.168.2.170
PING 192.168.2.170 (192.168.2.170) 56(84) bytes of data.
From 192.168.3.3 icmp_seq=1 Destination Host Unreachable
From 192.168.3.3 icmp_seq=2 Destination Host Unreachable
From 192.168.3.3 icmp_seq=3 Destination Host Unreachable
From 192.168.3.3 icmp_seq=4 Destination Host Unreachable
From 192.168.3.3 icmp_seq=5 Destination Host Unreachable
From 192.168.3.3 icmp_seq=6 Destination Host Unreachable
# PC2:
# Both pings to 192.168.3.2 and 192.168.3.3 are working. Also simple communication with 192.168.3.3 using netcat is possible.
这也是我的路由器的(我希望)最重要输出的安静复杂列表。这些主要是默认值(我已经更改了 IP 地址和其他一些内容,但我希望与 NAT、路由、桥接、转发等相关的内容不会导致上述 NAT 行为)如果有人能解释IP Tables
和IP Tables NAT
部分,我将不胜感激。我注意到dnsmasq
守护进程正在运行,因此看起来NAT DNS 处于活动状态。
wl500gP:
Interfaces
##########
br0 Link encap:Ethernet HWaddr 00:1B:FC:6B:81:02
inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:203 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:77202 (75.3 KiB)
eth0 Link encap:Ethernet HWaddr 00:1B:FC:6B:81:02
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2561 errors:0 dropped:0 overruns:0 frame:0
TX packets:3101 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:264691 (258.4 KiB) TX bytes:2594967 (2.4 MiB)
Interrupt:4 Base address:0x1000
eth1 Link encap:Ethernet HWaddr 00:1B:FC:6B:81:02
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:14
TX packets:203 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:78826 (76.9 KiB)
Interrupt:12 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MULTICAST MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
vlan0 Link encap:Ethernet HWaddr 00:1B:FC:6B:81:02
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:203 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:78014 (76.1 KiB)
vlan1 Link encap:Ethernet HWaddr 00:1B:FC:6B:81:02
inet addr:192.168.3.2 Bcast:192.168.3.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2561 errors:0 dropped:0 overruns:0 frame:0
TX packets:2898 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:218593 (213.4 KiB) TX bytes:2516953 (2.3 MiB)
Routing Table
#############
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.3 0.0.0.0 255.255.255.255 UH 0 0 0 vlan1
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 vlan1
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.3.3 0.0.0.0 UG 0 0 0 vlan1
IP Tables
#########
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
2366 197K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 state NEW
170 63047 ACCEPT all -- br0 * 0.0.0.0/0 0.0.0.0/0 state NEW
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21 flags:0x17/0x02
188 11280 ACCEPT tcp -- * * 0.0.0.0/0 192.168.2.1 tcp dpt:80
4 336 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:33434:33534
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- br0 br0 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP all -- !br0 vlan1 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate DNAT
0 0 DROP all -- * br0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 3069 packets, 2528K bytes)
pkts bytes target prot opt in out source destination
Chain BRUTE (0 references)
pkts bytes target prot opt in out source destination
Chain MACS (0 references)
pkts bytes target prot opt in out source destination
Chain SECURITY (0 references)
pkts bytes target prot opt in out source destination
0 0 RETURN tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x02 limit: avg 1/sec burst 5
0 0 RETURN tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x04 limit: avg 1/sec burst 5
0 0 RETURN udp -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 5/sec burst 5
0 0 RETURN icmp -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 5/sec burst 5
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain logaccept (0 references)
pkts bytes target prot opt in out source destination
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 state NEW LOG flags 7 level 4 prefix `ACCEPT '
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain logdrop (0 references)
pkts bytes target prot opt in out source destination
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 state NEW LOG flags 7 level 4 prefix `DROP '
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
IP Tables NAT
#############
Chain PREROUTING (policy ACCEPT 4 packets, 336 bytes)
pkts bytes target prot opt in out source destination
189 11340 VSERVER all -- * * 0.0.0.0/0 192.168.3.2
Chain POSTROUTING (policy ACCEPT 13 packets, 4303 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * vlan1 !192.168.3.2 0.0.0.0/0
0 0 MASQUERADE all -- * br0 192.168.2.0/24 192.168.2.0/24
Chain OUTPUT (policy ACCEPT 13 packets, 4303 bytes)
pkts bytes target prot opt in out source destination
Chain VSERVER (1 references)
pkts bytes target prot opt in out source destination
189 11340 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:192.168.2.1:80
Process List
############
PID USER VSZ STAT COMMAND
1 admin 1484 S /sbin/init
2 admin 0 SW [keventd]
3 admin 0 SWN [ksoftirqd_CPU0]
4 admin 0 SW [kswapd]
5 admin 0 SW [bdflush]
6 admin 0 SW [kupdated]
7 admin 0 SW [mtdblockd]
54 admin 1484 S syslogd -m 0 -O /tmp/syslog.log -S -D -l 7 -b 1
58 admin 1480 S klogd
59 admin 1480 S telnetd
64 admin 1120 S httpd vlan1
70 nobody 852 S dnsmasq
73 admin 964 S lld2d br0 eth1
74 admin 0 SW [khubd]
83 admin 656 S p9100d -f /dev/usb/lp0 0
85 admin 1480 S rcamdmain
99 admin 1480 S watchdog
101 admin 1040 S upnp -D -L br0 -W vlan1
150 admin 1484 S sh -c /tmp/../usr/sbin/sysinfo > /tmp/sysinfo.htm
151 admin 1480 S /bin/sh /tmp/../usr/sbin/sysinfo
167 admin 1480 R ps
brctl show
##########
bridge name bridge id STP enabled interfaces
br0 8000.001bfc6b8102 no vlan0
eth1
答案1
这是正常现象,与 NAT 无关。默认情况下,Linux 将 IP 地址视为属于机器1,不针对特定接口。因此,它会在任何接口上将数据包应答到 192.168.2.1,而不仅仅是 LAN 接口。
也就是说,NAT 确实不是意味着防火墙,反之亦然。例如,您可以将内部主机 192.168.0.2–254 映射到公共 IP XYZ2–254,并将所有前往 XYZ253 的流量转发到 192.168.0.253。那还是NAT。
将整个子网映射到一个外部 IP 地址的副作用是,您会获得类似防火墙的行为,使连接基本上仅限于传出。但即便如此,您的防火墙规则仍应阻止这些数据包 — NAT 代码可能会被欺骗来映射您不希望的端口,但防火墙不会。而且它也更加灵活。 (如果您的 ISP 受到威胁,他们可能会将流量发送到您的专用 LAN 地址,并且您的计算机会很乐意转发它)。
PS:要查看 NAT 规则,您需要iptables -t nat -L
.要查看允许通过路由器/防火墙转发的内容,您需要查看链FORWARD
,而不是INPUT
链。
脚注
1 或者更准确地说,计算机上的特定网络命名空间 — 可能只有一个,除非您使用某些虚拟服务器技术。中的 和 文件配置arp_ignore
此行为。arp_announce
/proc/net/ipv4/conf/*/
答案2
有几点需要注意。
- Iptables NAT 是基于连接的。一般来说(像 ftp 这样的协议有一些复杂性,它有 NAT 助手)只有连接的第一个数据包通过 NAT 表,然后决定如何处理连接的其余部分。
- NAT 并不意味着防火墙,反之亦然。如果您只设置了 NAT 规则,您将完全能够 ping 通所有内部主机。
- 如果数据包确实被转发,则仅流经 FORWARD 链。如果它们的目的地是本地计算机上的地址,则它们会转至 INPUT 链。
INPUT 链中的规则接受所有 ICMP 数据包,因此对路由器“内部 IP”的 ping 操作会成功。
另一方面,对内部网络上的设备的 ping 操作会通过防火墙规则将其丢弃的转发链。