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 / 问题 / 1053095
Accepted
Ingo
Ingo
Asked: 2021-02-11 03:08:59 +0800 CST2021-02-11 03:08:59 +0800 CST 2021-02-11 03:08:59 +0800 CST

如何在 Linux 机器上用不同的 VLAN 标签标记 IPv4 和 IPv6 数据包?

  • 772

我想用不同的 VLAN 标签标记来自启用双栈的连接的传入 IPv4 和 IPv6 数据包,例如 IPv4 数据包应该转到 VLAN4,而 IPv6 数据包应该转到 VLAN6。更一般地说,我想将混合 IPv4 和 IPv6 数据包的双栈 ip 流拆分为两个干净的单栈网络,这样您就不会在 IPv6 网络上找到任何 IPv4 数据包,反之亦然。我需要它来测试和支持仅 IPv6 的网络。当然,我仍然需要 IPv4 数据。它不能简单地被丢弃。

                          Linux Box
                       Debian Bullseye
       untagged         ┏━━━━━━━━━━━┓         tagged (trunk)
════════════════════════┫eth0  vlan4┣═╦══════════════════════
     IPv4 and IPv6      ┃      vlan6┣═╝eth1  IPv4 with VLAN4 tag
      dual stack        ┗━━━━━━━━━━━┛        IPv6 with VLAN6 tag

我查看了 Linux 网桥,nftables但无法找到解决方案。我怎样才能实现这种选择性标记?

debian vlan ipv6 ipv4 systemd-networkd
  • 2 2 个回答
  • 803 Views

2 个回答

  • Voted
  1. fuero
    2021-02-15T06:50:42+08:002021-02-15T06:50:42+08:00

    虽然您的答案显然对您有用,但它似乎过于复杂。我怀疑它是否可以满足您的要求,因为它在给定的输出中缺少任何 IPv4 地址(除了 lo)。

    创建 2 个标记接口(例如命名为 vlan4 和 vlan6),为它们分配 IPv4 和 IPv6 地址 + 网关,并使用 sysctl 为 IPv4 禁用 SLAAC 就足够了。

    除了启用 eth0 和 eth1 之间的流动所需的东西之外,不需要桥接或弄乱 nftables。

    • 3
  2. Best Answer
    Ingo
    2021-02-12T14:52:25+08:002021-02-12T14:52:25+08:00

    我找到了解决方案。因为我想操作 VLAN,所以我必须使用网桥。VLAN 在 OSI 第 2 层上工作,网桥是可以处理第 2 层协议的设备。所以首先我将两个 VLAN 接口添加到物理接口eth1。然后将所有接口eth0、vlan4和vlan6 添加到网桥。其余的由nftables完成。

    IPv4 和 IPv6 在 layer3 上定义,在 layer 2 上没有不同的含义。因此nftables可以将它们作为具有不同“标记”的数据包处理,这是 IP 标头中的协议类型。幸运的是, nftables可以使用meta protocol {}. 它将传入的未标记 IPv4 和 IPv6 数据包定向到相应的 VLAN 接口。像往常一样由界面自动完成标记。我使用systemd-networkd,这里是详细配置。

    首先创建网络设备vlan4、vlan6和网桥br0:

    ~$ sudo -Es
    ~# cat > /etc/systemd/network/01-vlan4.netdev <<EOF
    [NetDev]
    Name=vlan4
    Kind=vlan
    [VLAN]
    Id=4
    EOF
    
    ~# cat > /etc/systemd/network/02-vlan6.netdev <<EOF
    [NetDev]
    Name=vlan6
    Kind=vlan
    [VLAN]
    Id=6
    EOF
    
    ~# cat > /etc/systemd/network/03-br0.netdev <<EOF
    [NetDev]
    Name=br0
    Kind=bridge
    [Bridge]
    DefaultPVID=6
    VLANProtocol=802.1q
    STP=no
    EOF
    

    然后将接口连接到 eth1 和网桥:

    ~# cat > /etc/systemd/network/12-eth1_attach-vlans.network <<EOF
    [Match]
    Name=eth1
    [Network]
    LLMNR=no
    LinkLocalAddressing=no
    VLAN=vlan4
    VLAN=vlan6
    EOF
    
    ~# cat > /etc/systemd/network/16-ifs_add_to_br0.network <<EOF
    [Match]
    Name=eth0 vlan4 vlan6
    [Network]
    Bridge=br0
    LLMNR=no
    LinkLocalAddressing=no
    EOF
    

    现在只需打开桥:

    ~# cat > /etc/systemd/network/20-br0-up.network <<EOF
    [Match]
    Name=br0
    [Network]
    LLMNR=no
    MulticastDNS=yes
    EOF
    

    重新启动后,这将为您提供:

    ~$ ip -brief address
    lo               UNKNOWN        127.0.0.1/8 ::1/128
    eth0             UP
    br0              UP             2003:d5:2721:900:9012:fdff:fef0:ea7f/64 fe80::9012:fdff:fef0:ea7f/64
    vlan6@eth1       UP
    vlan4@eth1       UP
    eth1             UP
    
    # these are the slave interfaces of the bridge
    ~$ sudo bridge link show
    4: vlan6@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4
    5: vlan4@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4
    6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4
    

    也值得检查resolvectl。现在我们必须做最后一步,并使用以下规则使用nftables重定向数据包:

    ~$ cat /etc/nftables.conf
    #!/usr/sbin/nft -f
    
    flush ruleset
    
    table bridge filter {
        chain forward {
            type filter hook forward priority 0; policy accept;
            meta protocol { ip6 } iifname "vlan4" drop
            meta protocol { ip6 } oifname "vlan4" drop
            meta protocol { ip6 } iifname "vlan6" accept
            meta protocol { ip6 } oifname "vlan6" accept
            iifname "vlan6" drop
            oifname "vlan6" drop
        }
    
        chain output {
            type filter hook output priority 0; policy drop;
            meta protocol { ip6 } iifname "vlan6" accept
            meta protocol { ip6 } oifname "vlan6" accept
        }
    }
    

    在转发链上,这将丢弃所有 IPv6 到/从接口vlan4并且只允许它在接口vlan6上。所有其他的东西都被丢弃在接口vlan6上,但是通过接口vlan4上接受的链默认策略。这确保了所有旧的东西,如 ARP 和其他广播也进入接口vlan4。

    输出链只是为了避免网桥本身将数据包发送到错误的 VLAN。在我的配置中,它仅使用 IPv6(单堆栈),因此链默认策略将删除所有内容,除了 IPv6 到vlan6。

    • 1

相关问题

  • 关闭 FTP

  • 如何在同一台电脑上从 putty 连接 debian vmware

  • debian- 文件到包的映射

  • Debian Ubuntu 网络管理器错误 [关闭]

  • 为本地网络中的名称解析添加自定义 dns 条目

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