iptables讲解

  • 1.iptables前言
  • 1.1 iptables与netfilter
  • ①.iptables与netfilter联系
  • ②.netfilter模块
  • ③.iptables规则:
  • 1.2 四表五链讲解。
  • ①.iptables的数据传输过程:
  • ②.四表五链介绍
  • ③.优先顺序
  • 2.iptables用法
  • 2.1 iptables命令用法
  • 3.iptables练习
  • 4.有关iptables的认识
  • 5.关于设置iptables时的建议
  • 6.小问题


1.iptables前言

1.1 iptables与netfilter

①.iptables与netfilter联系

iptables是Linux的防火墙管理工具而已,位于/sbin/iptables;真正实现防火墙功能的是Netfilter,它是Linux内核中实现包过滤的内部结构。我们配置了iptables规则后Netfilter通过这些规则来进行防火墙过滤等操作。

②.netfilter模块

Netfilter模块:它是主要的工作模块,位于内核中,在网络层的五个位置(也就是防火墙四表五链中的五链)注册了一些钩子函数,用来抓取数据包;把数据包的信息拿出来匹配各个各个链位置在对应表中的规则:匹配之后,进行相应的处理ACCEPT、DROP等等。

  下面这张图很明了的说明了Netfilter和iptables之间的关系

  

centos7 配置iptables 启动失败 centos6.5 iptables_linux

③.iptables规则:

解释1:规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规 则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的 主要工作就是添加、修改和删除这些规则。
解释2

根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作做出处理。
	匹配条件:默认为与条件,同时满足。
		基本匹配:IP,端口,TCP的flags(SYN,ACK等)
		扩展匹配:通过复杂高级功能匹配
	处理动作:称为target,跳转目标
		内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG...
		自定义处理动作:自定义chain,利用分类管理复杂情形。

规则要添加在链上,才生效;添加在自定义链上不会自动生效。
链chain:

内置链:每个内置链对应于一个钩子函数。
自定义链:用于内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效。

1.2 四表五链讲解。

①.iptables的数据传输过程:

centos7 配置iptables 启动失败 centos6.5 iptables_linux_02


如图:数据包传输

① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。

② 如果数据包就是进入本机的,它就会沿着图向上移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它,然后处理它。

③本机上运行的程序可以发送数据包,这些新的数据包(响应包/请求包)会经过OUTPUT链,然后到达POSTROUTING链输出。

④ 如果数据包的目的地址不是本机,是要转发出去的,且内核允许转发,数据包就会通过PREOUTPUT链后继续向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

注意:

通过进程处理过的包,从OUTPUT发出的响应包或请求包是新包。

而从FORWARD链通过的数据包还是原来由PREROUTING链传来的数据包,不曾改变。

②.四表五链介绍

表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

四表名称及用途:

  • filter表:过滤数据包
  • nat表:用于网络地址转换(IP、端口)
  • mangle表:修改数据包的服务类型、TTL、并且可以配置路由实现QOS
  • raw表:决定数据包是否被状态跟踪机制处理

五链名称及用途:

  • INPUT链:进来的数据包应用此规则链中的策略
  • OUTPUT链:外出的数据包应用此规则链中的策略
  • FORWARD链:转发数据包时应用此规则链中的策略
  • PREROUTING链:对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
  • POSTROUTING链:对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)

③.优先顺序

规则表之间的优先顺序:
raw表—mangle表—nat表—filter表
规则链之间的优先顺序:

  • 第一种情况:入站数据流向
    从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包
    的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通
    过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
  • 第二冲情况:转发数据流向
    来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网
    关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地
    址等)进行处理。
  • 第三种情况:出站数据流向
    防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

2.iptables用法

2.1 iptables命令用法

#iptables [-t table] command chain [匹配条件] -j 动作/策略

`table:`
	raw,mangle,nat,filter四表;默认表为filter
`command:`
	1.链管理
		-P:设置默认策略,对filter表中的链来说,其默认策略有ACCEPT,DROP,REJECT等。
		-N:自定义一条新的规则链
		-X:删除自定义的空的规则链
		-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能删除。
	2.链查看
		-L:列出指定链上的所有规则,本选项需置后。
		-n:以数字格式显示地址和端口号。
		-v:显示详细信息,-vv更详细。
		-x:显示计数器结果的精确值,而非单位转换后的易读值。
		--line-numbers:显示规则的序号。
			常用组合:-vnL,-vvnxL --line-numbers
		-S selected:以iptables-save命令格式显示链上规则。
	3.规则管理
		-A:在规则末尾继续追加新的规则
		-I:插入,指明要插入到的规则的编号,默认为第一条规则。
		-D:删除--》指明规则序号删除,或指明规则本身删除。
		-R:替换指定链上的指定规则编号。
		-F:清空规则链。
		-Z:置零。		
			iptables的每条规则都有两个计数器
				(1)匹配到的报文的个数。
				(2)匹配到的所有报文的大小之和。
`chain:`
	PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING,及自定义链。
`匹配条件:`
匹配条件分为基本的匹配条件和扩展的匹配条件,而扩展的匹配条件又分为隐式扩展和显示扩展。
	'基本的匹配条件:无需加载模块,由iptables/netfilter自行提供'
		[!] -s:源IP地址或范围(--source address)
		[!] -d:目标地址或范围(--destination address)
		[!] -p:指定协议,可使用数字如0(all)
			协议protpcol:tcp,udp,icmp,icmpv6,udplite,esp,ah,sctp,或all,协议可查看文件/etc/protocols文件。
		[!] -i:报文流入的接口;只能应用于数据报文的流入环节,只应用于INPUT,FORWARD,PREROUTING链。(--in-interface name)
		[!] -o:报文流出的接口;只能应用于数据报文流出环节,只应用于FORWARD,OUTPUT,POSTROUTING链。(--out-interface name)
	'扩展的匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so)方可生效。'
		查看帮助:#man iptables-extensions
		(#rpm -ql iptables可查看其扩展模块文件列表)
		(1)'隐式扩展':在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块。
			tcp协议的扩展选项:
				[!]--source-port,--sport port:匹配报文源端口,可为端口范围,不支持多个不连续的端口。
				[!]--destination-port,--dport port:匹配报文目标端口,可为端口范围。不支持多个不连续的端口。
				[!]--tcp-flags mask  comp
					mask:需检查的标志位列表,用,分隔
						如:SYN,ACK,FIN,RST
					comp在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔。
						示例:
							--tcp-flags SYN,ACK,FIN,RST SYN  :表示要检查的标志位为SYN,ACK,FIN,RST  ,其中SYN标志位必须为1,其余的三个标志位必须为0。
							--tcp-flags SYN,ACK,FIN,RST SYN,ACK  :表示要检查的标志位为SYN,ACK,FIN,RST  ,其中SYN,ACK标志位必须为1,其余的两个标志位必须为0。
							--tcp-flags ALL ALL :表示要检查全部标志位,且所有标志位必须都为1。
							--tcp-flags ALL NONE:表示要检查全部标志位,且所有标志位必须都为0。
				[!] --syn:用于匹配第一次握手
						相当于--》 --tcp-flags SYN,ACK,FIN,RST  SYN
			udp协议的扩展选项:
				[!]--source-port,--sport port:匹配报文源端口,可为端口范围,不支持多个不连续的端口。
				[!]--destination-port,--dport port:匹配报文目标端口,可为端口范围。不支持多个不连续的端口。
			icmp协议的扩展选项:
				[!]--icmp-type  num (可以百度查看icmp包的代码号)
					num--》8:表示icmp的应答包。
					num--》0:表示icmp的请求包。
		(2)'显式扩展':必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块。
			[-m matchname [per-match-options]]
			使用帮助:
				Centos6:#man iptables
				Centos7:#man iptables-extensions
				'常用模块介绍':
					1.mac扩展
						指明原MAC地址,使用于PREROUTING,FORWARD,INPUT链
						[!] --mac-source XX:XX:XX:XX:XX:XX
						示例:追加规则--》在INPUT链匹配源地址为172.16.0.100,源mac地址为00:50:56:21:12:45的数据包,动作为接受。
						#iptables -A INPUT  -s 172.16.0.100 -m mac --mac-source 00:50:56:21:12:45  -j  ACCEPT
					2.iprange扩展
						指明连续的(但一般不是整个网络)ip地址范围
						[!] --src-range ip-ip  :源IP地址范围
						[!] --dst-range ip-ip  :目标IP地址范围
						示例:追加规则--》在INPUT链匹配源地址为172.16.1.100,协议为tcp,目的端口为80,目标地址范围为172.16.1.5-172.16.1.10的数据包,动作为丢包处理。
						#iptables  -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10  -j DROP
					3.multiport扩展模块
						以离散方式定义多端口匹配,最多指定15个端口。
						[!] --sport port,port/port:port/... 指定多个源端口
						[!] --dport port,port/port:port/... 指定多个目标端口
						[!] --ports port,port/port:port/...多个源或目标端口
						示例:追加规则--》在INPUT链匹配源地址为192.18.0.0/16网段,目标地址为192.168.10.1,协议为tcp,端口为20,21,22,80的数据包,动作为接受。
						#iptables -A INPUT -s 192.18.0.0/16  -d 192.168.10.1 -p tcp -m multiport  --dport 20:22,80 -j ACCEPT
					4.string扩展
						对报文中的应用层数据做字符串模式匹配检测
						--algo {bm|kmp}:字符串匹配检测算法
							bm:Boyer-Moore
							kmp:Knuth-Pratt-Morris
						--from offest:开始偏移
						--to offest:结束便宜
						[!] --string pattern:要检测的字符串。
						[!] --hex-string pattern :要检测的字符串,16进制格式。
						示例:加规则--》在OUTPUT链匹配源地址为172.16.100.10,目标地址为任何地址,协议为tcp,端口为80,数据包关键字为"google"的数据包,处理动作为拒绝。
						#iptables  -A OUTPUT -s 172.16.100.10 -d 0/0  -p tcp --sport 80 -m string --algo bm --string "google"  -j REJECT					
					5.time扩展
						根据将报文到达的时间与指定的时间范围进行匹配
						--datestart YYYY-MM-DD hh:mm:ss 日期
						--datestop  YYYY-MM-DD hh:mm:ss 日期
						--timestart  hh:mm:ss  时间
						--timestop   hh:mm:Ss  时间
						[!] --monthdays day,day...  每个月的几号
						[!] --weekdays day,day...   每周的星期几
						--kerneltz:内核时区,不建议使用;Centos7系统默认为UTC格式,存在时区误差,需要再次计算与北京相差8小时。#date -u 查看当前UTC时间
						示例:替换规则--》将INPUT链的第三条规则替换为新规则:对周一到周五,时间为早9点到晚6点的数据包,动作为接受。
						#iptables  -R  INPUT 3  -m time   --timestart  01:00:00  --timestop 10:00:00 --weekdays 1,2,3,4,5  -j ACCEPT
					6.connlimit扩展
						根据每客户端IP做并发连接数量匹配,可防止CC(Challenge Collapsar挑战黑洞)攻击
						--connlimit-upto n:连接的数量小于等于n时匹配
						--connlimit-above n :连接的数量大于n时匹配
						通常分别与默认的拒绝或允许策略配合使用
						示例:当与172.16.100.10的ssh连接数大于2时,拒绝多余的连接请求。
						#iptables  -A  INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
					7.limit扩展
						基于收发报文的速率做匹配,也称为令牌桶过滤器。
						--limit rate[/second|/minute|/hour|/day] :限速值/分,秒,小时,天
						--limit-burst number 到达指定数量后开始限速
						示例:到达本机172.16.100.10的icmp应答包数量超过5个时,之后每分钟只允许3个包通过,其余包全部拒绝丢弃。
						#iptables -I INPUT -d 172.16.100.10 -p icmp --imcp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT 
					8.state扩展
						根据“链接追踪机制”去检查连接的状态,较消耗资源。
						已追踪到的并记录下来的连接信息库:/proc/net/nf_conntrack
						调整连接追踪功能所能够容纳的最大连接数量:/proc/sys/net/nf_conntrack_max
						不同的协议的连接追踪时长:/proc/sys/net/netfilter/
						注意:Centos7使用该模块需要先加载模块:#modprobe nf_conntrack
						conntrack机制:追踪本机上的请求和响应之间的关系,状态有以下几种:
							NEW:新发出请求;连接追踪信息库中不存在此连接的相关条目,因此,将其识别为第一次发出的请求。
							ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前的期间内所进行的通信状态。
							RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系(连接有关联,但不是一个通道)。
							INVALID:无效的连接,如flag标记不正确。
							UNTRACKED:未进行追踪的连接,如raw表中关闭追踪。
						[!] --state  state
						示例:接受协议为tcp,目标端口为22,80,目的地址为172.16.1.10的有效连接数据包(请求和应答包都接受)。
						#iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
						示例:接受协议为tcp,源端口为22,80,源地址为172.16.1.10的有效应答数据包。
						#iptables -A OUTPUT -s172.16.1.10 -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

`动作/策略`
	-j targetname
	简单:ACCEPT,DROP
	扩展:REJECT
		 RETURN:返回调用链
		 REDIRECT:端口重定向
		 LOG:记录日志-->非中断target,本身不拒绝和允许,放在拒绝和允许规则前并将日志记录在/var/log/messages系统日志中。
		 	--log-level level  级别:emerg,alert,crit,error,warning,notice,info  or debug;
		 	--log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
		 	示例:对源地址为10.0.10.0/24网段,协议为tcp,目的端口为80,21,22,23,的请求包,动作为记录日志,且日志前缀为"new connections: "。
		 	#iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log prefix "new connections: "
		 MARK:做防火墙标记
		 DNAT:目标地址转换
		 SNAT:源地址转换
		 MASQUERADE:地址伪装
		 .....

3.iptables练习

`1.清空防火墙策略,并查看`
'[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -vnL'
Chain INPUT (policy ACCEPT 6 packets, 364 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4 packets, 368 bytes)
 pkts bytes target     prot opt in     out     source               destination         

`2、设置INPUT链的默认防火墙策略为拒绝。`
'[root@localhost ~]#iptables -P INPUT  DROP  //可设置,未使用
[root@localhost ~]#iptables -A INPUT  -j REJECT //相比上一个拒绝,更倾向于此条策略,其它策略可以向上插入,此条策略用来兜底。'

`3、允许192.168.10.1机器连接本机`
'[root@localhost ~]#iptabes  -I INPUT  -s 192.168.10.1 -j ACCEPT
[root@localhost ~]#iptables -vnL'
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  313 25716 ACCEPT     all  --  *      *       192.168.10.1         0.0.0.0/0           
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 16 packets, 1712 bytes)
 pkts bytes target     prot opt in     out     source               destination         

`4、允许自己ping任何主机,拒绝其它主机Ping本机。`
'[root@localhost ~]#iptables -A OUTPUT    -p icmp --icmp-type 8  -j  ACCEPT
[root@localhost ~]#iptables -A OUTPUT    -p icmp --icmp-type 0  -j  REJECT
[root@localhost ~]#iptables -vnL'
Chain INPUT (policy ACCEPT 2 packets, 168 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  950 81645 ACCEPT     all  --  *      *       192.168.10.1         0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 66 packets, 8544 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    84 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 0 reject-with icmp-port-unreachable 
    1    84 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8 
测试:
'[root@localhost ~]#ping 192.168.10.138  //本机ping192.168.10.138'
PING 192.168.10.138 (192.168.10.138) 56(84) bytes of data.
64 bytes from 192.168.10.138: icmp_seq=1 ttl=64 time=1.36 ms
^C
--- 192.168.10.138 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 835ms
rtt min/avg/max/mdev = 1.368/1.368/1.368/0.000 ms
'[root@localhost ~]# ping 192.168.10.130  //远程主机ping本机192.168.10.130'
PING 192.168.10.130 (192.168.10.130) 56(84) bytes of data.
^C
--- 192.168.10.130 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

`5、除去192.168.10.1主机,禁止其它主机ssh链接,允许192.168.10.138主机ssh连接。`
'[root@localhost ~]#iptables  -A INPUT   -p tcp --dport 22  -j REJECT
[root@localhost ~]#iptables  -I INPUT 2 -s 192.168.10.138 -p tcp --dport 22  -j ACCEPT
[root@localhost ~]#iptables  --line-numbers -vnL'
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1475  126K ACCEPT     all  --  *      *       192.168.10.1         0.0.0.0/0           
2        0     0 ACCEPT     tcp  --  *      *       192.168.10.138       0.0.0.0/0           tcp dpt:22 
3        1    60 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 reject-with icmp-port-unreachable 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 58 packets, 6736 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

`6.创建自定义链使用,然后删除。`
'建立CUSTOM_ICMP自定义链并使用:
[root@localhost ~]#iptables -N CUSTOM_ICMP
[root@localhost ~]#iptables -A CUSTOM_ICMP  -p icmp  --icmp-type 0 ACCEPT
[root@localhost ~]#iptables -A CUSTOM_ICMP  -p icmp  --icmp-type 8 REJECT
[root@localhost ~]#iptables -A OUTPUT  -j CUSTOM_ICMP
[root@localhost ~]#iptables --line-numbers -vnL'
Chain INPUT (policy ACCEPT 2 packets, 478 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1847  159K ACCEPT     all  --  *      *       192.168.10.1         0.0.0.0/0           
2        0     0 ACCEPT     tcp  --  *      *       192.168.10.138       0.0.0.0/0           tcp dpt:22 
3        1    60 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 reject-with icmp-port-unreachable 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 44 packets, 5648 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain CUSTOM_ICMP (0 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8 reject-with icmp-port-unreachable 
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 0 

'[root@localhost ~]#iptables -A OUTPUT -j CUSTOM_ICMP
[root@localhost ~]#iptables --line-number -vnL'
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1982  171K ACCEPT     all  --  *      *       192.168.10.1         0.0.0.0/0           
2        0     0 ACCEPT     tcp  --  *      *       192.168.10.138       0.0.0.0/0           tcp dpt:22 
3        1    60 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 reject-with icmp-port-unreachable 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 34 packets, 3584 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       34  3584 CUSTOM_ICMP  all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain CUSTOM_ICMP (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8 reject-with icmp-port-unreachable 
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 0 
'删除CUSTOM_ICMP自定义链
[root@localhost ~]#iptables -D OUTPUT 1
[root@localhost ~]#iptables -F CUSTOM_ICMP
[root@localhost ~]#iptables -X CUSTOM_ICMP
[root@localhost ~]#iptables -vnL'
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 2130  183K ACCEPT     all  --  *      *       192.168.10.1         0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       192.168.10.138       0.0.0.0/0           tcp dpt:22 
    1    60 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 reject-with icmp-port-unreachable 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 15 packets, 1608 bytes)
 pkts bytes target     prot opt in     out     source               destination

4.有关iptables的认识

1.任何不允许的访问,应该在请求到达时给与拒绝。
2.规则在链接上的次序即为其检查时的生效次序。
3.基于上述,规则优化:

  • ①安全放行所有入站和出站的状态为ESTABLISHED状态连接。
  • ②谨慎放行入站的新请求。
  • ③有特殊目的的限制访问功能,要在放行规之加以拒绝。
  • ④同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理。
  • ⑤不同类的规则(访问不同应用),匹配范围大的放在前面。
  • ⑥应该将那些可由一条规则能够描述的多个规则合并为一条。
  • ⑦设置默认策略,建议白名单(只放行特定连接)
  • ⑴iptables -P ACCEPT/DROP,不建议。
  • ⑵建议在规则的最后定义规则作为默认策略。

4.iptables的规则有效期限
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活时间。
当机器重启时,iptables会重新加载/etc/sysconfig/iptables文件中的规则。
5.保存规则
保存规则到指定的文件。
Centos6:
#service iptables save
将规则覆盖保存至/etc/sysconfig/iptables文件中。

[root@localhost ~]#service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

Centos7:iptables的保存,不是firewalld。
#iptables-save >/指定的路径/文件

5.关于设置iptables时的建议

在编辑修改iptables防火墙时,建议提前备份原/etc/sysconfig/iptables文件,并制定计划任务多久后重新加载iptables,目的是防止在编修iptables策略时/后出错导致无法连接远程服务器。

#cp /etc/sysconfig/iptables  /etc/sysconfig/iptables.bak
如编写脚本:#vim  /root/iptables.sh
#!/bin/bash
cat /etc/sysconfig/iptables.bak   >/etc/sysconfig/iptables
service iptables reload
#chmod 755 /root/iptables.sh
编写crontab计划任务或at一次性计划任务
#crontab -e 
30 * * * * bash /root/iptables.sh

Centos6:
#service iptables restart 或#service iptables reload 会自动从/etc/sysconfig/iptables重新载入规则。
Centos7重新载入预存规则文件中的规则:
#iptables-restore </PATH/FILE
-n:不清楚原有规则
-t:仅分析生成规则集,但不提交。

开机自动重载规则文件中的规则:
⑴用脚本保存iptables命令;让此脚本开机后自动运行/etc/rc.d/rc.local文件中添加脚本路径/PATH/FILE。
⑵用规则文件保存各规则,开机时自动载入此规则文件中的规则/etc/rc.d/rc.local文件添加iptables-restore < /PATH/FILE
⑶自定义Unit File,进行iptables-restore。

6.小问题

1.请简述防火墙策略规则中DROP和REJECT的不同之处。
答:DROP的动作是丢包,不响应;REJECT是拒绝请求,同时向发送方回送拒绝信息。