如何将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的流量:
- 在WireGuard服务器的
wg0.conf里,找到对应你这个peer的配置段,修改AllowedIPs,添加10.8.0.0/24:
这样服务器就知道,所有目标是10.8.0.0/24的流量都要转发给你这个peer。[Peer] PublicKey = 你的客户端公钥 AllowedIPs = 10.7.0.2/32, 10.8.0.0/24 - 确保WireGuard服务器也开启了IP转发(和第一步的操作一样)。
- 如果你的目标是让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




