iptables端口映射配置

之前做了个简单的SMTP应用,为了安全起见,不想用ROOT用户来跑,所以就不能用25端口了,只能在1000以上随便找了一个。为了能收到邮件,就在shorewall里做了一个端口映射。

后来因为换了服务商,重做系统的时候就没有用shorewall——虽然shorewall在某些配置上挺方便,但是对于一些特殊的配置就很麻烦,因为资料不如iptables多,所以就换回iptables。

但是iptables配置端口映射花了很多时间,因为中文网络里的资料大多错误,根本配不通。

我的iptables基本配置有这些内容:

...
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
...
-A INPUT -j DROP
-A FORWARD -j DROP
-A OUTPUT -j ACCEPT
...

大部文档都说只要加一句即可:

基于IP的:
-A PREROUTING -d xxx.xxx.xxx.xxx -p tcp -m tcp --dport 25 -j DNAT --to-destination 127.0.0.1:xxxx
或基于网卡的:
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25 -j DNAT --to-destination 127.0.0.1:xxxx

但我试了不通,又试了一堆其它的,比如加一个POSTROUTING的SNAT,或是其它五花八门的配置,都不行。

经过多方尝试以后才找到,需要加上这么一条(基于网卡):

-A INPUT -m state --state NEW -i eth0 -p tcp -m tcp --dport xxxx -j ACCEPT

推送到[go4pro.org]