用 linux 的网络命名空间功能 +
https://github.com/xjasonlyu/tun2socks +
https://github.com/netblue30/firejail 可以实现:
如果你的 socks 代理端口是本机的 7890 (注意必须是本机的),在本机上执行如下脚本 (这个脚本依赖 tun2socks):
#!/bin/bash
mkdir -p /etc/netns/proxy/
echo nameserver 8.8.8.8 > /etc/netns/proxy/resolv.conf
ip netns add proxy
ip netns exec proxy ip link set lo up
ip link add veth0 type veth peer name eth0 netns proxy
ip addr add 172.16.1.1/24 dev veth0
ip link set veth0 up
ip netns exec proxy ip addr add 172.16.1.2/24 dev eth0
ip netns exec proxy ip link set eth0 up
ip netns exec proxy ip route add default via 172.16.1.1 dev eth0 metric 10
ip netns exec proxy ip tuntap add mode tun dev tun0
ip netns exec proxy ip addr add 198.18.0.1/15 dev tun0
ip netns exec proxy ip link set tun0 up
ip netns exec proxy ip route add default via 198.18.0.1 dev tun0 metric 1
ip netns exec proxy nohup tun2socks -device tun0 -proxy socks5://172.16.1.1:7890 -interface eth0 > /var/log/proxy-tun2socks.log &
然后使用 firejail 来执行应用程序,以下以 vscode 为例:
firejail --noprofile --netns=proxy --quiet code
我平常跑 vscode 和 jetbrains 全家桶都是用这种方式跑的。