将基于进程的 IP 流量路由到不同的默认路由/接口

jus*_*ane 6 linux routing iptables process conntrack

我试图确定是否可以通过特定接口有选择地从进程或进程组路由 IP 数据包,而所有其他数据包都通过另一个接口路由。也就是说,我希望所有流量/usr/bin/testapp都通过,eth1而所有其他数据包通过eth0。这种情况下的数据包可以是 TCP、UDP、ICMP 等,并且可以由最终用户配置为使用各种端口。

因为我无法轻松地强制相关进程绑定到特定接口,所以我试图通过路由实现相同的结果。这可能吗?

- - 编辑 - -

通过这里和其他许多地方的一个有用建议,是基于 UID 标记数据包;这并不是真正的目标。目标是基于 process 标记/过滤/路由,而不管 user。也就是说,如果说了,alicebobcharlie所有运行自己的实例/usr/bin/testapp; 来自所有三个实例的所有数据包都应该通过,eth1而来自系统的所有其他数据包都应该通过eth0

请注意,通过源/目标端口、用户名/UID 等进行标记是不够的,因为不同的用户可能会运行testapp并且他们可能会自行设置不同的端口~/.config/testapp.conf或其他任何内容。问题是关于按流程过滤。

一个可用的选项,尽管我不知道它有多大帮助,是/bin/(ba|z)?sh在本机二进制文件周围使用基于 -based 的包装器。

- - 编辑 - -

我指的是在运行现代 Linux 内核(例如 4.0 或更高版本)的系统上进行路由。如果有软件依赖性超越iproute2nftablesconntrack和类似的工具,我愿意探索开源解决方案,但基本工具是优选的。

小智 1

您可以使用特定用户运行该进程,并将数据包与 iptable 的owner扩展名进行匹配。一旦匹配,您可以标记它并将其与另一个路由表、使用POSTROUTING或您可能喜欢的任何解决方案一起使用。

这篇文章更好地解释了与 的数据包匹配owner