Iptables工作原理与实践

Iptables默认有5条链,这些链按照表(table)来进行组织:

表:
	raw			数据跟踪
	mangle		数据表修改
	nat			网络地址转换
	filter		包过滤(用最多)
链:
	prerouting
	input
	forward
	output
	postrouting

表链对应关系:
	raw
		prerouting
		output
		postrouting
	mangle
		prerouting
		input
		forward
		output
		postrouting
        nat
		prerouting
		output
		postrouting
	filter
		input
		forward
                output

链表对应(看上图)

数据包经过的链是在内核空间中进行的。数据包只会经过链,表是提供功能的分类,举例说就是如果要操作地址端口映射,需要操作nat表,nat表只能往prerouting,output,postrouting这三个链上添加规则,如果要操作包过滤,需要操作filter表,filter表只能往input,forward,output的链上添加规则。

比如这里都往output链上添加了规则,就需要区分优先级,规则总是根据表定位链然后往链上附加规则的,所以规则是属于什么链和什么表是已知的。按照表优先级:raw – manage – nat – filter,所以通过nat表添加到output链上的规则,优于通过filter表添加到output链上的规则。

另外,表是根据功能划分的,比如需要操作地址转换,必须通过nat表操作,通过其它表是无法操作(表现为某些命令选项不能用,或者说是某些命令选项是针对特定表的)

数据包进入时会到达内核空间,首先执行prerouting链上的规则,然后判断数据包的目标是否是本机,如果是就进入input链,否则就进入forward链。

# CentOS 7 中关闭默认的firewall防火墙,和iptables冲突
systemctl stop firewalld.service
systemctl disable firewalld.service

# CentOS 7 安装iptables服务
yum install iptables
yum install iptables-services

# CentOS 7 中启动服务 
systemctl start iptables.service
systemctl enable iptables.service

# CentOS 7 以下版本
service iptables restart
chkconfig iptables on

Iptables启动总时会读取/etc/sysconfig/iptables文件,需要注意表的默认策略,可以使用iptables -F刷新所有规则,然后使用iptales-save保存(会在/etc/sysconfig下面产生iptables.old, iptables文件)

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

这是默认配置,INPUT和FORWARD和OUTPUT默认都是ACCEPT,如果修改过就需要注意。后面的中括号表示经过这个链的数据包和字节数。默认的规则是运行已经建立了链接的数据进来,允许icmp协议,允许lo接口数据进来,运行链接22端口,其它的全部禁止。建议先把规则去掉。

命令使用格式:

#格式
iptables -t table command chain parameter target

###########
table
	raw
	mangle
	nat
	filter
command
	-A 在指定链尾巴添加规则(append)
	-D 删除匹配的规则
	-I 在指定位置插入规则(iptables -t filter -I INPUT 1 --dport 80 -j ACCEPT)
	-R 替换匹配的规则
	-L 显示列表规则(--list)
	-n 地址和端口号以数字方式显示
	-F 刷新规则(--flush)
	-Z 将指定链或所有链的计数器清零
	-N 创建自定义链(iptables -N allowed)
	-X 删除自定义链
	-E 更改自定义链的名称(iptables -E allowed disallowed,从什么改为什么)
	-P 修改默认策略(对自定义链不起作用 iptales -P OUTPUT DROP)
chain
	INPUT
	FORWARD
	OUTPUT
	PREROUTING
	POSTROUTING
parameter
	-p	
		TCP
		UDP
		ICMP
		/etc/protocols中定义的列表
		all
	-s
		网络名称
		主机名称
		子网(192.168.0.0/24, 192.168.0.0/255.255.255.0)
		IP地址
	-d
		网络名称
		主机名称
		子网(192.168.0.0/24, 192.168.0.0/255.255.255.0)
		IP地址	
	-i	--匹配入口网卡(只能在PREROUTING INPUT FORWARD)
		接口名称(etho)
		以+结尾的接口名称
	-o	--匹配出口网卡(FORWARD POSTROUTING OUTPUT)
		接口名称(etho)
		以+结尾的接口名称
	--sport
		服务名称
		端口号
		端口范围(1024:65535)
	--dport
		服务名称
		端口号
		端口范围(1024:65535)
	--icmp-type
		ICMP类型(用iptables -p icmp -h可查看)
	--tcp-flags mask xxx
		匹配TCP标记,mask表示检查范围,xxx表示匹配mask中的哪些标记
		(iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT)
target
	-j ACCEPT
	-j DROP
	-j REJECT
	-j REDIRECT 目标端口转换(iptables -t nat -D PREROUTING -p tcp -dport 8080 -i eth2.2 -j REDIRECT -to 80)
	-j MASQUERADE
	-j LOG 
	-j DNAT 目标地址转换 (iptables -t nat -A PREROUTING -d 202.202.202.202 -j DNAT -to-destination 192.168.1.100)
	-j SNAT 源地址转换(iptables -t nat -A POSTROUTING -d 192.168.1.100 -j SNAT -to 192.168.1.1)
	-j MIRROR 
	-j QUEUE 
	-j RETURN 
	-j MARK 将数据包打上标记(iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60)

定义表的链的默认策略
默认策略针对链,也针对表。同样根据优先级来执行。默认测试只有ACCEPT和DROP,可以理解为链中的规则不符合时,执行什么策略(接受或丢弃)。 对应一个链对应对个表的情况,如果默认策略不同,可能遇到问题。默认情况设置的是ACCEPT,而且一般只需要针对filter表中的链进行操作。

iptables -t filter -P INPUT 

使用实例:

#1 显示filter表链与链规则(默认不指定表就是filter表)
iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

# 2 查看NAT表
iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination