Linux新手求助:PPTP VPN拆分隧道最简快速实现方法
嘿,作为Linux新手能折腾PPTP VPN已经相当不错了!要实现拆分隧道——让特定软件走真实IP、其余流量走VPN,基于进程标记的路由规则绝对是最快最简的方案,不用改一堆复杂配置,咱们一步步来:
咱们给目标软件的流量打个特殊标记,然后让系统把带这个标记的流量导向真实网卡的专属路由表,其他流量还是默认走VPN的ppp0接口。
第一步:确认基础网络信息
先搞清楚你的真实网卡和网关,方便后续配置:- 查看所有网卡:
ip addr—— 找非ppp0的那个(比如eth0、wlan0,带本地IP的就是真实网卡) - 查看VPN连接前的默认网关:
ip route show—— 比如会显示default via 192.168.1.1 dev eth0,这里的192.168.1.1就是真实网关
- 查看所有网卡:
第二步:创建专属路由表
编辑路由表配置文件:sudo nano /etc/iproute2/rt_tables
在文件末尾添加一行:100 direct
(100是路由表的编号,只要没被占用就行;direct是表名,好记就行)第三步:给专属表添加路由规则
替换下面的eth0和192.168.1.1为你自己的真实网卡和网关,执行命令:sudo ip route add default via 192.168.1.1 dev eth0 table direct sudo ip route add 192.168.1.0/24 dev eth0 table direct # 替换成你的本地子网,确保本地访问正常第四步:标记目标软件的流量
假设你想让firefox走真实IP,执行下面的命令给它的流量打标记100:sudo iptables -t mangle -A OUTPUT -p tcp -m owner --execcommand "/usr/bin/firefox" -j MARK --set-mark 100如果软件是用特定用户运行的,也可以用用户ID标记:
sudo iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner 1000 -j MARK --set-mark 100(1000是你的用户ID,用
id命令可以查看)第五步:让标记流量走专属路由表
执行命令把带标记100的流量导向我们创建的direct表:sudo ip rule add fwmark 100 table direct第六步:让配置随VPN自动生效/清理
你已经有/etc/ppp/ip-up.d/vpn-route脚本,把上面第三步到第五步的命令加进去(注意用root权限执行),这样VPN连接时就自动配置好规则。
另外,创建一个断开VPN时清理规则的脚本:sudo nano /etc/ppp/ip-down.d/vpn-route-cleanup,内容如下:#!/bin/sh iptables -t mangle -D OUTPUT -p tcp -m owner --execcommand "/usr/bin/firefox" -j MARK --set-mark 100 ip rule del fwmark 100 table direct然后给脚本加执行权限:
sudo chmod +x /etc/ppp/ip-down.d/vpn-route-cleanup
- 打开firefox访问
https://whatismyip.com,应该显示你的真实IP - 用其他软件(比如终端里的
curl whatismyip.com),应该显示VPN的IP
- 如果软件是sudo运行的,
--execcommand可能需要用绝对路径,或者用--gid-owner指定用户组 - 要给多个软件设置的话,多复制几条iptables的OUTPUT规则就行,标记号保持100不变
- 如果重启后规则消失,把第三步到第五步的命令加到
/etc/rc.local里(如果你的系统支持的话),或者用systemd服务
内容的提问来源于stack exchange,提问作者DeviL54

