iptables端口转发有一些限制

我有一套服务,我想为其中一个设置基于IP的ACL(白名单),而不是另一个。 这些问题似乎performance为服务在内部在相同的端口上运行(端口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  - 到10.0.0.A:80
 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT  - 到10.0.0.B
 iptables -A FORWARD -p tcp -i eth0 --dport 80 -j ACCEPT

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

我无法弄清楚如何将FORWARD规则改写成2个单独的规则,这样我就可以在80 vs 8088上有不同的连接进入网关的行为。

附加信息:

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

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

  x_tables:ip_tables:REJECT目标:只在过滤表中有效,不是nat 

这是我放在:

  iptables -t nat -N白名单
 iptables -t nat -A白名单-p tcp -j DNAT  - 到10.0.0.A:80
 iptables -t nat -A白名单-s <whatsmyip.org> -j RETURN
 iptables -t nat -A白名单-j拒绝
 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j白名单 

一切工作正常,直到第4行,其中nat内的REJECT失败。 如果我将REJECT行注释掉,我可以确认其余的逻辑工作和端口变得开放,因为没有任何东西被拒绝。

下一步解决scheme尝试在正确设置单独链的同时,似乎正在解决原始问题。 PREROUTING规则更改端口的权利仍然似乎造成非NAT nat ACL尝试的问题。 ACL规则不起作用,端口是开放的。

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

解决scheme尝试#3我尝试设置白名单,然后在白名单解决后尝试端口redirect。 当规则加载时,它没有预期的效果,因为stream量没有从白名单IP到达它的预期目的地。 虽然我实际上不是100%确定实际上是什么行为。 我无法分辨iptables中的stream量是否被拒绝,或者连接是否被接受,并通过端口8088上的目的地而没有更改端口? 我不知道如何validation端口redirect是否实际完成。 这是这个尝试的规则:

  iptables -N白名单
 iptables -A白名单-s <whatsmyip.org> -j返回
 iptables -A白名单-j拒绝
 iptables -A INPUT -i eth0 -p tcp --dport 8088 -j白名单
 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT  - 到10.0.0.A
 iptables -t nat -A OUTPUT -p tcp --dport 8088 -j REDIRECT  - 对端口80 

当前状态未解决。 不确定是否应该查看是否可以find另一种方式来redirect白名单后的端口,或者有一个简单的方法来确定当前的解决scheme失败的地方(通过8088转发没有80redirect,或者它只是简单地受阻?)

更改

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 

你devise你的包过滤,完全忽略你正在做的任何NAT。