AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 779115
Accepted
AirPett
AirPett
Asked: 2016-05-26 22:55:52 +0800 CST2016-05-26 22:55:52 +0800 CST 2016-05-26 22:55:52 +0800 CST

使用 iptables 在 VLAN 之间转发流量

  • 772

我们的网络上有以下 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成功 但没有创建任何日志输出。

linux routing networking vlan iptables
  • 3 3 个回答
  • 24201 Views

3 个回答

  • Voted
  1. Jeremy Dover
    2016-05-27T04:20:59+08:002016-05-27T04:20:59+08:00

    首先,您在 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 网络。

    • 3
  2. Best Answer
    AirPett
    2016-05-27T05:12:48+08:002016-05-27T05:12:48+08:00

    现在问题至少部分解决了(我对此很好)。

    我一开始是用 Windows 客户端测试网络,最近两台电脑都升级了 Windows 10。问题本身非常愚蠢:Windows 没有响应 ping,因为 Windows 10 默认启用了一些新的安全性。当我将一台 Linux 笔记本电脑添加到网络时,我遇到了所有其他人都可以 ping Linux 笔记本电脑的情况(默认策略是ALLOW),但 Linux PC 无法 ping 其他任何东西(Windows 没有响应 ping)。然后我尝试远程桌面到 VLAN 10 和 50 中的 Windows PC,从 VLAN 100 中的 Linux 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
    
    • 2
  3. setenforce 1
    2016-05-27T05:51:24+08:002016-05-27T05:51:24+08:00

    一、iptables

    您是否在现有规则之后添加了日志行?如果你这样做了,那么我对你的问题的看法。

    1. -j ACCEPT在规则中结束数据包的路径。因此,日志行意味着您的 6 条规则不匹配。
    2. FORWARD 的默认策略是 ACCEPT,所以当数据包到达 FORWARD 链的末端时无论如何都会被接受。您应该通过添加来改变这种行为iptables -P FORWARD DROP。
    3. 查看日志意味着如果您有正确的默认策略,数据包将被丢弃。记录的 4 个 ping 来自非 100 vlan,这是预期的行为。
    4. 看不到日志意味着数据包匹配了规则,并且被接受了。这两个 ping 来自 vlan 100,并且匹配了一个规则,这又是预期的行为。

    我们可以看到iptables正在完成它的工作,您只需要更改默认策略即可。

    二、路由

    现在您需要了解问题来自何处。例如,它可能是路由。由于 FORWARD 的默认策略是 ACCEPT(您可以保留它,直到找到问题的根本原因),所以每次 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:)

    三、第三方原因

    仔细检查您的 Cisco conf(如果您几乎可以确定这是根本原因,请打开另一个问题),验证每个 VLAN 都可以访问 Internet。

    编辑:我写得太慢了。做得好!

    • 0

相关问题

  • 更改 PHP 的默认配置设置?

  • 有什么软件可以模拟局域网?

  • 保护新的 Ubuntu 服务器 [关闭]

  • 带宽利用工具?[关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve