Iptables 端口转发的一些限制

Iptables 端口转发的一些限制

我有一组服务,我想为其中一个设置基于 IP 的 ACL(白名单),但不为另一个设置。问题似乎出现在服务内部运行在同一个端口(端口 80)上,但我使用网关上的不同端口来访问它们。

网关上的端口 8088 -> 10.0.0.A 上的端口 80(带有 IP 白名单)
网关上的端口 80 -> 10.0.0.B 上的端口 80

我可以按照以下规则使所有内容都打开,从而使其正常工作:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.0.0.B
iptables -A FORWARD -p tcp -i eth0 --dport 80 -j ACCEPT

问题是 FORWARD ACCEPT 规则涵盖了这两个 nat 规则,因为它们似乎基于目标端口(--dport 80),而不是网关上的传入端口(80 vs 8088)。

我不知道如何将 FORWARD 规则重写为两个单独的规则,以便我可以对进入 80 和 8088 网关的连接采取不同的行为。

附加信息:

lsb_release-d
描述:Debian GNU/Linux 7.5(wheezy)
iptables --version
iptables v1.4.14

第一次尝试解决方案 我已经能够分离出一个链并在那里执行路由,但由于以下错误消息,我无法添加 ACL(拒绝)行:

x_tables: ip_tables: REJECT 目标:仅在过滤表中有效,不适用于 nat

以下是我输入的内容:

iptables -t nat -N 白名单
iptables -t nat -A 白名单 -p tcp -j DNAT --to 10.0.0.A:80
iptables -t nat -A 白名单 -s <whatsmyip.org> -j 返回
iptables -t nat -A 白名单 -j REJECT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j 白名单

一切正常,直到第 4 行,nat 中的 REJECT 失败。如果我注释掉 REJECT 行,我可以确认其余逻辑有效,并且端口开放,因为没有被拒绝。

下一步解决方案尝试 在使用正确设置的单独链时,似乎在原始问题上遇到了麻烦。PREROUTING 规则从顶部更改端口似乎仍然导致非 nat ACL 尝试出现问题。ACL 规则无效,端口处于开放状态。

iptables -N 白名单
iptables -A 白名单 -s <whatsmyip.org> -j 返回
iptables -A 白名单 -j REJECT
iptables -A INPUT -i eth0 -p tcp --dport 8088 -j 白名单
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80

解决方案尝试 #3 我尝试先设置白名单,然后在解析白名单后尝试端口重定向。虽然规则已加载,但它没有达到预期的效果,因为流量无法从白名单 IP 到达其预期的目的地。虽然我实际上并不 100% 确定实际的行为是什么。我无法判断流量是否在 iptables 中被拒绝,或者连接是否被接受并推送到端口 8088 上的目的地而没有端口更改?我不确定如何验证端口重定向是否确实已完成。以下是此尝试的规则:

iptables -N 白名单
iptables -A 白名单 -s <whatsmyip.org> -j 返回
iptables -A 白名单 -j REJECT
iptables -A INPUT -i eth0 -p tcp --dport 8088 -j 白名单
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A
iptables -t nat -A OUTPUT -p tcp --dport 8088 -j REDIRECT --to-ports 80

当前状态 未解决。不确定我是否应该看看是否可以找到另一种方法来在白名单之后重定向端口,或者是否有一种简单的方法来确定当前解决方案失败的地方(是通过 8088 转发而不进行 80 重定向,还是只是被阻止了?)

答案1

改变

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80

跳转到实现你的 acls 的用户定义链。例如,

iptables -t nat -N foo
iptables -t nat -A foo --source 192.168.0.0/24 -j RETURN
iptables -t nat -A foo -j REJECT

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j foo

编辑:

iptables -N foo
iptables -A foo --source 192.168.0.0/24 -j RETURN
iptables -A foo -j REJECT
iptables -A INPUT -i eth0 -p tcp --dport 8088 -j foo

您设计数据包过滤时完全忽略正在执行的任何 NAT。

相关内容