V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
nealot
V2EX  ›  程序员

如何通过 IPv6 公网 IP 打通多个 IPv4 LAN 网段 (家庭宽带)

  •  
  •   nealot · 2024-02-06 18:43:01 +08:00 · 2920 次点击
    这是一个创建于 380 天前的主题,其中的信息可能已经有所发展或是发生改变。

    IPv4 地址枯竭已经持续很久了。

    说实话,现在有些城市打 10000 号,就能申请到一个 IPv4 公网 IP ,本身就是一件有点神奇的事情。

    有的时候,虽然投诉后立马申请到了,但是过两周电信可能又会偷偷地把地址换成私网 IP 。电信这么做显然不是闲得慌,本质原因依然是 IPv4 地址枯竭。

    楼主此前拿到过多个城市的公网 IPv4 ,然后舒服地 n2n 组网用了很久。但是最近新办的宽带改桥接模式后,发现又是 100.64 网段。再投诉一次固然可以,但是差不多该换个解法了。

    请问如果要实现这样的组网,需要哪些软件和配置呢?

    LAN1 (IPv4) --- R1.IPv6 --- Cloud VM --- R2.IPv6 --- LAN2 (IPv4)
                    R1.IPv4                  R2.IPv4
                       v                       v
                   Internet                 Internet
    

    注 1: 路由器 (R1, R2) 运行的可能是 Ubuntu Server ,也可能是 OpenWRT

    注 2: 路由器的 IPv6 地址专门用于组网,普通流量走 v4 出去 (即使是私网)

    23 条回复    2024-02-11 10:46:04 +08:00
    jiangzhexin
        1
    jiangzhexin  
       2024-02-06 18:49:55 +08:00
    使用 wireguard 在 R1 ,R2 上建立连接就好了,然后做好路由和防火墙放行
    nealot
        2
    nealot  
    OP
       2024-02-06 18:52:35 +08:00
    @jiangzhexin IPv6 地址可能会变

    另外不希望 Cloud VM 负责流量转发
    azure2024us
        3
    azure2024us  
       2024-02-06 18:57:00 +08:00
    描述有些乱。

    告诉你一个方法(使用 haproxy ):

    前提:光猫桥接后,路由器上能获取到 ipv6 。以下以 openwrt 路由为例

    1. iptables 放开端口策略,写入到 /etc/firewall.user

    ip6tables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

    2. 本地 开启一个 haproxy ,实现 ipv6 转 ipv4

    frontend ha_in
    mode tcp
    bind [::]:443
    log global
    option tcplog
    default_backend ha-out

    backend ha-out
    mode tcp
    default-server inter 10s fall 2 rise 2
    option tcp-check
    server ha 192.168.1.2:443 weight 1

    根据需要改 192.168.1.2 ,同一个段,或不同段都行,只有内部网络是互通的就行
    jiangzhexin
        4
    jiangzhexin  
       2024-02-06 18:57:49 +08:00
    写个检测脚本得了,发现不通就 reset endpoint ,虽然不算很优雅,但也算能用不是么
    lovelylain
        5
    lovelylain  
       2024-02-06 19:17:18 +08:00 via Android
    ipv6 ddns ,openwrt 自带一个简单脚本 wireguard_watchdog ,加入 crontab 就行
    @nealot
    hronro
        6
    hronro  
       2024-02-06 19:31:53 +08:00   ❤️ 1
    tailscale + subnet, 如果能 P2P 的话 (两边都有 IPv6 公网 IP 的话应该很容易), 甚至不需要 Cloud VM
    yUp6aXk01XFNpdgh
        7
    yUp6aXk01XFNpdgh  
       2024-02-06 19:35:01 +08:00   ❤️ 1
    Cloud VM 上自建 headscale ,或者直接上 tailscale 也行,路由器侧也对应安装应用。虽然都是基于 wg 上层的实现应用,不过可以 ipv6 直连并且省去 DDNS 的麻烦。剩下搞好路由就可以了。
    nealot
        8
    nealot  
    OP
       2024-02-06 19:38:00 +08:00 via Android
    @lovelylain @jiangzhexin 按我的理解,n2n 属于 peer to peer vpn ,每个节点 (edge) 在协调下,有直连的能力,但是 n2n 的 IPv6 支持比较有限

    wireguard 在实现上,应该不属于 peer to peer vpn 。如果只有两个网络那也还好,但是万一以后扩展成 3 个网络了,那么如果中心节点挂了,那么整个网络都挂了

    (这里假定家庭的环境的供电等各种环境不会那么稳定,同时假定云主机是 99.9% 稳定的)

    是否有现成的 p2p vpn 方案,可以直接支持这种跨 IPv4 / IPv6 的场景呢?
    bobryjosin
        9
    bobryjosin  
       2024-02-06 20:00:36 +08:00   ❤️ 1
    wireguard 可以配成 full mesh ,掉一个也不影响,所有节点都是直连,一个 conf 里面填上所有节点的公钥就可以了。
    bobryjosin
        10
    bobryjosin  
       2024-02-06 20:04:32 +08:00
    如果有很多节点,中心节点,p2p 节点,躲在 nat 后面的混在一起,可以用 ospf ,单个中心节点掉线,依然可以通过其他路由器学习到目标对端的路由。
    mantouboji
        11
    mantouboji  
       2024-02-06 20:21:37 +08:00   ❤️ 1
    P 大的事情。R1 和 R2 之间用 wireguard 建隧道即可。LAN1 和 LAN2 最好不是同一个 IPv4 私有地址网段,比如不要都是 192.168.1.xx ,可以一个是.1 一个是.2 ,方便路由设计。

    R1 和 R2 中的任何一个用 dynv6 、ipv64 之类的免费 ddns 做个动态域名,在另外一端跑个脚本,比如 RouterOS 的 netwatch ,每分钟检测一下隧道通断,断了就重启一下 wg 接口。
    azure2024us
        12
    azure2024us  
       2024-02-06 20:58:51 +08:00
    异地之间,用 wireguard ,stunnel 等,方案很多。

    /t/910055
    azure2024us
        13
    azure2024us  
       2024-02-06 21:04:56 +08:00
    v6 地址 ddns

    /t/853774
    都有现成的方案。

    把主题和问题先描述清楚。
    JerryYuan
        14
    JerryYuan  
       2024-02-06 21:12:30 +08:00 via Android
    @nealot 目前正在用 wireguard+ddns+wireguard_watchdog ,调好以后基本上就没掉过线。wireguard 能搞点对点连接,ddns 帮你记录动态变化的地址,wireguard_watchdog 是个从 openwrt 的 luci-proto-wireguard 里扣出来的脚本,用来定时检测每个 peer 的链路是否还活着,断掉的就强制重新解析然后更新地址。
    这个脚本能实现不重启端口地更新地址恢复链路,恢复其中一个边不影响其他边的链路。

    剩下的就是 11 楼写的,两边用不同的网段,直接 AllowIPs 允许转发都就通了。
    jiangzhexin
        15
    jiangzhexin  
       2024-02-06 22:21:28 +08:00
    @nealot wireguard 并不存在中心服务器,它本身只有 peer 与 peer 连接,属于 p2p VPN ,这取决于你把 peer 之间的连接设计成树状(中心化)还是网状(分布式)的

    任意一个 peer 发现某 peer 掉线,可以 reset endpoint ,此过程会重新解析 endpoint 的 dns ,连接上新的 ip ;掉线 peer 也会自动更新与该 peer 的连接
    rkonfj
        16
    rkonfj  
       2024-02-06 22:33:23 +08:00 via iPhone   ❤️ 1
    首推 tailscale ,
    也可以调研并关注一下我最近开源的 PeerGuard 。
    https://github.com/rkonfj/peerguard

    这样的方案,R1 和 R2 的防火墙 inbound 可以全部禁止,更安全。
    XiLingHost
        17
    XiLingHost  
       2024-02-06 22:38:32 +08:00
    wireguard 甚至可以像 DN42 一样每个子网都做成 peering 然后通过 BGP 或者 OSPF 来进行路由
    nealot
        18
    nealot  
    OP
       2024-02-06 23:10:09 +08:00
    @azure2024us 主题描述加了一些不必要的铺垫,可能重点不太突出。为了方便后面的读者,我重新叙述总结一下。

    ---

    一直以来我都用 n2n + 公网 IPv4 来进行组网。我还用过 OpenVPN ,但没用过其它的。

    本质上,类似 n2n 的 peer to peer vpn 工具,是在物理网络上建了一个 overlay 网络。这个 overlay 网络使用了加密、认证、打洞、转发等技术,方便我们打通多个 LAN 。

    关于 IPv6 ,于是就有两个问题:

    1. overlay 网络是否支持 IPv6
    2. 外层承载网络 (物理网络) 是否支持 IPv6

    我希望能够使用物理的 IPv6 网络,承载内层的 IPv4 payload 。

    n2n 在 IPv4 时代是一个简单且恰好够用的工具,但是不支持 IPv6 https://github.com/ntop/n2n/issues/1116

    于是我发帖询问 "通过 IPv6 公网 IP 打通多个 IPv4 LAN 网段" 比较适合的工具,同时希望避免 "整个网络的可靠性依赖单个宽带实例" 的问题

    看起来,大家集中推荐的是 wireguard 和 tailscale ,并且对于现代化的工具,IPv6 承载 IPv4 完全不是什么问题
    cnbatch
        19
    cnbatch  
       2024-02-07 17:17:36 +08:00
    除了大家提到的那些,其实你原先使用的 OpenVPN 本身就可以做得到。
    OpenVPN 并不是仅限 IPv4 的,实际上 IPv6 也能用。
    nealot
        20
    nealot  
    OP
       2024-02-07 19:51:15 +08:00 via Android
    @cnbatch 如果再仔细分一分,这些工具应该可以分成两类

    1. 没有 ddns 很难处理动态 IP ,或者必需进行流量转发的 vpn
    2. 天生的 p2p vpn ,可以没有任何 ddns ,支持 p2p 直连,但是需要一个协调节点 (不转发)
    flynaj
        21
    flynaj  
       2024-02-11 10:26:11 +08:00 via Android
    zerotier 最简单,性能好,
    flynaj
        22
    flynaj  
       2024-02-11 10:26:41 +08:00 via Android
    wireguard 需要折腾一下,也可以
    flynaj
        23
    flynaj  
       2024-02-11 10:46:04 +08:00 via Android
    zerotier 在后台添加路由
    192.168.100.1 192.168.100.0/24 (LAN)
    192.168.16.0/21 via 192.168.100.16
    192.168.200.1/24 via 192.168.100.200
    192.168.6.0/24 via 192.168.100.6
    192.168.88.0/24 via 192.168.100.8
    这样就连接了 4 个局域网,zerotier 是直连,其它很多软件大部分走的是中转
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5042 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:25 · PVG 17:25 · LAX 01:25 · JFK 04:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.