仅允许某些接口上的某些出站流量


15

我有一个奇怪的问题。我有两个网络接口的服务器eth0eth1。每个都连接到不同的网络。每个网络都有一个互联网网关。服务器具有各种出站连接:http(服务器上的某些脚本抓取网站的脚本),nfs客户端,samba客户端,dns客户端和电子邮件提取程序,仅举几例。

由于我不愿讨论的原因,我需要将这些出站客户端进行拆分,以便仅在eth0其他一切都通过的情况下才请求出站http,nfs,samba和dns流量eth1

我已经阅读了一些Google搜索,看起来似乎iptables是我所需要的,但我真的没有头绪。我只习惯于通过来管理入站防火墙规则ufw

有人可以从一些示例规则开始,然后告诉我如何让系统在启动时采用这些规则吗?理想情况下,无需将我锁定在SSH连接之外(我可以进行物理访问,但我宁愿不这样做)。

编辑如果可以将所有出站流量从一个帐户限制到一个接口,我可以将客户端分为两个用户。在纸上看起来似乎更容易。

Answers:


12

我将设置一个单独的路由表和一个策略,以使用该表路由标记的数据包,并让iptables / netfilter标记某些数据包。

创建一个表: echo 1 known >> /etc/iproute2/rt_tables

创建路由规则(ip命令来自iproute2): ip rule add from all fwmark 1 table known

我们创建了一个名为“ known”的表,并创建了一个路由规则,该规则规定标记等于1的任何数据包都将根据“ known”表进行路由。我只称它为“已知”,因为它用于已知协议的列表-您可以随意命名。现在,我们设置已知表以正确的方式进行路由。

ip route add default dev eth0 table known

创建iptables规则:

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

该示例将NFS端口(111、2049)上的数据包标记为1。我们将此规则添加到“ mangle” iptable中。这与路由表不同,并且不可更改。mangle表专门用于以非NAT的任何方式更改数据包。

现在,要通过其他接口路由其他所有内容,我们向标准路由表添加路由。

ip route add default dev eth1

要真正理解这一点,请阅读LARTC howto的第4和11部分。


嗯,这实际上比我所担心的要简单得多。Linux网络堆栈确实是一只美丽的野兽,不是吗?我给了它一个快速测试,它似乎按预期工作。我通过监视每个接口iftop,它们都显示正确的通信量。非常感谢。
奥利

我不知道iptables或iproute2如何存储其配置。我每次启动都必须启动这些规则吗?
奥利

@Oli重启后确实会清除它们。您可以使用iptables-save和保存和还原规则iptables-restore。如果您使用的是NetworkManager,则可以设置调度程序脚本以自动执行该过程。不幸的是,官方NM页面上没有有关此功能的文档,但是UbuntuArch Linux文档都提到了该功能。
肖恩·高夫

5

好吧,“ 最简单 ”的方法应该是指示单个程序使用特定的接口(或接口的ip。例如:

ping -I eth1 8.8.8.8

指示ping使用eth1作为源接口,而

wget --bind-address 10.0.0.1 http://www.google.it/

指示wget来走throught它具有接口10.0.0.1的IP地址。

老实说,我不知道您所需的所有程序是否可行,但这是减少您需要编写的规则iptablesiproute程序的开始。

首先,您应该阅读有关多个Internet连接的本教程。很好看的也是一个几千 iptables的教程,expecially上,/ 和。outbound filteringprocesspid filteringport filtering


4

正确的方法是将bind()绑定到要用于传出数据包的接口。由于您随后可以使用ip routeip rule命令设置路由,以根据数据包的传出接口控制数据包的路由方式。对于我的示例,我将假定以下网络:

  • eth0:
    • 地址:192.168.0.2/24
    • 默认网关:192.168.0.1
  • eth1:
    • 地址:192.168.1.2/24
    • 默认网关:192.168.1.1

我将创建两个路由表,一个用于eth0的出站流量,称为alternate,另一个用于eth1的表,称为main。路由表main始终存在,并且是routeand ip route命令使用的普通表。大多数人从不处理任何其他表。要创建名为alternate的表,我们将以下行添加到/etc/iproute2/rt_tables

10    alternate

主表的默认优先级为254。生效该路由表的规则由ip rule命令控制。默认情况下,该命令将打印出现有规则的列表,看起来应该像这样:

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

这基本上表示它将在表中查找路由,该表local是内核为本地路由(例如我自己的IP地址)维护的特殊表。然后它将尝试表主表和表默认表。表的默认值通常为空白,因此如果main中没有匹配项,则没有主机路由。首先,让填充表与eth0的规则交替出现。

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

通常,您希望alternate表格看起来与main表格相似。唯一的区别是路由应该不同。如果您确实希望所有NFS,HTTP等流量都通过eth0上的默认网关通过,即使您的流量是发往eth1上的网络的,则您可能不想在上面添加第二行。下一步是添加何时使用此备用路由表的规则:

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

该规则表示,来自192.168.0网络上某个地址的所有流量都将使用alternate路由表而不是普通main表。最后一步是确保所有必须使用的客户端都eth0绑定到该客户端。使用wget,例如set --bind-address=192.168.0.2,对于NFS设置clientaddr=192.168.0.2挂载选项。如果将LibWWW与Perl一起使用,则可以在LWP :: UserAgent中设置localaddr选项以控制其绑定到的本地接口。如果碰巧有一个客户端,您将无法控制绑定,并且编译源也不是一种选择,那么您也许可以使用iptables规则来修改其地址,但这更像是一种技巧,可能无法正常工作。您将需要在nat表或mangle表的PREROUTING链中设置SNAT规则。您仍将需要上面给出的修改后的路由表才能起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.