iptables做端口映射很简单的一个事情,我之前也写了如何来实现这个咚咚。今天要用到的时候,遇到了问题,写写怎么解决的。
写好SNAT和DNAT相关语句之后,在INPUT、FORWARD和OUTPUT里面针对各个端口都开放了权限,可是就是访问不了,看tcpdump可以看到,SNAT肯定是进行了,因为有对方回来的信息。后来仔细分析了一下整个转换的过程,发现了问题所在。
这里总共涉及到三台电脑,假设A是我们的server,B是中转server,C是希望通过B来访问A的客户端,所以一次完整的请求如下图。
所以呢,以25端口为例,需要开放的端口依次是:
B : INPUT (目标端口25)
B : FORWARD (目标端口25)
B : OUTPUT (目标端口25)
A : INPUT (目标端口25)
--->上面是请求,下面开始回应请求
A : OUTPUT (源端口25)
B : INPUT (源端口25)
B : FORWARD (源端口25)
B : OUTPUT (源端口25)
C : INPUT (源端口25)
如此,一次请求发送过去的时候,所有数据包的目的端口都是25(假设B开放的转发端口也是25),源端口是1024-65535之间的某个数值,反回来所有数据包的源端口都是25,目的端口对应前面的那个端口。 我的问题就是光开放了B的FORWARD的目的端口25,源端口25没有打开,这样数据不能正确返回给C,打开就好了。