You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过单个WireGuard连接/IP实现多设备路由的配置求助

通过单个WireGuard连接/IP实现多设备路由的配置求助

我现在遇到个WireGuard配置的难题,想请教大家:

我连了一台自己没法管控的云服务器WireGuard节点,对方只给了我一个可用的连接IP。但我想让多台设备都能通过这个WireGuard连接访问云服务器那边的资源,所以我打算搭一个本地WireGuard服务器(wg0),让所有客户端都连到这个本地wg0,再把wg0的流量转发到我和云服务器连接的WireGuard接口(wg1)上。

我的拓扑大概是这样:本地WG服务器同时运行wg0(对接本地多客户端)和wg1(对接云WG节点),所有客户端先连wg0,再通过本地服务器转发到wg1,最终访问云服务器侧的资源。

现在的情况是:单独用一台设备连wg1是能正常工作的,本地wg0也能正常让多台客户端连上,但就是搞不定wg0到wg1的流量转发。我感觉肯定要用到iptables做NAT配置,但试了好几种方法都没成功,实在摸不着头绪。

我已经在/etc/sysctl.conf里设置了net.ipv4.ip_forward=1,也配置了ufw防火墙的相关规则,但还是不行...


解决方案步骤

别着急,这个场景其实就是典型的**SNAT(源地址转换)**需求——因为云服务器只认你wg1接口的那个IP,所以所有从wg0过来的客户端流量,都需要把源地址改成wg1的IP,才能被云服务器正确处理。下面是具体的配置步骤:

  1. 确认IP转发已经生效
    先确认内核转发确实开了,执行命令:

    sysctl net.ipv4.ip_forward
    

    如果输出是net.ipv4.ip_forward = 1就没问题;要是没生效,执行sysctl -p重新加载配置。

  2. 添加iptables SNAT规则
    假设你的wg0子网是10.0.0.0/24(记得换成你实际的wg0配置网段),wg1的接口IP是10.10.10.2(也就是云服务器给你的那个专属IP),执行这条命令:

    iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o wg1 -j SNAT --to-source 10.10.10.2
    

    这条规则的作用是:所有来自wg0子网的流量,在从wg1接口出去之前,自动把源地址替换成wg1的IP,这样云服务器就只会看到你那个被授权的IP了。

    如果你想让规则重启后也生效,可以用iptables-save保存规则:

    iptables-save > /etc/iptables/rules.v4
    

    不同发行版的持久化方式可能不同,比如Ubuntu可以安装netfilter-persistent服务来自动加载规则。

  3. 调整WireGuard配置细节

    • 本地wg0的配置文件里,给每个客户端分配wg0子网内的独立IP,并且在每个客户端的[Peer]段里加上AllowedIPs = 0.0.0.0/0, ::/0(让客户端的所有流量都走wg0转发)。
    • 本地wg1的配置文件里,AllowedIPs要设置成云服务器侧你需要访问的资源网段,或者直接设为0.0.0.0/0(如果要全流量转发);另外要确保云服务器的WireGuard节点已经把你的wg1 IP加入了它的AllowedIPs列表(这个如果没法改的话,只能确保你这边的wg1配置正确)。
  4. 防火墙(ufw)规则调整
    要允许wg0和wg1之间的流量转发,执行以下命令:

    ufw allow in on wg0 out on wg1
    ufw allow in on wg1 out on wg0
    

    另外,确保ufw本身允许转发:编辑/etc/ufw/sysctl.conf,把net.ipv4.ip_forward=1的注释去掉,然后重启ufw:

    ufw reload
    

测试排查方法

配置完后,用连在wg0上的客户端ping一下云服务器侧的某个已知IP,如果能通就说明转发成功了。要是还是不行,可以用以下方法排查:

  • tcpdump抓包,看看流量有没有走到wg0和wg1接口:
    tcpdump -i wg0 icmp
    tcpdump -i wg1 icmp
    
  • 查看iptables的nat表有没有匹配到规则:
    iptables -t nat -L POSTROUTING -v
    

备注:内容来源于stack exchange,提问作者Frawstcrabs

火山引擎 最新活动