如何将自建服务器的出口设置为某一VPN?

Surfshark已被封锁,只能自建。但自建只能提供一个位置。想通过这种方式扩展位置。
连接自建服务器(基于 Shadowsocks 和 V2Ray 等代理协议)时,流量往往从主网卡进出(例如,主网卡为 eth0,ip 为 114.5.1.4,客户端连接服务器上网时,客户端会显示公网为 114.5.1.4)。有没有办法实现流量从主网卡进入,转发至VPN网卡再流出?

例如 客户端连接到服务器114.5.1.4,服务器连接到 IP 地址为 191.9.81.0 的 VPN 服务器,114服务器上的shadowsocks收到客户端的请求后将流量转发到 VPN,然后客户端显示 IP 为 191.9. 81.0)

笔者还尝试通过 WG 连接到 WG,但 AllowedIPs 更形而上学,无法转发流量。

事实上,这个问题可以分为两个部分:

1.(Linux)如何连接到 VPN而又不使所有流量都通过 VPN?

2.(Linux)如何配置应用程序以使用特定网卡?

已邀请:

springbreeze 【熟练级】

赞同来自: 小王vpn Biyougong

1. 使用socat 来转发流量,可以实现虽然看上去是连接你自己的VPS,但是其实连接的是VPN服务商的服务器。

举个例子,如果你的VPS的IP是12.34.56.78,那么就可以直接在这个IP地址上指定一个端口号例如4911转发到SurfsharkVPN服务器的地址端口,这样所有连接到 12.34.56.78:4911的数据都会被转发到Surfshark服务器的


socat udp4-LISTEN:4911,fork,reuseaddr udp4:us-lax.prod.surfshark.com:1194


然后,你在自己的OVPN文件里面,把连接的地址从Surfshark服务器的地址端口改成你自己VPS的地址和端口,也就是说原来的连接指令是


remote us-lax.prod.surfshark.com 1194


改成 


remote 12.34.56.78 4911


2. 使用linux的Policy-based route来将某一个网络接口的流量来转发至另一个网络接口,具体的方法可以参见 https://v2ex.com/t/180070


3. 让一个具体的应用程序使用某一个特定的网络接口,似乎不太容易配置。Linux中的网络配置主要是通过地址来匹配不同的规则。


小王vpn 【入门级】 - 开源软件爱好者

赞同来自: ddzlq

虽然我不懂具体操作,但这种“翻阅使用手册”的问题最适合ChatGPT,只要知道一些关键词,它就可以从互联网的犄角旮旯中找到差不多的方法,你甚至可以引导它逐步给你编程一个可用的程序

Sauron 【入门级】

Surfshark最简单的方法是直接用XTLS/Xray-core,比较新的版本支持wireguard出口。


如果用OpenVPN的话可以参考一下步骤:

1. 在 /etc/sysctl 里,修改/添加:

net.ipv4.ip_forward = 1

net.ipv4.tcp_fwmark_accept = 1

net.ipv4.conf.all.rp_filter = 0

其中 .all.rp_filter 那项把 all 换成其他网卡名字的也改掉。

2. 创建路由表和路由规则,执行(假设新表的名字是 200,选用的 fw_mark 是 2):

OIFS=$IFS; IFS=$'\n'; for rule in $(ip route show table main); do eval "ip route add table 200 $rule"; done; IFS=$OIFS;

ip rule add fwmark 2 table 200

3. 创建 iptables 规则,执行(假设要允许 tcp 443 的连接):

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j MARK --set-mark 2

另外记得添加SSH端口对应的规则。


测试的时候建议写个打开openvpn然后sleep、关闭的脚本,要不配置错了ssh就连不上了。


要回复问题请先登录注册