如何配置路由使VLAN接口的标记流量转发至tun VPN接口
嘿,我来帮你搞定这个VLAN流量专属走VPN的路由问题!先理清楚你的现有环境:树莓派有三个网络接口——eth0连本地局域网(192.168.100.27/24)、tun0是VPN接口且当前默认路由指向它、eth0.10是VLAN10的网关(192.168.10.1/24),目标是让VLAN10(192.168.10.0/24)的所有流量都强制走tun0,对吧?
下面是一步步的实操配置方案,跟着来就行:
1. 先开启IP转发(必做基础)
树莓派默认没开启IP转发,得先打开,不然没法做路由转发:
- 临时生效(重启后失效):
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效(修改配置文件):
编辑/etc/sysctl.conf,找到net.ipv4.ip_forward=0这行,改成net.ipv4.ip_forward=1,然后执行:
这样重启后也会保持开启状态。sysctl -p
2. 配置策略路由(核心步骤)
普通路由表没法针对特定来源的流量指定路由,所以我们用策略路由来实现精准控制:
2.1 创建专属路由表
先给VLAN10的流量建一个单独的路由表,比如命名为vpnroute:
echo "10 vpnroute" >> /etc/iproute2/rt_tables
这里的10是路由表的编号,只要是没被系统占用的数字就行(你可以看/etc/iproute2/rt_tables里的现有编号避开)。
2.2 给专属路由表添加VPN默认路由
把这个路由表的默认网关指向tun0的VPN网关(你提到的10.0.0.1):
ip route add default via 10.0.0.1 dev tun0 table vpnroute
2.3 添加路由规则,匹配VLAN10流量
让来自VLAN10网段(192.168.10.0/24)的所有流量都使用我们刚创建的vpnroute表:
ip rule add from 192.168.10.0/24 table vpnroute
3. 配置防火墙允许转发
得让iptables允许VLAN10和tun0之间的流量转发:
# 允许从VLAN10到VPN的出站流量 iptables -A FORWARD -i eth0.10 -o tun0 -j ACCEPT # 允许从VPN返回VLAN10的关联/已建立连接的流量 iptables -A FORWARD -i tun0 -o eth0.10 -m state --state RELATED,ESTABLISHED -j ACCEPT
如果用的是nftables,对应调整规则就行,原理一致。
4. 验证配置是否生效
现在你可以在VLAN10的PC上做测试:
- 执行
traceroute 8.8.8.8(或者任意公网IP),看第一跳是不是10.0.0.1(tun0的VPN网关),而不是你本地局域网的网关。 - 在树莓派上查看路由规则和路由表:
ip rule show # 应该能看到我们添加的from 192.168.10.0/24 table vpnroute的规则 ip route show table vpnroute # 应该显示default via 10.0.0.1 dev tun0
5. 处理VPN重连的问题
如果你的VPN断开后重连,tun0的接口信息可能会变化,这时候之前加的路由规则可能失效。你可以写个简单的脚本,让VPN客户端在连接成功后自动重新配置路由:
比如OpenVPN的话,在你的.ovpn配置文件里加一行:
up /etc/openvpn/up-vlan-routes.sh
然后创建/etc/openvpn/up-vlan-routes.sh脚本,内容如下(记得给脚本加执行权限chmod +x /etc/openvpn/up-vlan-routes.sh):
#!/bin/bash # 删除旧的路由规则和路由 ip rule del from 192.168.10.0/24 table vpnroute 2>/dev/null ip route del default table vpnroute 2>/dev/null # 添加新的路由和规则 ip route add default via $route_vpn_gateway dev $dev table vpnroute ip rule add from 192.168.10.0/24 table vpnroute
这样VPN每次连接都会自动更新路由配置了。
备注:内容来源于stack exchange,提问作者Aleksei




