我是iptables与NAT的新手。 我的networking设置如下所示
linuxbox2 (192.xya) | (194.160.1.1) | linuxbox1(eth1)-------- Switch ----- ftpserver (192.xyb)
BOX1和BOX2通过交换机进行VLAN标记。 BOX1与FTP服务器在VLAN标签中。 因此,BOX2要连接到FTP服务器应该通过BOX1路由,必须做POSTROUTING(SNAT)并将FTP数据包发送到FTP服务器。
eth1接口configuration了2个IP地址一个公共地址和一个私有地址。
所有来自BOX2的stream量都被路由到BOX1。 我在BOX1中的iptables设置中添加了以下规则
$IPTABLES -t mangle -A PREROUTING -p tcp --dport 21 -s 192.xya -j ACCEPT $IPTABLES -t mangle -A FORWARD -p tcp --dport 21 -s 192.xya -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT $IPTABLES -t nat -A POSTROUTING -s 192.xya -p tcp --dport 21 -j SNAT --to-source 194.160.1.1
用新的升级编辑问题
如果我从BOX2 ping到BOX1它工作正常。 如果我尝试执行ftp到FTP服务器,则表示在BOX1中的iptables脚本中的NAT表被调用,并且ftp不成功。
如果我在eth1上执行tcpdump,我会看到从BOX2到BOX1的ftp包,但没有从BOX1到ftpserver的包。
IP 192.xya45388 > 10.pqr21(ftpserver): S 1380128644:1380128644(0) win 5840 <mss 1460,sackOK,timestamp 168970,nop,wscale 2> IP 192.xya45388> 10.pqr21:S 1380128644:1380128644(0)win 5840 IP 192.xya45388> 10.pqr21:S 1380128644:1380128644(0)win 5840
实际上3个数据包从BOX2发送到BOX1。 如prerouting,forward等各种链路的计数器显示为3,而NAT表中的POSTROUTING链显示计数为1,但TCPDUMP不显示任何数据包离开FTPSERVER。
现在经过一些调整,并添加了对iptables的LOG支持后,我发现获得NAT后的数据包路由到BOX1的ETH0。 所以我修好了路由select的东西,现在数据包通过ETH1离开到FTP服务器,并且从FTP服务器接收数据包到ETH1。
但是一个新的问题从这里开始。 我的iptables设置说 – 只有在IPTABLES有适当的规则的数据包被接受[可能是矛盾的其他用法]其他删除。
我的疑问是,数据包的目的IP地址是BOX1上存在的ETH1的公共IP地址。 在路由决策节点,数据包是否仍然可以被路由接受,以便通过转发?
我看到路由没有完成,数据包被认为是本地数据包,因为没有适当的规则,它正在获取删除…
我听说连接跟踪机制维护有关数据包经过NAT的数据..所以,当数据包的源地址转换回原始的目的地址?
检查netfilter数据包stream图像以获取更多信息http://l7-filter.sourceforge.net/PacketFlow.png
注:我所有的IPTABLE规则应该基于IP地址,但不能在接口上,因为接口名称有可能会改变,但在IP地址中。
删除上面的三条规则,并尝试添加:
$IPTABLES -t NAT -A POSTROUTING -s 192.xya -j SNAT 192.xyb $IPTABLES -A FORWARD -s 192.xya -J ACCEPT
然后input以下命令:
echo 1 > /proc/sys/net/ipv4/ip_forward
在防火墙中也应该有类似于以下的规则:
$IPTABLES -t FILTER -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
这将处理所有已build立/相关的连接,而不是为每个连接制定一个规则。