我们的networking上有以下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接口连接到公共networking。 这部分实际上与iptables规则一起工作-A POSTROUTING -o eth0 -j MASQUERADE 。 DHCP服务器也在工作。
但是由于VLAN 100将成为pipe理计算机的networking,因此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和VLAN中的PC,最终不应该这样做。
我在内核中启用了IPv4转发function,并且外部互联网按预期工作。
这里是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请求,我做了更多的日志logging( -A FORWARD -o eth1+ -p icmp -j LOG --log-prefix "IPTABLES FORWARD: " --log-level 7 ),结果如下:
平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 失败, 但没有创build任何日志输出。
Ping 10.10.100.100 – > 10.10.50.100 成功 但是没有创build任何日志输出。
首先,你在FORWARD链中的默认策略是ACCEPT,所以你实际上并不会拒绝任何stream量。 这就解释了为什么20 – > 50的转发工作。 你可以用iptables -P FORWARD DROP修复这个问题。
至于其他ping,请注意,在您的日志条目中,TTL为127或63,表示防火墙已经做出了路由决定并减less了TTL。 此外,您的防火墙未configuration为阻止任何stream量。 这表明问题出在客户端的路由configuration中。 我可以build议你在ping接收者上使用嗅探器来查看原来的ping数据包是否到达? 确保10.10.10.0/24上的客户端(不是防火墙)的默认网关是10.10.10.1,等等。祝你好运!
并且在路由表注释之后,您的路由表是正确的,表明您的防火墙直接连接到您的VLANnetworking。
现在问题至less部分解决(我很好)。
我刚开始用Windows客户端testingnetworking,而且这两台PC最近都得到了Windows 10的升级。 问题本身是非常愚蠢的:Windows没有响应ping,因为在Windows 10中默认启用了一些新的安全function。当我将一台Linux笔记本电脑添加到networking时,我遇到了所有其他人都可以ping Linux笔记本电脑的情况默认策略是ALLOW ),但Linux PC不能ping任何东西(Windows没有响应ping)。 然后,我尝试远程桌面到VLAN 10和50中的Windows PC,从VLAN 100中的Linux PC和繁荣 – 它的工作!
所以iptables / netfilter规则完全没有问题。
非常感谢所有的答案和评论!
这是我最后的,工作和简化的iptablesconfiguration:
# 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
您是否在现有规则之后添加了日志行? 如果你有这个问题,我就是这么想的。
-j ACCEPT结束规则中数据包的path。 所以日志行意味着你的6条规则不匹配。 iptables -P FORWARD DROP来改变这个行为。 我们可以看到iptables正在做它的工作,你只需要改变默认策略。
现在您需要了解问题来自哪里。 例如,它可能是路由。 由于FORWARD默认策略是ACCEPT(可以保留它,直到find问题的根本原因),每个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.10.100的MAC。
顺便说一下,如果你只有4个vlan,那么你可以尝试12个ping来提供足够的信息来进行debugging。
你可以尝试从(和到)路由器接口8 ping? (例如在路由器上: ping -I eth1.100 10.10.100.100 )
仔细检查你的思科conf(并打开另一个问题,如果你几乎肯定是谁的根本原因),validation每一个VLAN都有互联网接入。
编辑:我写的方式太慢了。 做得好!