我们想要添加一个额外的网络段 (LAN2),并且需要 LAN1 上的一些机器访问 LAN2 上的资源。LAN2 上的一些机器也需要访问 LAN1 和 WAN 段上的资源。LAN1 和 LAN2 之间的网关称为“SRV-01”,这是一台双宿主 Linux 服务器。
我无法从 LAN1 访问 LAN2,也无法从 LAN2 访问 LAN1,也无法从 LAN2 访问 WAN。我想知道如何让 LAN1 主机和 LAN2 相互通信,以及如何允许从 LAN2 机器访问 WAN。
故障排除
我使用 ping 获得以下答复:
IP(源)---> IP(目标):Ping 回复 ------------------------------------------------------------------------------------------ 192.168.5.33(LAN1 上的客户端)---> 192.168.5.8(SRV-01:eth0):确定 192.168.5.33(LAN1 上的客户端)---> 10.0.2.1(SRV-01:eth1):否 192.168.5.33(LAN1 上的客户端)---> 10.0.2.2(SRV-02:eth0):否 *.*.*.*.* (SRV-01) ---> 192.168.5.33 (LAN1 上的客户端) :确定 *.*.*.*.* (SRV-01) ---> 10.0.2.2 (SRV-02:eth0) :好的 10.0.2.2 (SRV-02) ---> 10.0.2.1 (SRV-01:eth1) :确定 10.0.2.2 (SRV-02) ---> 192.168.5.8 (SRV-01:eth0) :好的 10.0.2.2 (SRV-02) ---> 192.168.5.33 (LAN1 上的客户端) :否
网络拓扑结构
WAN ---(ISP 路由器)--- LAN1 ---(SRV-01)--- LAN2 ---(SRV-02)
ISP 路由器
互联网服务提供商 (ISP) 路由器提供 NAT(两个网络适配器)并充当 LAN1 的 DHCP 服务器。我们没有该设备的 shell/admin 访问权限。
- xxx.xx.xx.xx/xx (eth0,WAN)
- 192.168.5.4/24(eth1,LAN1)
SRV-01 服务器
SRV-01 是双宿主 Ubuntu Server 14.04(两个网络适配器),它将充当 LAN1 子网和 LAN2 子网之间的网关。
- 192.168.5.8/24(eth0,LAN1)
- 10.0.2.1/24(eth1,LAN2)
/etc/网络/接口
# Loopback
auto lo
iface lo inet loopback
# LAN1
auto eth0
iface eth0 inet static
address 192.168.5.8
netmask 255.255.255.0
network 192.168.5.0
broadcast 192.168.5.255
gateway 192.168.5.4
dns-nameservers xxx.xxx.xxx.xxx
# LAN2
auto eth1
iface eth1 inet static
address 10.0.2.1
netmask 255.255.255.0
network 10.0.2.0
broadcast 10.0.2.255
dns-nameservers xxx.xxx.xxx.xxx
路由
~$ netstat -r 内核 IP 路由表 目标网关 Genmask 标志 MSS 窗口 irtt Iface 默认 192.168.5.4 0.0.0.0 UG 0 0 0 eth0 10.0.2.0 * 255.255.255.0 U 0 0 0 eth1 本地网络 * 255.255.255.0 U 0 0 0 eth0
~$ ip 路由显示 默认通过 192.168.5.4 dev eth0 10.0.2.0/24 dev eth1 proto 内核范围链接 src 10.0.2.1 192.168.5.0/24 dev eth0 proto 内核范围链接 src 192.168.5.8
IP 转发
~$ sudo sysctl -a | grep net.ipv4.ip_forward net.ipv4.ip_forward = 1 net.ipv4.ip_forward_use_pmtu = 0
防火墙
Ubuntu“简单防火墙”(UFW) 在服务器“SRV-01”上被禁用,并且所有 iptables 链都已将默认策略设置为 ACCEPT 目标。请注意,尚未有任何数据包进入 FORWARD 表...
~$ sudo ufw 状态 状态:不活跃
~$ sudo iptables -L -v | grep 策略 链输入(策略接受 369 个数据包,28278 字节) 链转发(策略接受 0 个数据包,0 字节) 链输出(策略接受 187 个数据包,19740 字节)
SRV-02 服务器
SRV-02 是带有一个网络适配器的 Ubuntu Server 14.04。
- 10.0.2.2/24(eth0,LAN2)
/etc/网络/接口
# 回送 自动档 iface lo inet 环回 # LAN2 iface eth0 inet 静态 地址 10.0.2.2 网络掩码 255.255.255.0 网络 10.0.2.0 广播 10.0.2.255 dns 名称服务器 xxx.xxx.xxx.xxx
路由
~$ netstat -r: 内核 IP 路由表 目标网关 Genmask 标志 MSS 窗口 irtt Iface 默认 10.0.2.1 0.0.0.0 UG 0 0 0 eth0 10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
~$ ip 路由显示 默认通过 10.0.2.1 dev eth0 10.0.2.0/24 dev eth0 proto 内核范围链接 src 10.0.2.2
防火墙
Ubuntu“简单防火墙”(UFW)在服务器“SRV-02”上被禁用,并且所有 iptables 链都将默认策略设置为接受目标。
~$ sudo ufw 状态 状态:不活跃
~$ sudo iptables -L -v | grep 策略 链输入(策略接受 0 个数据包,0 字节) 链转发(策略接受 0 个数据包,0 字节) 链输出(策略接受 0 个数据包,0 字节)
我这里遗漏了什么?我想知道应该向 SRV-01 添加什么静态路由,以及默认网关是否配置正确...
答案1
这种设置有两个问题:
- LAN1 上的主机对 LAN2 网段一无所知。当您从 SRV-02 ping LAN1 上的主机(我们称之为 host1)时,数据包将通过 SRV-01 路由并到达 host1。但是,host1 会将回复发送到其默认网关(ISP 路由器),因为它没有到 LAN2 的特定路由。(ISP 路由器将 a) 也将其发送到其默认网关,因为它也不了解 LAN2,或者 b) 丢弃数据包,因为它来自未知来源,而不是其本地 LAN。)
- 当尝试从 LAN2 到达 WAN 时,数据包将通过 SRV-02 路由到 ISP 路由器,其中可能出现两种情况:
- 路由器不会对数据包进行 NAT 转换,因为数据包的源 (LAN2) 不是其本地 LAN(这是最可能的情况),或者
- 路由器将对数据包进行 NAT 转换并将其发送到 Internet。但是,当回复到来并且目的地被转换回 LAN2 地址时,数据包将不会被传送,因为 ISP 路由器没有该网络的路由。数据包将被错误地发送到默认网关 (ISP)。
可以通过将 LAN2 静态路由添加到 ISP 路由器并在 SRV-01 上为 LAN2 添加源 NAT 配置来解决这些问题。但是,由于没有 ISP 路由器的管理员访问权限,因此无法做到这一点。
有两种解决方案可以解决这个问题:
A. 使 SRV-01 成为 LAN1 和 LAN2 主机的完整路由器
- 为 SRV-01 添加另一个网络适配器(总共 3 个)
- 更改拓扑如下:
。
WAN -> ISP router -> LAN1 -> SRV-01 +-> LAN3 (for hosts originally in LAN1)
+-> LAN2 -> SRV-02
基本上,我们将 SRV-01 打造为两个 LAN 段的路由器。
- 这将需要将原来位于 LAN1 中的主机移动到新子网 LAN3 - 假设我们使用
10.0.1.0/24
- SRV-01 的网络配置需要进行如下更改:
在 /etc/网络/接口:
# LAN1 - to ISP router
auto eth0
iface eth0 inet dhcp
# we can even use dhcp as the IP address is not really important
# - there are no more hosts on LAN1 apart from ISP router and SRV-01
# LAN3 - for hosts originally in LAN1
iface eth1
address 10.0.1.1
netmask 255.255.255.0
# LAN2
iface eth2
address 10.0.2.1
netmask 255.255.255.0
使 WAN 访问正常工作的 iptables 规则:
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.1.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.2.0/24 -j MASQUERADE
或者,如果您选择保留 eth0 上 SRV-01 的静态 IP 地址,则可以更改规则(尽管MASQUERADE
仍然有效):
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.1.0/24 -j SNAT --to-source 192.168.5.8
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.2.0/24 -j SNAT --to-source 192.168.5.8
- 需要在 SRV-01 的 eth1(LAN3,对于最初位于 LAN1 上的主机)上配置 DHCP,如果需要,还可能需要在 eth2(LAN2)上配置。(在这两种情况下,网关分别将是 eth1 或 eth2 的本地地址,但这是不言而喻的:)
这样 LAN3 和 LAN2 之间就可以进行通信(通过 SRV-01,它是两者的默认网关)。由于双源 NAT,WAN 访问也将从 LAN3 和 LAN2 进行。
B. 将 SRV-01 设为 LAN1 的 DHCP 服务器
这种方法不如上述方法干净,但稍微简单一些。它假设您能够在 ISP 路由器上禁用 DHCP
- 在 ISP 路由器上禁用 DHCP
- 在 SRV-01 上为 LAN1 设置 DHCP,并将 SRV-01 (192.168.5.8) 设为 LAN1 的默认网关
- 在 SRV-01 上为 LAN2 设置源 NAT 转换,以便从 LAN2 进行 WAN 访问:
。
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.2.0/24 -d 192.168.5.4 -j SNAT --to-source 192.168.5.8
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.2.0/24 ! -d 192.168.5.0/24 -j SNAT --to-source 192.168.5.8
第一行启用 SNAT,以便 LAN2 主机可以访问 ISP 路由器本身,第二行禁用 LAN2-LAN1 访问的 SNAT。
同样,这种方法不如上面的方法干净,因为同一子网中有两个路由器(SRV-01,ISP 路由器)。当我自己使用这种方法时,我注意到我的第二个路由器(此场景中为 SRV-01)会向 ISP 路由器发送 ICMP 重定向,因为它会发现客户端(LAN1 上的主机)和上游路由器(ISP 路由器)位于同一 LAN 上。这可能不是理想的情况,因为可以规避在 SRV-01 上实施的网络策略。
希望有所帮助。