在单网卡环境下配置VPN并访问外网,需要解决路由冲突和流量转发问题,以下是分步解决方案:
基础网络拓扑
- 环境:单物理网卡(如
eth0),需同时处理VPN流量和普通外网访问。 - 问题:VPN默认会覆盖所有流量,导致外网访问被路由到VPN隧道。
解决方案:策略路由(Policy-Based Routing)
通过Linux策略路由,将VPN流量和外网流量分离。
步骤1:配置VPN客户端
假设使用OpenVPN,编辑配置文件(如client.ovpn):
dev tun remote your.vpn.server.comroute-noexec
步骤2:添加VPN特定路由
连接VPN后,手动添加路由:
# 添加VPN服务器的路由(通过原网关) ip route add your.vpn.server.com via 原网关 dev eth0 # 仅将特定流量(如内网)通过VPN隧道 ip route add 10.0.0.0/8 via $VPN_GATEWAY dev tun0
步骤3:配置策略路由
# 创建自定义路由表 echo "200 vpn" >> /etc/iproute2/rt_tables # 添加规则:标记来自VPN的流量 iptables -t mangle -A OUTPUT -o tun0 -j MARK --set-mark 1 # 使用标记的路由表 ip rule add fwmark 1 table vpn ip route add default via $VPN_GATEWAY dev tun0 table vpn # 主路由表保持原外网网关 ip route add default via 原网关 dev eth0
步骤4:启用IP转发(如需NAT)
echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
验证与测试
- 检查路由表:
ip route show table main和ip route show table vpn。 - 测试分流:
curl ifconfig.me # 应显示原外网IP curl --interface tun0 ifconfig.me # 应显示VPN IP
可选优化
- DNS泄漏防护:配置
/etc/resolv.conf使用VPN的DNS或dnsmasq。 - 持久化配置:将路由和iptables规则写入
/etc/network/interfaces或systemd脚本。
常见问题
- VPN断开恢复:添加脚本自动重连并恢复路由。
- 性能瓶颈:单网卡需处理双倍流量,确保带宽足够。
通过策略路由,可实现单网卡环境下VPN与外网流量的共存,根据实际需求调整路由规则和子网范围。








