最近在看Neutron里路由服务的时候,租户内部网络假如没有独立外网的时候,需要通过router来进行转发,而这里的实现其实是通过iptables来NAT映射出去,这部分NAT用法不是太熟,大部分iptables都是围绕filter来用,因此有必要再了解下iptables的一些基本用法
通常我们都是直接调用iptables命令来修改防火墙规则,可见我们修改规则这部分是工作在用户态当中,这本身也并不是防火墙,只是指明了一些规则,规则修改了之后,内核态中的netfilter会来读取这些规则,进而执行防火墙的责任,而netfilter在TCP/IP协议栈经过的地方,能够实现读取规则
网上比较权威的说法,在内核空间中,iptables选择了五个位置
1:数据包从一个网络接口进来,到另一个网络接口出去 2:数据包从内核流入用户空间的 3:数据包从用户空间流出的 4:进入/离开本机的外网接口 5:进入/离开本机的内网接口
前面三个貌似容易理解,基本上能将路线全部封死了,但在进出口设置了关卡之后还要设置内部关卡,网上有这么一种说法:由于数据包尚未进行路由决策,还不知道数据要走向哪里,所以在进出口是没办法实现数据过滤的,所以要在内核空间里设置转发的关卡,进入用户空间关卡,从用户空间出去的关卡,那么既然他们没什么用,为什么还要设置他们呢,原因是在做NAT和DNAT的时候,目标地址转换必须在路由之前来进行转换,所以必须在外网和内网的接口处进行设置关卡
同时,这五个位置也成为五个规则链,hook functions钩子函数
1:FORWARD(转发) 2:INPUT(数据包入方向) 3:OUTPUT(数据包出方向) 4:PREROUTING(路由前) 5:POSTROUTING(路由后)
因此,任何一个数据包,只要经过了本机,就会经过其中一个链
iptables的规则:
iptables [-t table] COMMAND chain CRETIRIA -j ACTION
这里参数分别:
-t table可以缺省,一般可以指定为三个参数:filter,nat,mangle
1:filter 定义允许或者不允许的 2:nat 定义地址转换的 3:mangle修改报文原数据
而这三个分别对应的链为:
filter:INPUT ,FORWARD ,OUTPUT nat:PREROUTING ,OUTPUT ,POSTROUTING mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
COMMAND:定义管理规则
Commands: Either long or short options are allowed. --append -A chain Append to chain --check -C chain Check for the existence of a rule --delete -D chain Delete matching rule from chain --delete -D chain rulenum Delete rule rulenum (1 = first) from chain --insert -I chain [rulenum] Insert in chain as rulenum (default 1=first) --replace -R chain rulenum Replace rule rulenum (1 = first) in chain --list -L [chain [rulenum]] List the rules in a chain or all chains --list-rules -S [chain [rulenum]] Print the rules in a chain or all chains --flush -F [chain] Delete all rules in chain or all chains --zero -Z [chain [rulenum]] Zero counters in chain or all chains --new -N chain Create a new user-defined chain --delete-chain -X [chain] Delete a user-defined chain --policy -P chain target Change policy on chain to target --rename-chain -E old-chain new-chain Change chain name, (moving any references)
chain:链,也就是指定的规则是在哪个链上来进行操作
CRETIRIA:匹配各种内容,比如-s源IP地址,-d目的IP地址,-p协议,-i网卡流入,-o网卡流出等等
-j ACTION:处理方式,比如ACCEPT,DROP,REJECT
DROP:悄悄丢弃,一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表 REJECT:明示拒绝 ACCEPT:接受 DNAT SNAT MASQUERADE:源地址伪装 REDIRECT:重定向:主要用于实现端口重定向 MARK:打防火墙标记的 RETURN:返回,在自定义链执行完毕后使用返回,来返回原规则链。