我有路由器 - G、台式机 - D、笔记本电脑 - L。我想通过 D 将 L 连接到互联网。
G 位于 192.168.1.1
D:enp1s0 - 192.168.1.2/24,gw G,eno1 - 10.0.0.1/16,作为 L 的路由器
L: enp1s0 - 10.0.0.2,gw 10.0.0.1。L 处的路由表:
netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.0.0.1 0.0.0.0 UG 0 0 0 enp1s0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 enp1s0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
启用 D 处的数据包转发:
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
但是L没有连接到互联网:
traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 10.0.0.1 (10.0.0.1) 0.346 ms 0.339 ms *
2 10.0.0.1 (10.0.0.1) 0.370 ms !X * *
很明显,L的数据包可以到达D,但是无法再传递下去了。
但是,当我在 D 上启用伪装时,L 可以连接:
firewall-cmd --zone=public --add-masquerade=yes
success
你能解释一下为什么只有在 D 的接口(直接连接到 L)上启用伪装时 L 才能连接到互联网吗?
答案1
需要 MASQUERADE 的原因在于 NAT 的工作方式。
考虑一下您的路由器 G。它从互联网服务提供商处获得一个 IP。该 IP 地址是路由器后面的所有系统通过该 IP 地址连接到互联网的地址,因此所有系统都伪装成该 IP 地址。(在住宅基本设置中,路由器就是这样工作的)。
您的计算机 D 充当笔记本电脑 L 的 NAT 网关,它必须遵守与互联网相同的工作规则。理想情况下,您至少要有一个内部 IP 地址,当它请求该子网中其他计算机以外的资源时,它需要能够将来自 L 的数据包伪装成 D 的内部 IP 地址,以便正确地通过 G 路由数据包。
使用计算机作为 VPN 服务器时也是如此;要进入网络的其余部分或特别是外部网络,您需要伪装成该服务器的 IP 地址。
这就是 NAT 的工作方式。这同样适用于代理等。