因为我无法轻易强制有问题的进程绑定到特定接口,所以我试图通过路由实现相同的结果.这可能吗?
—编辑—
通过这里以及许多其他地方的有用建议,是基于UID标记数据包;这不是真正的目标.目标是根据流程标记/过滤/路由,无论用户如何.也就是说,如果alice,bob和charlie都运行自己的/usr/bin/testapp实例;来自所有三个实例的所有数据包都应通过eth1,而来自系统的所有其他数据包应通过eth0.
请注意,由源/目标端口,用户名/ UID等标记是不够的,因为各种用户可能运行testapp,他们可能在自己的〜/ .config / testapp.conf或其他任何设置不同的端口.问题是关于按流程过滤.
一个可用的选项,虽然我不知道它有多么有用,但是在本机二进制文件周围使用/ bin /(ba | z)?sh-wrap包装器.
—编辑—
我指的是运行现代Linux内核的系统上的路由,比如4.0或更高.如果除了iproute2,nftables,conntrack和类似工具之外还有软件依赖,我愿意探索开源解决方案,尽管基本工具更受欢迎.
解决方法
为此,我必须标记数据包并设置处理它的规则.首先,添加一条规则,使内核路由通过表标记为2的数据包
ip rule add fwmark 2 table 3
假设网关为10.0.0.1,添加通过不同接口重定向流量的路由:
ip route add default via 10.0.0.1 table 3
刷新路由缓存.
ip route flush cache
现在,设置用于标记指定数据包的防火墙规则:
iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2
最后,放松反向路径源验证.有人建议你把它设置为0,但根据https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt,2似乎是更好的选择.如果你跳过这个,你将收到数据包(这可以使用tcpdump -i tap0 -n确认),但数据包不被接受.更改设置以使数据包被接受的命令:
sysctl -w net.ipv4.conf.tap0.rp_filter=2
参考:http://serverfault.com/questions/345111/iptables-target-to-route-packet-to-specific-interface