V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nealot
V2EX  ›  程序员

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

  •  
  •   nealot · 69 天前 · 2266 次点击
    这是一个创建于 69 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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  
       69 天前
    使用 wireguard 在 R1 ,R2 上建立连接就好了,然后做好路由和防火墙放行
    nealot
        2
    nealot  
    OP
       69 天前
    @jiangzhexin IPv6 地址可能会变

    另外不希望 Cloud VM 负责流量转发
    azure2024us
        3
    azure2024us  
       69 天前
    描述有些乱。

    告诉你一个方法(使用 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  
       69 天前
    写个检测脚本得了,发现不通就 reset endpoint ,虽然不算很优雅,但也算能用不是么
    lovelylain
        5
    lovelylain  
       69 天前 via Android
    ipv6 ddns ,openwrt 自带一个简单脚本 wireguard_watchdog ,加入 crontab 就行
    @nealot
    hronro
        6
    hronro  
       69 天前   ❤️ 1
    tailscale + subnet, 如果能 P2P 的话 (两边都有 IPv6 公网 IP 的话应该很容易), 甚至不需要 Cloud VM
    lixiangwuxian
        7
    lixiangwuxian  
       69 天前   ❤️ 1
    Cloud VM 上自建 headscale ,或者直接上 tailscale 也行,路由器侧也对应安装应用。虽然都是基于 wg 上层的实现应用,不过可以 ipv6 直连并且省去 DDNS 的麻烦。剩下搞好路由就可以了。
    nealot
        8
    nealot  
    OP
       69 天前 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  
       69 天前   ❤️ 1
    wireguard 可以配成 full mesh ,掉一个也不影响,所有节点都是直连,一个 conf 里面填上所有节点的公钥就可以了。
    bobryjosin
        10
    bobryjosin  
       69 天前
    如果有很多节点,中心节点,p2p 节点,躲在 nat 后面的混在一起,可以用 ospf ,单个中心节点掉线,依然可以通过其他路由器学习到目标对端的路由。
    mantouboji
        11
    mantouboji  
       69 天前   ❤️ 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  
       69 天前
    异地之间,用 wireguard ,stunnel 等,方案很多。

    /t/910055
    azure2024us
        13
    azure2024us  
       69 天前
    v6 地址 ddns

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

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

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

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

    这样的方案,R1 和 R2 的防火墙 inbound 可以全部禁止,更安全。
    XiLingHost
        17
    XiLingHost  
       69 天前
    wireguard 甚至可以像 DN42 一样每个子网都做成 peering 然后通过 BGP 或者 OSPF 来进行路由
    nealot
        18
    nealot  
    OP
       69 天前
    @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  
       68 天前
    除了大家提到的那些,其实你原先使用的 OpenVPN 本身就可以做得到。
    OpenVPN 并不是仅限 IPv4 的,实际上 IPv6 也能用。
    nealot
        20
    nealot  
    OP
       68 天前 via Android
    @cnbatch 如果再仔细分一分,这些工具应该可以分成两类

    1. 没有 ddns 很难处理动态 IP ,或者必需进行流量转发的 vpn
    2. 天生的 p2p vpn ,可以没有任何 ddns ,支持 p2p 直连,但是需要一个协调节点 (不转发)
    flynaj
        21
    flynaj  
       64 天前 via Android
    zerotier 最简单,性能好,
    flynaj
        22
    flynaj  
       64 天前 via Android
    wireguard 需要折腾一下,也可以
    flynaj
        23
    flynaj  
       64 天前 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   ·   我们的愿景   ·   实用小工具   ·   1025 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:39 · PVG 06:39 · LAX 15:39 · JFK 18:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.