Linux下实现指定的命令使用指定路由

Linux下实现指定的命令使用指定路由

解决办法在0x03,前面是废话,可以跳过~

0x01

有些时候需要实现某个进程或者某个命令的流量走非默认的线路,比如做测试或者游戏加速,基于socks协议使用到Windowsproxifier(我不用windows,只是听说了这个东西)或者Linux下的proxychains,但是proxychains只能代理TCP协议的流量,查了很多资料都没有什么可靠的Linux下能代理指定应用UDP流量的工具,所以就只有往网络层想想办法。

0x02

Linux下一神器iptables,查到资料说可以通过pid过滤进程来实施规则,然而这个过滤功能早在2005年就被移除,现在的方式是通过-m owner指定特定的用户或用户组来实现,而且中途切换了用户或用户组会绕过规则,所以我也没用这个方法。
之后在github搜索了一阵子,发现了这个:https://github.com/Intika-Linux-Firewall/App-Route-Jail,简单来说就是让需要运行的程序走设置了fwmark的路由规则,需要root权限,详细用法可以参考这个项目的说明。经过测试,用root权限执行再切换成普通用户以后强制路由会失效,这就导致有些带有特定用户的应用无法使用指定路由,具体代码内容也没去研究。

0x03

上一个方法里面提到了网络命名空间这个概念,加上docker给我的启发,最终找到了以网络命名空间和虚拟网桥来做网络隔离实现的解决办法。
首先使用root权限添加规则如下:

# 新增命名空间和网桥
ip netns add ns10
brctl addbr br10

# 新增veth
ip link add veth-ns10 type veth peer name veth-ns10-br

# 将veth的一端放到netns中
ip link set veth-ns10 netns ns10

# 将veth的另一端连接到网桥
brctl addif br10 veth-ns10-br

#为veth和网桥设置ip
ip -n ns10 addr add local 192.168.10.10/24 dev veth-ns10
ip addr add local 192.168.10.1/24 dev br10

# 启动这些虚拟设备
ip link set br10 up
ip link set veth-ns10-br up
ip -n ns10 link set veth-ns10 up

# 添加路由规则
ip netns exec ns10 ip route add default via 192.168.10.1

# 开启ip转发
sysctl -w net.ipv4.ip_forward=1

# 添加iptables规则,使命netns内的ip可以访问外部网络
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

# 添加路由规则,让netns内的ip走指定路由
ip rule add from 192.168.10.0/24 table 10
ip route add default via [想要的下一跳地址] dev [下一跳所通过的网卡] table 10

这时只需要使用ip netns exec ns10执行指定命令即可,比如:

sudo ip netns exec ns10 curl ip.sb

这种方法是强制隔离,对子进程也有用,所以换用户以后不会影响强制路由:

sudo ip netns exec ns10 su normaluser -c 'curl ip.sb'

或者直接开一个shell

sudo ip netns exec ns10 su normaluser -c zsh

再介绍一个神器firejail,可以这样使用:

firejail --noprofile --netns=ns10 zsh

如果不想修改/etc/resolv.conf,可以设置一个:

firejail --noprofile --netns=ns10 --dns=8.8.8.8 zsh

0x04

这个方案暂时没大的问题,先将就用着吧,如果师傅们有更好的办法不妨沟通交流一下呢。
文采不好,第一次写文章,还请各位师傅批评指导。

你可能感兴趣的:(linux,网络,iptables,namespace)