iptables规则插入与列表显示一致性问题及输出简化参数咨询
iptables规则插入与列表显示一致性问题及输出简化参数咨询
嗨,我之前在自动化iptables规则的时候也碰到过一模一样的困惑,咱们来拆解下这个问题:
为什么会出现/32的差异?
其实这不是iptables的“不一致”问题,而是它的标准化存储逻辑:当你在-d选项后只写单个IPv4地址、不指定子网掩码时,iptables会自动为它补充/32(这是IPv4中单个主机对应的标准子网掩码)。内核在存储这条规则时,就是以带掩码的形式保存的,iptables -S只是忠实地把内核里的规则原样输出出来而已。
有没有iptables参数能让-S输出省略/32?
很遗憾,iptables本身没有直接的参数来修改-S的输出格式,让它自动省略单个IP后的/32。-S(也就是--list-rules)的设计初衷就是输出规范可复用的规则格式,和内核存储的内容完全一致,方便你直接复制这些输出的命令来重新配置iptables。
两个实用的解决思路
方案一:插入规则时主动加上
/32
如果你希望插入的命令和-S的输出完全匹配,可以在添加规则时就手动补上/32,比如:iptables -t nat -A PREROUTING -d $INET_IP/32 -p tcp --dport 80 -j DNAT --to-destination $INNET_IP这样后续用
iptables -S查看时,输出就和你执行的插入命令格式完全一致了,你的Golang校验逻辑也不会因为格式差异误判。方案二:在Golang程序中做解析兼容
要是不想修改插入规则的方式,那可以在解析iptables -S的输出结果时,加一层简单的处理:用正则或者字符串替换,把单个IPv4地址后面的/32去掉,再和你预设的规则模板比对。比如用正则表达式\b(\d+\.\d+\.\d+\.\d+)\/32\b匹配,替换成$1就能实现兼容。
备注:内容来源于stack exchange,提问作者moluzhui
相关产品推荐
相关产品推荐

