我的网络上有以下 4 个 VLAN,它们通过 DHCP 连接到 Ubuntu Linux 机器。此 Linux 机器也应充当 L3 路由器。
VLAN 10 on interface eth1.10 with subnet 10.10.10.0/24
VLAN 20 on interface eth1.20 with subnet 10.10.20.0/24
VLAN 50 on interface eth1.50 with subnet 10.10.50.0/24
VLAN 100 on interface eth1.100 with subnet 10.10.100.0/24
这里是/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.10.169
netmask 255.255.255.0
gateway 192.168.10.1
auto eth1
iface eth1 inet static
address 10.10.0.1
network 10.10.0.0
netmask 255.255.255.0
broadcast 10.10.0.255
auto eth1.100
iface eth1.100 inet static
address 10.10.100.1
network 10.10.100.0
netmask 255.255.255.0
broadcast 10.10.100.255
auto eth1.10
iface eth1.10 inet static
address 10.10.10.1
network 10.10.10.0
netmask 255.255.255.0
broadcast 10.10.10.255
auto eth1.20
iface eth1.20 inet static
address 10.10.20.1
network 10.10.20.0
netmask 255.255.255.0
broadcast 10.10.20.255
auto eth1.50
iface eth1.50 inet static
address 10.10.50.1
network 10.10.50.0
netmask 255.255.255.0
broadcast 10.10.50.255
现在,所有 VLAN 的所有客户端都应该能够通过接口连接到公共互联网eth0
。该部分实际上与 iptables 规则一起工作-A POSTROUTING -o eth0 -j MASQUERADE
。DHCP 服务器也在运行。
但由于 VLAN 100 将成为管理计算机的网络,因此 VLAN 100 中的客户端应该能够访问 VLAN 10、20 和 50 上的所有其他计算机。和VLAN 10、20 和 50 中的客户端只能访问其自己 VLAN 内的计算机。
到目前为止我已经尝试了以下 iptables 规则MASQUERADE
:
-A FORWARD -i eth1.100 -o eth1.10 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.20 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.50 -j ACCEPT
-A FORWARD -i eth1.10 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.20 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.50 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
我尝试从 IP 地址为 10.10.100.101 的 PC ping IP 地址为 10.10.20.100 的 PC,但没有成功。我也无法从 100 子网 ping 10.10.50.101。
和有一个奇怪的副作用:VLAN 20 意外地(我不知道为什么)表现得像 100 一样。从那里我可以 ping VLAN 10 和 100 中的 PC,这最终应该是不可能的。
我在内核中启用了 IPv4 转发,并且外部互联网正常运行。
以下是完整的输出iptables-save
:
# Generated by iptables-save v1.6.0 on Thu May 26 09:28:59 2016
*filter
:INPUT ACCEPT [7375:724156]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3695:415474]
-A FORWARD -i eth1.100 -o eth1.10 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.20 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.50 -j ACCEPT
-A FORWARD -i eth1.10 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.20 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.50 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu May 26 09:28:59 2016
# Generated by iptables-save v1.6.0 on Thu May 26 09:28:59 2016
*nat
:PREROUTING ACCEPT [32796:9980970]
:INPUT ACCEPT [142:30526]
:OUTPUT ACCEPT [1829:211124]
:POSTROUTING ACCEPT [128:29756]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu May 26 09:28:59 2016
输出如下route
:
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.10.1 0.0.0.0 UG 0 0 0 eth0
10.10.0.0 * 255.255.255.0 U 0 0 0 eth1
10.10.10.0 * 255.255.255.0 U 0 0 0 eth1.10
10.10.20.0 * 255.255.255.0 U 0 0 0 eth1.20
10.10.50.0 * 255.255.255.0 U 0 0 0 eth1.50
10.10.100.0 * 255.255.255.0 U 0 0 0 eth1.100
link-local * 255.255.0.0 U 1000 0 0 eth0
192.168.10.0 * 255.255.255.0 U 0 0 0 eth0
提前致谢,希望有人能弄清楚我应该使用哪些 iptables 规则来实现我想要的(如果这是问题的话)。
编辑:
根据@Sanael 的要求,我做了更多的日志记录(-A FORWARD -o eth1+ -p icmp -j LOG --log-prefix "IPTABLES FORWARD: " --log-level 7
),结果如下:
ping 10.10.20.101 --> 10.10.50.100成功有以下日志:
May 26 12:14:57 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23708 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=96
May 26 12:14:57 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15185 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=96
May 26 12:14:58 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23709 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=97
May 26 12:14:58 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15317 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=97
May 26 12:14:59 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23710 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=98
May 26 12:14:59 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15349 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=98
May 26 12:15:00 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23711 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=99
May 26 12:15:00 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15597 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=99
ping 10.10.20.101 --> 10.10.100.100失败的有以下日志:
May 26 12:09:06 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.100.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=18715 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=85
May 26 12:09:11 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.100.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=18716 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=86
May 26 12:09:16 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.100.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=18717 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=87
ping 10.10.50.100 --> 10.10.20.101失败的有以下日志:
May 26 12:11:28 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.20.101 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=54378 DF PROTO=ICMP TYPE=8 CODE=0 ID=1903 SEQ=1
May 26 12:11:29 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.20.101 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=54495 DF PROTO=ICMP TYPE=8 CODE=0 ID=1903 SEQ=2
May 26 12:11:30 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.20.101 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=54693 DF PROTO=ICMP TYPE=8 CODE=0 ID=1903 SEQ=3
ping 10.10.50.100 --> 10.10.100.100失败的有以下日志:
May 26 12:12:24 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.100.100 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=8069 DF PROTO=ICMP TYPE=8 CODE=0 ID=1905 SEQ=1
May 26 12:12:25 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.100.100 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=8269 DF PROTO=ICMP TYPE=8 CODE=0 ID=1905 SEQ=2
May 26 12:12:26 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.100.100 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=8375 DF PROTO=ICMP TYPE=8 CODE=0 ID=1905 SEQ=3
ping 10.10.100.100 --> 10.10.20.101失败的 但没有创建任何日志输出。
ping 10.10.100.100 --> 10.10.50.100成功 但没有创建任何日志输出。
答案1
首先,FORWARD 链中的默认策略是 ACCEPT,因此您实际上并没有拒绝任何流量。这解释了为什么 20 -> 50 转发有效。您可以使用 来修复此问题iptables -P FORWARD DROP
。
至于其他 ping,请注意,在您的日志条目中,TTL 为 127 或 63,这表明防火墙已经做出路由决策并减少了 TTL。此外,您的防火墙未配置为阻止任何流量。这表明问题出在客户端的路由配置中。我建议您对 ping 接收方使用嗅探器来查看原始 ping 数据包是否到达?确保 10.10.10.0/24 上客户端(而不是防火墙)的默认网关是 10.10.10.1,等等。祝你好运!
并且根据路由表注释,您的路由表是正确的,表明您的防火墙直接连接到您的 VLAN 网络。
答案2
现在问题至少已部分解决(我对此很满意)。
一开始,我用 Windows 客户端测试网络,两台 PC 最近都升级到了 Windows 10。问题本身真的很愚蠢:Windows 没有响应 ping,因为 Windows 10 默认启用了一些新的安全功能。当我将一台 Linux 笔记本电脑添加到网络时,我发现所有其他设备都可以 ping Linux 笔记本电脑(默认策略是ALLOW
),但 Linux PC 无法 ping 任何其他设备(Windows 没有响应 ping)。然后,我尝试从 VLAN 100 中的 Linux PC 远程桌面连接到 VLAN 10 和 50 中的 Windows PC,然后砰的一声 - 它成功了!
因此 iptables/netfilter 规则完全没有问题。
非常感谢您的所有回答和评论!
以下是我的最终、有效且简化的 iptables 配置:
# Generated by iptables-save v1.6.0 on Thu May 26 16:00:55 2016
*filter
:INPUT ACCEPT [359:39449]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [563:89333]
-A FORWARD -i eth1+ -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.100 -o eth1+ -j ACCEPT
-A FORWARD -i eth1+ -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o eth1+ -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu May 26 16:00:55 2016
# Generated by iptables-save v1.6.0 on Thu May 26 16:00:55 2016
*nat
:PREROUTING ACCEPT [5650:1147271]
:INPUT ACCEPT [91:14019]
:OUTPUT ACCEPT [325:31088]
:POSTROUTING ACCEPT [44:7161]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu May 26 16:00:55 2016
答案3
一、iptables
您是否在现有规则后添加了日志行?如果是,这就是我对您的问题的看法。
-j ACCEPT
结束规则中数据包的路径。因此,日志行表示您的 6 条规则不匹配。- FORWARD 默认策略是 ACCEPT,因此当数据包到达 FORWARD 链的末尾时,无论如何都会被接受。您应该通过添加 来更改此行为
iptables -P FORWARD DROP
。 - 查看日志意味着如果您有正确的默认策略,数据包将被丢弃。记录的 4 个 ping 来自非 100 vlan,这是预期的行为。
- 看不到日志意味着数据包与规则匹配,并被接受。两次 ping 来自 vlan 100,并且与规则匹配,这再次是预期的行为。
我们可以看到iptables正在执行其工作,您只需要更改默认策略。
二、路由
现在您需要了解问题出在哪里。例如,可能是路由。由于 FORWARD 默认策略是 ACCEPT(您可以保留它,直到找到问题的根本原因),所以每次 ping 都应该成功。让我们看看哪些 ping 失败了:
20 到 100、50 到 20、50 到 100、100 到 20。
在日志中,我们可以检查 MAC 以了解路由是否正确。格式为<MAC dest (6 bytes)><MAC source (6 bytes)><08:00 & sometimes IP header>
。
我们拥有的日志是在路由之前的,所以我们有<eth1 mac><sender mac><not interesting>
。
我们想要的是<receiver mac><eth1 mac><not interesting>
,这样我们就可以查看数据包是否发送到正确的位置。
为了做到这一点,我们可以在 POSTROUTING 链中设置日志规则:
-A POSTROUTING -o eth1+ -p icmp -j LOG --log-prefix "IPTABLES POSTROUTING: " --log-level 7
目前我们所知的是:
- 10.10.20.101:c8:0a:a9:e5:f0:bc
- 10.10.50.100:00:1e:ec:fa:d1:10
- eth1:00:0A:5E:50:7C:C1
我们还需要知道 10.10.10.100 的 MAC 地址。
顺便说一句,如果您只有 4 个 VLAN,请尝试执行 12 次 ping,以提供足够的信息进行调试。
您可以尝试从(和到)路由器接口执行 8 次 ping 吗?(例如在路由器上ping -I eth1.100 10.10.100.100
:)
III. 第三方原因
仔细检查您的 Cisco 配置(如果您几乎确定这是根本原因,请提出另一个问题),验证每个 VLAN 都可以访问互联网。
编辑:我写得太慢了。干得好!