我希望所有发往端口 3389 上的主机的 TCP 和 UDP 数据包都被路由到网络上的其他地址。主机是托管这些 iptables 的计算机。
从这个开始,看起来并不那么糟糕,但是,将 TCP 和 UDP 合并为一条规则会更好:
*nat
-A PREROUTING -i ens1 -d 10.58.0.1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 172.20.0.201
-A PREROUTING -i ens1 -d 10.58.0.1 -p udp -m udp --dport 3389 -j DNAT --to-destination 172.20.0.201
COMMIT
但是,大约有 5 个接口需要允许这样做,而其他几个接口则不需要。好的,让我们开始工作吧:
*nat
-A PREROUTING -i ens1 -d 10.58.0.1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 172.20.0.201
-A PREROUTING -i ens1 -d 10.58.0.1 -p udp -m udp --dport 3389 -j DNAT --to-destination 172.20.0.201
-A PREROUTING -i tun0 -d 10.58.0.1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 172.20.0.201
-A PREROUTING -i tun0 -d 10.58.0.1 -p udp -m udp --dport 3389 -j DNAT --to-destination 172.20.0.201
-A PREROUTING -i tun1 -d 10.58.0.1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 172.20.0.201
-A PREROUTING -i tun1 -d 10.58.0.1 -p udp -m udp --dport 3389 -j DNAT --to-destination 172.20.0.201
-A PREROUTING -i tun2 -d 10.58.0.1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 172.20.0.201
-A PREROUTING -i tun2 -d 10.58.0.1 -p udp -m udp --dport 3389 -j DNAT --to-destination 172.20.0.201
-A PREROUTING -i tun3 -d 10.58.0.1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 172.20.0.201
-A PREROUTING -i tun3 -d 10.58.0.1 -p udp -m udp --dport 3389 -j DNAT --to-destination 172.20.0.201
COMMIT
哦,但是等一下,主机有 6 个不同的可能 IP 地址,所以现在我必须重复该规则块 6 次,使用不同的目的地,但实际上它们都指向同一主机。这将总共需要 60 个脆弱条目。一定有更好的方法。
问题:我怎样才能普遍地指代主持人?而不是说:
-d <ip address>
... 无数次地重复这句话,我更愿意说:
-d <catch-all for anything destined to this computer>
在我看来,将此 DNAT 规则应用于 INPUT 链更有意义,但出于我无法理解的原因,INPUT 链似乎只接受 SNAT 规则。因此,除非有人更了解情况,否则我只能陷入 NAT PREROUTING 中。
感谢致敬
答案1
如果你不需要通过传入接口名称来限制流量,那么你可以使用
-A PREROUTING -d 10.58.0.1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 172.20.0.201
-A PREROUTING -d 10.58.0.1 -p udp -m udp --dport 3389 -j DNAT --to-destination 172.20.0.201
然后将其与ipset
特征结合起来,您就只有两条线了。iptables 多个源 IP有关于该ipset
功能的信息。
答案2
看起来有一种方法可以引用所有本地事物,直到我在其他地方偶然遇到它我才知道。
-A PREROUTING -m addrtype --dst-type LOCAL -j DEST-LOCAL
上述规则将重定向所有显然发往 INPUT 链的数据包,这正是我所寻找的。这些数据包现在可以根据它们被发送到的新链重定向到其他地方。本质上,在该 DEST-LOCAL 链中,只有来自允许的接口的数据包才会被接受。