现在有一段时间(我相信在 1.3 版中引入),iptables
' conntrack模块可以跟踪两个虚拟状态,SNAT 和 DNAT:
SNAT 一种虚拟状态,如果原始源地址与回复目标不同,则匹配。DNAT 一个虚拟状态,如果原始目的地与回复源不同,则匹配。
在我的路由器/防火墙主机上,我有一些 SNAT 规则,如下所示:
# SNAT
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -s $FROM_IP -d $TO_IP -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -d $FROM_IP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o $TO_IFACE -s $FROM_IP -d $TO_IP -j SNAT --to-source $SNAT_IP
# DNAT
iptables -t nat -A PREROUTING -i $FROM_IFACE -d $FROM_IP -p $PROTO --dport $PORT -j DNAT --to-destination $TO_IP
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -d $TO_IP -p $PROTO --dport $PORT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
经过一番谷歌搜索后,我找不到任何iptables
使用这些“新”SNAT
或DNAT
状态的规则示例,但我还是尝试ESTABLISHED,RELATED
用SNAT
or替换DNAT
,如下所示:
# SNAT
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -s $FROM_IP -d $TO_IP -m conntrack --ctstate NEW,SNAT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -d $FROM_IP -m conntrack --ctstate SNAT -j ACCEPT
iptables -t nat -A POSTROUTING -o $TO_IFACE -s $FROM_IP -d $TO_IP -j SNAT --to-source $SNAT_IP
# DNAT
iptables -t nat -A PREROUTING -i $FROM_IFACE -d $FROM_IP -p $PROTO --dport $PORT -j DNAT --to-destination $TO_IP
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -d $TO_IP -p $PROTO --dport $PORT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -m conntrack --ctstate DNAT -j ACCEPT
它似乎有效,而且这种方法至少有一个我注意到的好处:我的防火墙曾经丢弃从我的内部主机到 Internet 的 RST 数据包(因为它们处于。INVALID
状态),但是使用这种新方法,它们被允许通过
不幸的是,虽然方便,但我不确定这种方法是否真的合适,因为我对网络的理论知识不足以理解它是否过于宽松(即允许来自我的局域网外部的一些不需要的数据包到达内部)。
我想我的问题可以这样写:一个数据包可以有SNAT
orDNAT
状态,而没有ESTABLISHED
orRELATED
状态(显然,第一个有NEW
状态的数据包除外)?
注意:我试图记录这样的数据包,但据我所知这是不可能的,因为iptables
只接受一个--ctstate
选项,并且!
不能在其中使用(换句话说,我不能说,或者至少找不到方法来比如说,“记录有SNAT
状态但没有ESTABLISHED
状态的数据包RELATED
”)。如果有另一种我没有想到的记录它们的方法,这也将非常受欢迎。
编辑 1:经过反复试验,我意识到我错了(因此是描边文本):一些数据包仍处于状态INVALID
,因此最终被丢弃。
编辑 2:如果使用SNAT
/DNAT
代替ESTABLISH,RELATED
不安全,请提供一些具体示例,说明数据包可能处于前一种状态而不处于后一种状态。