ens19接口流量转发至OpenVPN tun0接口失败的技术排查求助
ens19接口流量转发至OpenVPN tun0接口失败的技术排查求助
需求说明
我想要实现一台计算机将内部接口ens19的所有流量转发至OpenVPN接口tun0。系统配置了两个物理接口:
- ens18:连接本地网络,通过Fritzbox接入互联网
- ens19:连接另一自有网络,计划通过tun0走OpenVPN通道
环境配置
我在Proxmox上部署了两台虚拟机:一台Debian 11,一台Ubuntu 22(第一台配置失败后,想排除系统差异问题,两台都作为路由器使用,IP地址不同)。两台虚拟机的基础配置完全一致:
- 安装无GUI的最小化系统及依赖
- 安装必备软件:
apt install iptables openvpn
内核转发配置
已开启IP转发功能,/etc/sysctl.conf中过滤注释后的有效配置如下:
net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1 net.ipv4.conf.all.forwarding = 1 net.ipv4.conf.all.accept_redirects = 1 net.ipv4.conf.all.send_redirects = 1
iptables规则配置
我用脚本配置了iptables规则(已执行生效),脚本内容如下:
#!/bin/bash iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # 以下为实验性规则,已注释 #iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT #iptables -A INPUT -o ens19 -m state --state RELATED,ESTABLISHED -j ACCEPT #iptables -A INPUT -i tun0 -o ens19 -m state --state RELATED,ESTABLISHED -j ACCEPT #iptables -t nat -A PREROUTING -i ens19 -j ACCEPT #iptables -A FORWARD -j ACCEPT #iptables -A FORWARD -i ens19 -j ACCEPT #iptables -t nat -s 192.168.1.0/24 -A POSTROUTING -o tun0 -j MASQUERADE #iptables -t nat -A POSTROUTING -j MASQUERADE iptables -A FORWARD -i ens19 -o tun0 -j ACCEPT iptables -A FORWARD -i tun0 -o ens19 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -i tun0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i tun0 -m state --state New,RELATED,ESTABLISHED -j ACCEPT iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE iptables-save | sudo tee /etc/iptables/rules.v4 exit
当前生效的iptables规则(iptables-save输出)
# Generated by iptables-save v1.8.7 on Tue Jan 9 ... *filter :INPUT ACCEPT [40976:12561334] :FORWARD ACCEPT [32894:54259570] :OUTPUT ACCEPT [32983:2879147] -A INPUT -i tun0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i ens19 -o tun0 -j ACCEPT -A FORWARD -i tun0 -o ens19 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i tun0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT COMMIT # Completed on Tue Jan 9 ... # Generated by iptables-save v1.8.7 on Tue Jan 9 ... *nat :PREROUTING ACCEPT [63033:10635529] :INPUT ACCEPT [6276:710107] :OUTPUT ACCEPT [1569:103282] :POSTROUTING ACCEPT [1156:77777] -A POSTROUTING -o tun0 -j MASQUERADE COMMIT # Completed on Tue Jan 9 ...
OpenVPN服务状态
已启动OpenVPN服务:sudo systemctl start openvpn@openvpn,服务加载的配置文件为/etc/openvpn/openvpn.conf
问题现象
执行测试命令后得到如下结果:
ping web.de -I ens18:正常连通(通过Fritzbox的互联网接口)ping web.de -I ens19:无法连通,但能正常解析到web.de的IP地址ping web.de -I tun0:正常连通(通过OpenVPN接口)
我自己猜测:NAT配置应该是生效的,但ens19到tun0的流量转发环节出了问题。我查了很多论坛的类似解决方案,照着配置后还是没解决,实在搞不懂哪里漏了,求各位帮忙排查!
额外排查信息
路由表(ip route show输出)
0.0.0.0/1 via ***.1 dev tun0 default via 192.168.178.254 dev ens18 proto static ***.0/24 dev tun0 proto kernel scope link src *** 128.0.0.0/1 via <...>.1 dev tun0 *** via 192.168.178.254 dev ens18 192.168.1.0/24 dev ens19 proto kernel scope link src 192.168.1.1 192.168.178.0/24 dev ens18 proto kernel scope link src 192.168.178.6
注:
***为敏感IP地址已隐藏;192.168.178.0是ens18连接的Fritzbox网络,192.168.1.0是ens19连接的自有网络,192.168.1.1是VPN路由器自身IP,192.168.1.254是自有网络指向Fritzbox的网关
路由规则(ip rule show输出)
0: from all lookup local 32766: from all lookup main 32767: from all lookup default
抓包信息
已在独立终端执行sudo tcpdump -i ens19,并同时执行ping web.de -I ens19,抓包记录了ping的完整过程。
备注:内容来源于stack exchange,提问作者kasper2083
相关产品推荐
相关产品推荐

