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

如何将Ubuntu机器上tun0接口的所有流量通过wg0接口转发

如何将Ubuntu机器上tun0接口的所有流量通过wg0接口转发

我来帮你理顺这个问题——你想让OpenVPN客户端(tun0,10.8.0.0/24)的所有流量都走WireGuard的wg0接口,之前的尝试出现超时,主要是两个关键点没处理对:SNAT的目标IP错误,以及WireGuard服务器端的路由配置缺失。咱们一步步来解决:

第一步:确保系统开启IP转发

这是流量转发的基础,先确认是否已经启用:

  • 临时生效(重启后失效):
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  • 永久生效:编辑/etc/sysctl.conf,找到net.ipv4.ip_forward这一行,把值改成1,然后执行:
    sysctl -p
    

第二步:修正iptables的NAT规则

你之前的错误是把SNAT的目标设成了WireGuard的子网10.7.0.0,这是无效的——SNAT需要指定wg0接口的具体本地IP(用ip addr show wg0可以查看你的wg0实际地址)。同时要明确指定输出接口是wg0:

替换原来的POSTROUTING规则:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -o wg0 -j SNAT --to-source 你的wg0本地IP

比如如果你的wg0 IP是10.7.0.2,就写成:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -o wg0 -j SNAT --to-source 10.7.0.2

这个规则的作用是:把所有来自tun0子网、非tun0本地的流量,源地址替换成wg0的本地IP,然后从wg0发出去。

第三步:完善FORWARD转发规则

你原来的FORWARD规则已经允许了10.8.0.0/24的流量,但为了更严谨,建议补充双向的状态匹配规则,确保回包能正常回来:

iptables -A FORWARD -i tun0 -o wg0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wg0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

第四步:检查WireGuard服务器端的配置

这是很多人忽略的点——你的WireGuard服务器必须知道如何处理来自10.8.0.0/24的流量:

  1. 在WireGuard服务器的wg0.conf里,找到对应你这个peer的配置段,修改AllowedIPs,添加10.8.0.0/24:
    [Peer]
    PublicKey = 你的客户端公钥
    AllowedIPs = 10.7.0.2/32, 10.8.0.0/24
    
    这样服务器就知道,所有目标是10.8.0.0/24的流量都要转发给你这个peer。
  2. 确保WireGuard服务器也开启了IP转发(和第一步的操作一样)。
  3. 如果你的目标是让tun0的流量通过WireGuard服务器访问互联网,还要在WireGuard服务器上添加NAT规则:
    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o 服务器的外网接口(比如eth0) -j MASQUERADE
    

最后验证配置

应用所有规则后,用iptables-save保存配置,然后从OpenVPN客户端尝试访问外部网站(比如ping 8.8.8.8),同时在你的Ubuntu机器上用tcpdump -i wg0抓包,看看有没有流量通过wg0接口。如果还是有问题,可以检查路由表:

ip route get 8.8.8.8 from 10.8.0.1  # 替换成你的OpenVPN客户端IP

看看返回的路由是不是走wg0接口。

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

火山引擎 最新活动