假设机器有240e::1 2408::1 2409::1三个不通运营商的v6地址 需要分别连接2001:a 2001:b 2001:c三个落地 那么配置可以参考这个 ```json #!/usr/sbin/nft -f flush ruleset table ip6 nat { chain prerouting { type nat hook prerouting priority -100; policy accept; # 电信入 移动出 同端口 iifname eth0 ip6 daddr 240e::1 tcp dport 8444 dnat to 2001::a iifname eth0 ip6 daddr 240e::1 udp dport 8444 dnat to 2001::a # 电信入 联通出 端口不同推荐手动把地址括起来再加端口 # 要么就要把完整v6地址补全,不能使用::省略中间地址 iifname eth0 ip6 daddr 240e::1 tcp dport 5201 dnat to [2001::b]:55555 iifname eth0 ip6 daddr 240e::1 udp dport 5201 dnat to [2001::b]:55555 # 电信入 电信出 同端口 iifname eth0 ip6 daddr 240e::1 tcp dport 5201 dnat to 2001::c iifname eth0 ip6 daddr 240e::1 udp dport 5201 dnat to 2001::c } chain postrouting { type nat hook postrouting priority 100; policy accept; # a落地使用移动v6作为出口 ip6 daddr 2001::a snat to 2409::1 # b落地使用联通v6作为出口 ip6 daddr 2001::b snat to 2408::1 # c落地使用电信v6作为出口 ip6 daddr 2001::c snat to 240e::1 } } ``` 这里是最简单的转发配置,没有配置任何安全策略,如果有需求请自行查询教程 入口统一使用240e的电信入口,如果需要其他入口可以自己改 debian12网卡默认为eth0,如果配置的是多网卡或者名字不一样需要手动更改 最后需要注意2点,一是入站和落地端口不一致的话的ip地址写法不同,二是针对不同落地需要配置不同的snat地址,,不要手滑改错了 当然还有最重要的一点,防火墙转发v4只能转v4,v6也只能转v6,不要幻想v4转v6或者v6转v4 如果想要性能损失最小的方案解决v4到v6转换,可以尝试两端组一个ip4-in-ip6 tunnel的隧道,然后把v4的入站流量,通过ip6tunnel内网ip转发过去 另一种方案:realm转发更简单直接,可以吃到bbr加成 ```json # 从"[240e::1]:12345"来的数据,转发到"[2001:a]:23456" [[endpoints]] listen = "[240e::1]:12345" remote = "[2001:a]:23456" # 从本地任意ip:12345来的数据,通过[240e::1]转发到"[2001:a]:23456" [[endpoints]] listen = "[::]:12345" remote = "[2001:a]:23456" through = "[240e::1]" # 从"[240e::1]:12345"来的数据,通过[240e::2]转发到"[2001:a]:23456" [[endpoints]] listen = "[240e::1]:64317" remote = "[2001:a]:44555" through = "[240e::2]" ``` 第三种, firewalld也用nftables内核,所以firewalld就能实现了。 ```json firewall-cmd --permanent --add-rich-rule="rule family=ipv6 forward-port protocol=tcp port=监听端口 to-port=落地端口 to-addr=落地ip" firewall-cmd --reload ``` 注意添加masquerade和forward,sysctl.conf中也要开启ipv6转发。 最后编辑:2025年06月24日 ©著作权归作者所有