iptables iptables:包过滤防火墙

firewall:防火墙,隔离工具:工作于主机或网络边缘,对于进出本主机或网络的报文根据事先定义好的检查规则做匹配检测,对于能够被规则所匹配到的报文做出相应处理的组件:
	主机防火墙
	网络防火墙

	入侵检测系统(IDS):

		·网络入侵检测系统  NIDS

		·主机入侵检测系统  HIDS

		对于IDS常用的检测服务有:snort等

	入侵防御系统(IPS),比如蜜罐

		部署一套入侵检测系统是非常麻烦的,因为必须检测网络任意一个位置

		对于IPS常用的检测服务有: tripwire 等

ipfw

ipchains

iptables/netfilter
	framework(内核中的网络报文过滤或处理框架):netfilter
		hook function(钩子函数)
	rule utils(规则管理工具):iptables

表功能:
	filter:过滤,防火墙:
	nat:网络地址转换(network address teanslation)
	mangle:拆解报文,做出修改,封装报文
	raw:关闭nat表上启用的连接追踪机制
链(内置):
	PREOUTING:路由角色发生之前
	INPUT:
	FORWARD:转发
	OUTPUT:
	POSTROUTING:路由角色发生之后

		PREOUTING,POSTROUTING:是tcp/ip协议栈上的功能

流入:PREOUTING --> INPUT
流出:OUTPUT --> POSTROUTING
转发:PREOUTING --> FORWARD --> POSTROUTING

表各功能的分别实现:
	filter:INPUT,FORWARD,OUTPUT
	nat:PREOUTING(DNAT),OUTPUT,POSTROUTING(SNAT)
	mangle:PREOUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
	raw:PREOUTING,OUTPUT

路由发生时刻:
	报文进入本机后
		判断目标主机
	报文发出之前
		判断经由那个接口送往下一跳 	

iptables:四表五链
	添加规则时的考量点:
		(1)要实现那种功能,判断添加在那张表
		(2)报文流经的路径,判断添加在那个链上

	链:链上规则次序,即为检查次序,因此隐含一定的法则	
		(1)同类规则(访问同一应用),匹配范围小的放上面
		(2)不同类规则(访问不同应用),匹配到报文频率较大的放上面
		(3)将那些可由一条规则描述的多个规则合并为一个
		(4)设置默认策略

	功能的优先级次序:raw --> mangle --> nat --> filter

规则:
	组成部分:报文的匹配条件,匹配到之后的处理动作
		匹配条件:根据协议报文特征指定
			基本匹配条件
			扩展匹配条件
		处理动作:
			内建处理机制
			自定义处理机制

		注意:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效

iptables:规则管理工具
	添加、修改、删除、显示等:

	规则和链有计数器:
		pkgs:由规则或链所匹配到的报文的个数
		bytes:由规则或链匹配到的所有报文大小之和

	iptables命令:

       iptables [-t table] {-A|-D} chain rule-specification

       iptables [-t table] -I chain [rulenum] rule-specification

       iptables [-t table] -R chain rulenum rule-specification

       iptables [-t table] -D chain rulenum

       iptables [-t table] -S [chain [rulenum]]

       iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

       iptables [-t table] -N chain

       iptables [-t table] -X [chain]

       iptables [-t table] -P chain target

       iptables [-t table] -E old-chain-name new-chain-name


       iptables [-t table] SUBCOMMAND(子命令) CHAIN(链) CRETERIA(匹配标准) -j TARGET(处理动作)



       -t table 
       		filter,nat,mangle,raw

       	链管理:
       		-F:flush,清空规则链,省略链,表示清空表上的所有的链
       		-N:new,创建新的自定义规则链
       		-X:drop,删除用户自定义的空的规则链
       		-Z:zero,清零,置零规则计数器
       		-P:policy,为指定链设置默认策略:对filter表中的链而言,默认策略通常有ACCEPT,DROP,REJECT;
       		-E:rEname,重命名自定义链,引用计数不为零的自定义链,无法删除,也无法改名

       	规则管理命令
       		-A:aappend,将新规则追加于指定链的尾部
       		-I:insert,讲规则插入至指定链的指定位置
       		-D:delete,删除指定链上的制定规则
       			有两种方式
       				(1)制定匹配条件
       				(2)指定规则编号
       		-R:replace,替换指定链上的制定规则

       	查看:
       		-L:list,列出指定链上的所有规则
       			-n:numberic,以数字格式显示地址和端口号
       			-v:verbose,显示详细信息
       				-vv,-vvv
       			--line-numbers:显示规则编号
       			-x:exactly,显示计数器技术结果的精确值


	    匹配条件
	       	基本匹配:
	       		[!]-s,--src,--source IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围
	       		[!]-d, --dst,--destination IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围
	       		[!]-p, --protocol {tcp|udp|icmp(互联网报文控制协议)}:检查报文中的协议,即IP首部中的proctocols所表示的协议
	       		[!]-i, --in-interface IFACE:数据报文的流入接口,仅能用于PREOUTING,INPUT及FORWARD链上
	       		[!]-o,--out-interface IFACE:数据报文的流出接口,仅能用于FORWARD,OUTPUT及POSTROUTING链上

	       	扩展匹配:-m  macth_name(指明你的扩展名) --spec_options
	       			例如:-m tcp --dport 22
	       		隐式扩展:对-p protocol指明的协议进行扩展,可省略-m选项
	       			-p tcp
	       				--dport(目的端口) PORT[-PORT]: 目标端口,可以是单个端口或连续多个端口
	       				--sport(源端口)PORT[-PORT]
	       				--tcp-flags LIST1 LIST2:检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0;没有在LIST1中指明的,不做检查
	       					SYN,ACK,FIN,RST,PSH,URG

	       				例:	--tcp-flags SYN,ACK,FIN,RST  SYN
	       					--syn:相当于例

	       			-p udp
	       				--dport
	       				--sport

	       			-p icmp
	       				--icmp-type
	       					可用数字表示其类型
	       						0:echo-reply(回送应答)
	       						8:echo-request(请求应答)

	       		显示扩展:必须使用-m选项指定使用的扩展

	    目标:
	    	-j TARGET:jump(跳转)指定的TARGET(目标)
	    		ACCEPT:接受
	    		DROP:丢弃
	    		REJECT:拒绝
	    		RETURN :返回调用链
	    		REDIRECT:端口重定向
	    		LOG:记录日志
	    		MAKE:做防火墙标记
	    		DNAT:目标地址转换
	    		SNAT:源地址转换
	    		MASQUERADE:地址伪装
	    		...
	    		自定义链:由自定义链上的规则进行匹配检查

iptables:

显示扩展:必须显示指明使用的扩展模块(rpm -ql iptables |grep "\.so")

	centos6:man iptables
	centos7:man iptables-extensions

常用:
	1、multiport扩展
		以离散方式定义多端口匹配:最多指定15个端口

		 [!] --source-ports,--sports port[,port|,port:port]...  :指明多个源端口
		 [!] --destination-ports,--dports port[,port|,port:port]...  :指明多个离散的目标端口
		 [!] --ports port[,port|,port:port]...    :既可以匹配源也可以匹配目标


	例子:
		iptables -I INPUT -s 172.16.0.0/24 -d172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCERT
		iptables -I OUTPUT -d 172.16.0.0/24 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCERT

	2、iprange扩展
		指明连续的ip地址范围时使用(但一般是不能扩展为整个网络)

		[!] --src-range from[-to]  :指明连续的IP地址范围
		[!] --dst-range from[-to]  :指明连续的目标IP地址范围

		例子:
			iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.168.100.1-172.16.100.120 -j ACCEPT

			iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange -dst-range 172.168.100.1-172.16.100.120 -j ACCEPT

	3、string扩展
		检查报文中出现的字符串

		--algo {bm|kmp} (指明所要使用的字符串比对算法)
			bm = Boyer-Moore
			kmp = Knuth-Pratt-Morris
		 [!] --string pattern	(从头到尾进行检查)
		 例:
		 	iptables -I OUTPUT -m string --algo bm --string 'moviie' -j REJECT

		 [!] --hex-string pattern   (基于16进制编码以后字符串检查)

	4、time扩展

		--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]   (起始日期)
		--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]     (停止日期 )


		例:(以时间为例)
			iptables -I INPUT -d 172.16.100.8 -p tcp --dport 80 -m time --timestart 14:00 --timestop 16:00 -j REJECT
			根据报文到达的时间与指定的时间范围进行匹配

	5、connlimit扩展
		根据每客户端IP(也可以是地址块)做并发连接数数量匹配

		[!] --connlimit-above n   (对超过的连接数做规则:一般是拒绝)
		[!] --connlimit-upto n    (连接数量小于n:一般是放行)

	6、limit扩展
		基于收发报文的速率做检查:

		令牌桶过滤器:

		--limit rate[/second|/minute|/hour|/day]
		--limit-burst number

	7、state扩展
		根据连接追踪机制,来检查连接件的状态

		调整连接追踪功能所能够容纳的最大连接数量
			/proc/sys/net/nf_conntrack_max

		已经追踪到并记录下的连接:
			/proc/net/nf_conntrack


		不同协议或链接类型追踪的时长
			/porc/sys/net/netfilter/


		可追踪的连接状态:
			NEW:新发出的请求:连接追踪模板中不存此链接相关的信息条目,因此,将其识别为第一次发出的请求
			ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态
			RELATED:相关的连接:如ftp协议的命令链接与数据连接之间的关系
			INVALIED:无法识别的连接
			

		问题:如何开放被动模式的ftp服务

			(1)装载ftp追踪时
				进入:cd /lib/modules/2.6.32-431.el6.x86_64/kernel/net/netfilter/
				手动装载模块:modprobe nf_conntrack_ftp
				查看:lsmod
			(2)放行请求报文
				命令链接:NEW,ESTABLISHED
				数据连接:RELATED,ESTABLISHED

				# iptables -A INPUT -d 192.168.132.186 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
				# iptables -A INPUT -d 192.168.132.186 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
		
			(3)放行响应报文
				ESTABLISHED
				# iptables -A OUTPUT -s 192.168.132.186 -p tcp -m state --state ESTABLISHED -j ACCEPT

	如何保存和重载规则:
		保存规则至指定文件:iptables-save > /PATH/TO/SOMEFILE

		从指定文件重载规则:iptables-restore < /PATH/FROM/SOMEFILE


	centos 6 :
		service iptables save (也可直接保存)
		service iptables restart(重载)

	centos 7 :
		引入了新的iptables前端管理服务工具:firewalld
			firewalld-cmd
			firewalld-config 




iptables:
	
	nat : Network Adress Translation 安全性, 网络层+传输层
	proxy:代理,应用层 


	nat:
		SNAT:只修改请求报文的源地址
		DNAT:只修改请求报文的目标地址


	nat表:
		PREROUTING: DNAT
		OUTPUT:
		POSTROUTING:SNAT

源地址转换:iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j SNAT --to-source 外部IP(ExtIP)
		   iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j MASQUERADE

目标地址转换:iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]


	iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip(nf)_conntrack_max,链接碰到各种状态的超时后就会从表中删除。

	解决方法一般有两个:
	(1)加大ip_conntrack_max的值
		vi /etc/susctl.conf
		net.ipv4.ip_conntrack_max=393216
		net.ipv4..netfilter.ip_conntrack_max=393216
	(2)降低ip_conntrack timeout时间
		vi /etc/sysctl.conf
		net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
		net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
		net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
		net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

		iptables -t nat -L -n

	#补充:利用iptables的recent模块来抵御DOS×××:22,建立一个列表,保存由所有访问过指定的服务的客户端IP

tcp_wrapper:tcp包装器

对于给予tcp协议kaifa并提供服务的应用程序,提供的一层访问控制工具:
基于库调用实现其功能:
	libwrap

判断服务是否能够由tcp_wrapper进行访问控制:
	(1)动态编译:ldd命令  例:ldd `which sshd`
	(2)静态编译;strings命令查看应用程序文件,其结果如果出现
		host.allow
		host.deny 
		则表示支持,否则不支持

在配置文件中为各服务分别定义访问控制规则实现访问控制:
	/etc/host.allow
	/etc/host.deny

	配置文件语法
		daemon_list:client_list [:options]

		daemon_list:
			应用程序文件名称,而非服务名:
			应用程序文件名称列表,彼此间使用逗号分隔
				例如:sshd,vsftpd:
					ALL表示多有服务

		client_list
			IP地址
			主机名
			网络地址:必须使用完整格式的掩码,不能使用前缀格式掩码,所以类似于172.16.0.0/16是不合法的
			简短格式的网络地址:例如172.16. 表示 172.16.0.0/255.255.0.0
			ALL:所有主机
			KNOWN
			UNKNOEN
			PARANOID

		EXCEPT:除了
		hosts.allow
			vsftp:172.16. EXCEPT 172.16.100.0/255.255.255.0 EXCEPT 172.16.100.1

		[:Options]
			deny:拒绝,主要用于host.allow文件中
			allow:允许用于host.deny文件,实现allow功能
			spawn:启动额外应用程序
				vsftpd: ALL :spawn /bin/echo `date` login attempt from %c to %s, %d >> /var/log/vsftpd.deny.log
					%c  client ip
					%s  server ip
					%d  daemon name