Iptables 和 SNAT

Iptables 和 SNAT

我是 iptables 和 NAT 的新手。我的网络设置如下所示

                  linuxbox2 (192.x.y.a)
                          |
(194.160.1.1)             |
linuxbox1(eth1)-------- Switch ----- ftpserver
(192.x.y.b)        

BOX1 和 BOX2 通过交换机进行 VLAN 标记。BOX1 带有 FTP 服务器的 VLAN 标记。因此,BOX2 要想连接到 FTP 服务器,必须通过 BOX1 进行路由,而 BOX1 必须执行 POSTROUTING(SNAT) 并将 FTP 数据包发送到 FTP 服务器。

eth1 接口配置了 2 个 IP 地址:一个公用地址,一个私有地址。

来自 BOX2 的所有流量都路由到 BOX1。我在 BOX1 中的 iptables 设置中添加了以下规则

$IPTABLES -t mangle -A PREROUTING -p tcp --dport 21 -s 192.x.y.a -j ACCEPT
$IPTABLES -t mangle -A FORWARD -p tcp --dport 21 -s 192.x.y.a -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -s 192.x.y.a -p tcp --dport 21 -j SNAT --to-source 194.160.1.1

使用新升级编辑问题

如果我从 BOX2 ping 到 BOX1,则一切正常。如果我尝试对 Ftpserver 执行 ftp,则会调用 BOX1 中 iptables 脚本中的 NAT 表,并且 ftp 不会成功。

如果我在 eth1 上执行 tcpdump,我确实会看到 ftp 数据包从 BOX2 传到 BOX1,但没有数据包从 BOX1 传到 ftpserver。

IP 192.x.y.a.45388 > 10.p.q.r.21(ftpserver): S 1380128644:1380128644(0) 
win 5840 <mss 1460,sackOK,timestamp 16897

0,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。预路由、转发等各种链的计数器显示计数为 3,而 NAT 表中的 POSTROUTING 链显示计数为 1。但 TCPDUMP 没有显示任何数据包离开到 FTPSERVER。

现在,经过一些调整并向 iptables 添加 LOG 支持后,我发现经过 NAT 的数据包被路由到 BOX1 的 ETH0。因此,我修复了路由问题,现在数据包通过 ETH1 离开到 FTPserver,并从 FTPserver 接收到 ETH1 上的数据包。

但新的问题从这里开始。我的 iptables 设置显示 - 仅接受在 IPTABLES 中具有适当规则的数据包 [可能与其他用法相矛盾],否则将被丢弃。

我的疑问是数据包的目标 IP 地址是 BOX1 上存在的 ETH1 的公共 IP 地址。在路由决策节点,数据包是否仍会被接受进行路由,以便继续转发?

我发现路由尚未完成,并且该数据包被视为本地数据包,由于没有适当的规则,因此被丢弃...

我听说连接跟踪机制维护经过 NATting 的数据包的数据。那么数据包的源地址何时转换回原始目标地址?

查看 netfilter 数据包流图以了解更多详情 http://l7-filter.sourceforge.net/PacketFlow.png

注意:我的所有 IPTABLE 规则都应基于 IP 地址而不是接口,因为接口名称可能会发生变化,但 IP 地址可能会发生变化。

答案1

删除上面的三条规则并尝试添加以下规则:

$IPTABLES -t NAT -A POSTROUTING -s 192.x.y.a -j SNAT 192.x.y.b
$IPTABLES -A FORWARD -s 192.x.y.a -J ACCEPT

并输入以下命令:

echo 1 > /proc/sys/net/ipv4/ip_forward

您的防火墙中还应该有类似以下的规则:

$IPTABLES -t FILTER -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

这将处理所有已建立/相关的连接,而不是为每个连接制定规则。

相关内容