iptables根据目的地址redirect多个端口

我有iptables设置select性路由。 在当前configuration中,它检查dst地址是否在特定链中列出,如果不是,则将stream量redirect到在端口1080上处于活动状态的代理端口。

这工作正常与以下设置:

iptables -t nat -N PROXY # Do not redirect iptables -t nat -A PROXY -d external.proxy.address.1 -j RETURN iptables -t nat -A PROXY -d external.proxy.address.2 -j RETURN iptables -t nat -A PROXY -d 211.96.0.0/255.240.0.0 -j RETURN iptables -t nat -A PROXY -d 211.128.0.0/255.128.0.0 -j RETURN iptables -t nat -A PROXY -d 218.0.0.0/255.128.0.0 -j RETURN ... [and many more address] ... # Redirect everything else to the proxy listening on port 1080 iptables -t nat -A PROXY -p tcp -j REDIRECT --to-ports 1080 iptables -t nat -I PREROUTING -p tcp -j PROXY 

如上所述,这对proxy1工作正常,但我试图redirect到目的地10.0.0.15类似的方式到不同的代理(proxy2),在端口1088监听。

我尝试了几种方法来取得成功。

configuration我试过了:

 iptables -t nat -A PROXY -d 10.0.0.15 -j REDIRECT --to-ports 1088 # didn't do anything 

最好的办法是什么(如果可能的话)

你的问题是我认为误解RETURN作用。 https://unix.stackexchange.com/questions/191607/iptables-and-return-target#191614可能会有帮助。

目前,您的PROXY连锁店的工作如下:

  • stream量进入PREROUTING链,你有(作为第一个子句?) iptables -t nat -I PREROUTING -p tcp -j PROXY
  • 这告诉iptables评估你的stream量对PROXY
  • PROXY链表示了两件事之一,基本上是:对于stream量有一个带有RETURN操作的规则,或者不存在,并且iptables -t nat -A PROXY -p tcp -j REDIRECT --to-ports 1080适用。
  • 如果您的stream量与RETURN条目匹配,则iptables将返回PREROUTING链,并计算下一条规则。 看来没有“下一个规则”来做你想做的事情。

问题是这样的: iptables -t nat -A PROXY -d 10.0.0.15 -j REDIRECT --to-ports 1088

你把这个放在PROXY链中,但是你想要这个redirect的所有stream量实际上被configuration为从你的PROXYRETURN (即分出)。

你需要代替上面的行是:

iptables -t nat -A PREROUTING -d 10.0.0.15 -j REDIRECT --to-ports 1088

关键是规则所在的链条 。 在PREROUTING中使用此规则,您的RETURN规则将按预期工作,方法是将匹配的stream量从“默认” PROXY规则iptables -t nat -A PROXY -p tcp -j REDIRECT --to-ports 1080 ,然后返回到PREROUTING ,其中iptables -t nat -A PREROUTING -d 10.0.0.15 -j REDIRECT --to-ports 1088可以应用。