基本操作
查看iptable版本
1 | rpm -q iptables |
查看iptables 规则
1 | service iptables status |
表
iptables的4个表分别是:
- filter(过滤):数据包过滤/拦截,可以包含INPUT、FORWARD、OUTPUT这3个内置chain。
- nat(地址转换):IP地址或端口号转换,可以包含PREROUTING、OUTPUT、POSTROUTING 3个内置chain,nat table在会话建立时会记录转换的对应关系,同一会话的回包和后续报文会自动地址转换,这是因为nat使用了ip_conntrack模块。
- mangle(包管理):用来修改IP报文,可以包含PREROUTING、OUTPUT、INPUT、FORWARD、POSTROUTING 5个内置chain。
- raw:此表的优先级高于ip_conntrack模块和其它的table,主要用于将有会话状态的连接(比如tcp)的数据包排除在会话外。可以包含POSTROUTING、OUTPUT两个内置chain。
看到这里肯定会有这样的疑问,为什么table只能包含一些而不是全部的chain呢?我想这个构架是按需设计而不是按功能设计的,尽管table不是包含所有的chain,但是每种功能的table都包含了实现这种功能所需的chain,即使包含更多的chain也是累赘或者无用的,而且实际上用起来也的确如此,够用了。
还有就是不同table生效优先顺序问题,先后优先级是这样的:
raw > mangle > nat > filter
所以,如果有filter禁止ping目的地址2.2.2.2,而nat又有策略将目的地址1.1.1.1转换成2.2.2.2,那么ping 1.1.1.1是ping不通的。
不过一般情况下filter是不会和nat的策略打起架来,比如INPUT chain能做filter,却不能做nat,PREROUTING能做nat却不能做filter,而且PREROUTING只能做目的地址转换,不会对源地址过滤的需求造成麻烦,所以通常是不会相互干扰的。
规则链(chain)
iptables内置的5个chain:PREROUTING、INPUT、OUPUT、FORWARD、POSTROUGING,这5个chain分别与netfilter中数据转发路径上的5个不同的位置挂钩,以匹配筛选不同类型的数据流,如下图所示:
其中:
- PREROUTING链:应用于所有进入机器的ip包,包括目的地址是本机和目的地址非本机的包。
- INPUT链:应用于所有目的是本机的包,也就是目的IP是本机接口地址,所有发给本地socket的数据都经过它。
- OUPUT链:应用于所有由本机产生的包,所有应用程序发出的数据都经过它。
- FORWARD链:应用于所有经过路由决策被转发的包,也就是目的地址不是本机的数据包。
- POSTROUGING链:应用于所有发出机器的IP包,包括本机发出的和从本机转发的数据包。
策略匹配按照重上到下的顺序进行,当测试到某策略匹配时执行target并跳出,不再向下匹配,当测试到最后一条策略仍不匹配时,则采用policy指定的动作,如下图:
除了内置chain外,还可以自定义chain,自定义chain并不能利用netfilter的hook来捕捉数据包,但是可用于策略的分类,比如有3类不同的用户访问主机上的不同服务,如果所有策略都放在INPUT chain中策略会多而难以维护,这个时候就可以定义3个自定义chain,分别配置不同的策略,同时在INPUT chain中添加策略对来访者分类并将目标指向3个自定义chain。
自定义chain大显神威的地方在于动态生成策略,例如VPN服务器上,需要对不同分组的用户区别对待管理,但是用户IP是随机分配的,不能根据IP来区分用户组,这时候可以预先定义好各组chain,利用VPN服务端软件的一些钩子,当用户登陆时自动添加策略引导到自定义chain上来匹配。如果这时候没有自定义chain,那么策略的数量将是(用户数×所属组策略数),每增加一个用户,都要把所属组的全部策略添加一遍,这样大量的时间花费在策略匹配上,性能下降很快。
各指令的含义
-APPEND -A
1 | iptables -A chain firewall-rule |
将规则添加到末尾。
一般情况下,iptables 中最后的规则是丢弃所有数据包。
于是使用-A参数添加的规则在丢弃规则后,将不起作用。
-DELETE -D
1 | iptables -D chain firewall-rule |
-INSERT -I
1 | iptables -I chain [rulenum] firewall-rule. |
将firewall-rule添加为chain中的第rulenum条规则,原先的第rulenum条规则及以后的各条顺次+1。如未指定rulenum,则默认为1.
-REPLACE -R
1 | iptables -R chain [rulenum] firewall-rule. |
将firewall-rule添加为chain中的第rulenum条规则,原先的第rulenum条规则及以后的各条顺次+1。如未指定rulenum,则默认为1.
-LIST -L
1 | iptables -L chain [rulenum] firewall-rule. |
列出chain或所有chain的第rulenum条规则或所有规则,在-L后再加上–lube-numbers,则显示序号
-LIST-RULES -S
1 | iptables -S chain [rulenum] |
打印全部规则
-FLUSH -F
1 | iptables -F chain |
情况chain(或全部chain)中的规则
-ZERO -Z
1 | iptables -Z chain [rulenum] |
清空chain或所有chain的包和字节计数器
-NEW -N
1 | iptables -N chain [rulenum] |
创建名称为chain的新链
-DELETE-CHAIN -X
1 | iptables -X [chain] |
删除用户自定义chain或所有用户定义的chain,该指令不影响预设规则
-POLICY -P
1 | iptables -P chain target |
改变chain的策略为target
-RENAME-CHAIN -E
1 | iptables -E old-chain new-chain |
将old-chain名更换为new-chain,使得old-chain的规则失效
各参数的含义
-P 代表协议(PROTOCOL)
- 指明当前规则针对的传输协议(如 TCP、UDP、ICMP 等)
- 可能的参数值有:tcp, udp, icmp, all
- 使用 “all” 表示适用于所有协议。而如果在规则中不指定 -p 参数,则默认使用 “all” 参数。一般不使用 “all” 这个值,要么指定某个特定的协议,要么就指定 -p 参数。
- -p 的参数值既可以用名称(如 tcp)也可以用协议对应的数值(如 6 代表 tcp 协议)
- /etc/protocols 文件中包含了所有允许的协议名称和相应数值
- 也可以用长的参数名 –protocol
-S 代表源地址(SOURCE)
- 指定数据包的源地址
- 可以是 ip 地址,或者网络地址,或者主机名(hostname)
- 例如:-s 192.168.1.101 表示针对特定的 ip 地址
- 对于网络掩码,使用 /mask。例如,“-s 192.168.1.0/24″ 表示网络掩码为 255.255.255.0 的所有 192.168.1.x 地址都匹配。
- 如果不指定 -s 参数,默认匹配所有源地址
- 也可以用长参数名 –src 或者 –source
-D 代表目的地址(DESTINATION)
- 指定数据包的目的地址
- 使用方式与上面的 “-s” 一样(不同之处仅在于 -s 指源,而 -d 表示目的地址)
- 也可以用长参数名 –dst 或者 –destination
-J 代表跳转(TARGET)
- j 的意思是 “jump”(跳转) 到目标
- 指定当某个数据包满足该规则的时候的就跳转到的下一个处理规则,而不再顺序执行后面的规则判断
- 可能的值有:ACCEPT, DROP, QUEUE, RETURN,分别表示接受、丢弃、进入队列,返回(跳出,通常是从某个 chain 中跳回到调用该 chain 的上层 chain)
- 也可以跳转到某个自定义的 chain 中,使用该 chain 的名称做为跳转目标
-I 代表 IN INTERFACE(入站接口)
- i 表示 “input interface”(输入接口,即,指定网络数据处理的网卡,一般 eth0 即表示第一块有线网卡的外网接口,lo 表示局域网接口)
- 可以直接理解为 “-i” 表示接口。不过,-i 和 -o 都表示接口,-i 表示输入时的接口,而 -o 特指输出用的接口。
- 指定数据包进入 INPUT、FORWARD 和 PREROUTING 链时经由的接口。
- 例如:-i eth0 表示该规则应该针对从 eth0 接口进来的数据包。
- 如果不指定 -i 参数,则经由系统中所有可用的接口进入的数据包都可以匹配该规则。
- 也可以使用长参数 –in-interface
-O 代表 OUT INTERFACE(出站接口)
- o 表示 “output interface”(出站经由接口)
- 指定发送出去的数据包进入 INPUT、FORWARD 和 PREROUTING 链时经由的接口。
- 如果不指定 -o 参数,则经由系统中所有可用的接口发出的数据包都可以匹配该规则。
- 也可以使用长参数 –out-interface
其它防火墙参数选项
上面某些防火墙参数还有属于它自己的参数选项,可以与其配合使用。下面是一些常用的选项。
要使用这些参数选项,需要指定相应的参数,例如,要使用 “–sport” 选项,应该在规则中指定 “-p tcp” (或者 “-p udp”)等参数。
注意:所有这些选项前面都是 –(2个短横线 – )。
–SPORT 表示 SOURCE PORT (源端口,用于 -P TCP, 或者 -P UDP)
- 默认匹配所有端口(未特别指定时)
- 可以指定端口号(数字),也可以指定端口名称。例如,默认的 SSH 端口号码为 22,名称为 ssh,可以表示为 “–sport 22″ 或者 “–sport ssh”。
- /etc/services 文件包含了所有允许的端口名称和对应的端口号码。
- 在规则中使用号码比使用名称要好(效率高些)
- 要匹配一个端口范围,使用英文半角冒号(:),如 22:100 匹配从 22 到 100 的所有端口号。
- 也可以使用长名称 –source-port
–DPORT 表示 DESTINATION PORT (目的端口,-P TCP, 或者 -P UDP)
- 与 –sport 的用法相同,区别仅在于对象是目的端口
- 也可以使用长名称 –destination-port
–TCP-FLAGS 表示 TCP FLAGS (用于 -P TCP)
- 可以使用英文半角逗号(,)来指定多个 TCP 状态标识
- 可能值有:SYN, ACK, FIN, RST, URG, PSH。可以全用,也可以不用。
–ICMP-TYPE 表示 ICMP TYPE (ICMP 类型,用于 -P ICMP)
- 当使用 icmp 协议 “-p icmp” 的时候,可以使用 “–icmp-type” 特别指定 ICMP 类型
- 例如,使用 “–icmp-type 0″ 表示 “Echo Reply”,“–icmp-type 8″ 表示 “Echo”。
添加VIP:
1 | ifconfig eth0:1 192.168.1.22 broadcast 192.168.1.2 netmask 255.255.255.0 up |