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

Oli*_*Oli 15 networking iptables

我有一个比较奇怪的问题。我有一个带有两个网络接口的服务器eth0eth1. 每个都连接到不同的网络。每个网络都有一个互联网网关。服务器有各种出站连接:http(服务器上的一些脚本抓取网站)、nfs 客户端、samba 客户端、dns 客户端和电子邮件提取器等等。

由于我不会讨论的原因,我需要将这些出站客户端分开,以便出站 http、nfs、samba 和 dns 流量仅在eth0其他所有内容通过eth1.

我已经阅读了一些谷歌搜索,它看起来iptables是我需要的,但我真的没有任何线索。我只习惯于通过ufw.

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

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

Sha*_*off 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
Run Code Online (Sandbox Code Playgroud)

创建 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
Run Code Online (Sandbox Code Playgroud)

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

现在,为了通过另一个接口路由其他所有内容,我们向标准路由表添加了一条路由。

ip route add default dev eth1
Run Code Online (Sandbox Code Playgroud)

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


Mr *_*unz 5

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

ping -I eth1 8.8.8.8
Run Code Online (Sandbox Code Playgroud)

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

wget --bind-address 10.0.0.1 http://www.google.it/
Run Code Online (Sandbox Code Playgroud)

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

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

首先,您应该阅读有关多个 Internet 连接的本教程。一本好书也是数以千计的 iptables 教程之一,特别是关于, /和.outbound filteringprocesspid filteringport filtering