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

我试图确定是否有可能通过特定接口select性地路由来自进程或进程组的IP数据包,而所有其他数据包通过另一个接口进行路由。 也就是说,我希望来自/usr/bin/testapp所有stream量都通过eth1路由,而所有其他数据包都通过eth0 。 这种情况下的报文可以是TCP,UDP,ICMP等,可以由最终用户configuration使用不同的端口。

因为我不能轻易地强制有问题的过程绑定到特定的接口,所以我试图通过路由实现相同的结果。 这可能吗?

—编辑—

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

请注意,通过源/目标端口,用户名/ UID等标记是不够的,因为各种用户可能运行testapp ,他们可能会在他们自己的~/.config/testapp.conf或其他设置不同的端口。 问题是关于过程的过滤。

一个可用的选项,虽然我不知道它是多么有帮助,但是在本地二进制文件中使用基于/bin/(ba|z)?sh的包装。

—编辑—

我指的是在运行现代Linux内核的系统上进行路由,例如4.0或更高版本。 如果iproute2nftablesconntrack和类似工具之外还有软件依赖性,我愿意探索开源解决scheme,尽pipe基本工具是可取的。

您通过eth1或eth0路由数据包。 表格mangle应该解决这个问题。 为此,我必须标记数据包并设置处理规则。 首先,添加一个规则,使内核路由数据包以2标记

 ip rule add fwmark 2 table 3 

假设网关为10.0.0.1,则添加一个路由以将stream量redirect到另一个接口:

 ip route add default via 10.0.0.1 table 3 

刷新您的路由caching。

 ip route flush cache 

现在,设置一个防火墙规则来标记指定的数据包:

 iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2 

最后,放松反向path源validation。 有些人build议你把它设置为0,但是根据https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt似乎是更好的select。 如果你跳过这个,你会收到数据包(这可以使用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 : http://serverfault.com/questions/345111/iptables-target-to-route-packet-to-specific-interface

您可以使用特定的用户运行进程,并将数据包与iptable的owner扩展相匹配。 一旦匹配,您可以将其标记并用于其他路由表,使用POSTROUTING或任何您可能喜欢的解决scheme。

这篇文章更好的解释了与owner匹配

可悲的是,iptables的扩展手册( http://ipset.netfilter.org/iptables-extensions.man.html )没有说明满足你的要求的模块。

我会build议像MauricioLópez一样。

您可以将目标应用程序设置为或指定给特定的用户或组,以便无论谁最初启动应用程序,它总是以特定用户或组的forms运行:

 adduser specialrouteuser chown specialrouteuser: /usr/bin/testapp chmod +s /usr/bin/testapp 

然后使用iptables owner扩展来匹配特定的UID或GID。

这当然可能会增加其他问题或安全问题。

那么,鉴于你告诉我们:

因为我不能轻易地强制有问题的过程绑定到特定的接口,所以我试图通过路由实现相同的结果。 这可能吗?

我们可以从这一点开始帮助你。 曾经在FreeBSD jail系统调用中出现的目的是为了限制一个进程或一组进程到系统资源上的某个子部分。 特别是,可以指定一个IP地址,这些“孤立”进程将用于他们的networking活动。 那太方便了,我真的很想在Linux上错过这个function。 但是Linux也有一些方法可以实现类似的结果:

  • OpenVZ的
  • LXC

或者,最轻量级将只是手动修补命名空间: https : //unix.stackexchange.com/questions/155446/linux-is-there-handy-way-to-exec-a-program-binding-it-to- IP地址-的select题