Linux防火墙(待续)

firewall概念:

1、防火墙的功能:
	实现网络隔离,即在多个不同的网络区域内通过不同的访问控制策略
	实现不同信任级别的数据交流
2、防火前类型:
软件防火墙、硬件防火墙:
	软件:从软件层面实现的防火墙功能,硬件和软件可能不专职为防火墙
		服务工作(类似硬raid和软raid)
	硬件:硬件架构专为防火墙功能而设计,可能在物理层次上实现包的
		拆分过滤等,更高效可靠、但价值昂贵
网络防火墙、主机防火墙:
	网络:架设在两个不同网络之间的防火墙,对两个网络之间的数据传递
		进行控制
	主机:部署在终端上的防火墙,对该终端的内外网络传输进行控制和保护
网络层防火墙、应用层防火墙:
	网络层防火墙:工作在TCP/IP协议栈上的防火墙,主要针对数据包的来源
		ip、目标ip、来源端口、目标端口、包首部标识位等等来实现包过滤功能
	应用层防火墙:工作于应用层之上,检查各应用层数据是否符合标准
		是否包含恶意流量等等,例如某些路由器上的qq、迅雷、游戏软件等等
		的访问控制;

centos 防火墙:

1、centos上是以内核中的netfilter框架实现的包过滤防火墙;
	centos6上通过iptables服务和iptables命令来实现防火墙规则的定义和添加;
	centos7上通过firewalld服务和firewall-cmd命令来实现防火墙规则的定义
		和添加(也支持iptables服务和命令)
	netfilter框架:四表五链
		四表:raw、mangle、nat、filter
		五链:PREROUTING、FORWARD、INPUT、OUTPUT、POSTROUTING
		raw:PREROUTING、OUTPUT
		mangle:所有
		nat:PREROUTING(dnat)、POSTROUTING(snat)、INPUT、OUTPUT
		filter:INPUT、OUTPUT、FORWARD
2、iptables服务和命令:
	iptables服务:
		服务启动时,会将默认路径/etc/sysconfig/iptables文件中保存的防火墙
		规则添加进netfilter框架中,来实现包过滤功能;
		服务停止时,规则清空
		iptables-save file:保存规则至文件
		iptables-restore < file:从文件载入规则
		system-config-firewall:iptables服务的图形配置界面
	iptables命令(以centos7为例):
		定义防火墙规则,命令基本格式:
		iptables [-t talbe] [chain] [rule-specification]
		不指定表时,默认显示filter表,不指定chain时,默认显示所有chain
		iptalbes
			-L :显示所有chain中filter表的规则;
			-L -v:显示规则匹配到的包个数和总大小计数器
			-L -v -x:显示计数器时显示精确数值;
			-A :添加规则
			-D:删除规则
			-R:替换规则
			-I:插入规则
			-N:添加自定义chain
			-E:重命名自定义chain
			-X:删除自定义chain
			-F:清空规则
			-Z:清空计数器
			-P:设置chain的默认规则
			-S:显示规则(格式为iptables-save保存的格式)
		-j action:对于规则所匹配的流量执行的动作
			基本动作:
				ACCEPT:接受
				DROP:丢弃(无回应)
				RETURN:返回原先的chain
			部分扩展动作:
				MASQUERADE:地址伪装
				DNAT:目标地址转换
				SNAT:源地址转换
				REJECT:拒绝(返回错误信息包)
		-4:指定ipv4协议
		-m:指定扩展,常用扩展:
			states:包状态检查
				INVALID:不与任何连接有关联的包
				NEW:新建立连接的包
				ESTABLISHED:已建立连接的包
				RELATED:新建立连接的包,但与某个已存在连接相关
					例如ftp的data连接,icmp error
			iprange:地址范围	
				--src-range:源地址范围指定
				--dst-range:目标地址范围指定
			icmp:
				--icmp-type 0|8
					0:icmp响应报文代码
					8:icmp请求报文代码
				例:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
					接受icmp响应报文流入;
			time:控制数据流通的日期或时间
				例:iptables -I INPUT 3 -p tcp --dport 80 -m time --weekdays 
					6,7 -j DROP
			connlimit:单个ip到某主机的并发连接数量限制
				例:iptables -t filter -A FORWARD -p tcp --dport 21 -m connlimit
					--connlimit-above 2 -j DROP
			limit:报文收发速率控制
				例: iptables -I INPUT 3 -d 192.168.181.10 -p icmp --icmp-type 8
					-m limit --limit 20/minute --limit-burst 5 -j ACCEPT
				Q:测试时由于INPUT filter表中第二条规则为:
					iptables -I INPUT 2 -m state ---state ESTABLISHED,RELATED
					-j ACCEPT
					因此,在进行第三条规则测试时,发现客户端ping连接并没有
					收到限制,正常收发包,而使用命令:
					iptables -L INPUT -v
					查看发现第三条规则,客户端每执行一次ping命令,仅匹配一个
					包;分析原因为:
					在首个新请求时,被规则3所匹配,而后的请求由于数据包的相
					关性被规则2所匹配,导致规则3未完全生效;
				Tip:要注意规则匹配顺序所带来的影响;
			multiport:离散式多端口指定,最多15个 
				--sports:源端口指定
				--dports:目标端口指定
				--ports:目标和源端口同时指定
			string:对报文做字符串匹配过滤
				--algo bm|kmp:字符串匹配算法
				--string :匹配字符串
				例:iptables -A OUTPU -p tcp --sport 80 -m string --algo bm
					--string 'film' -j DROP
				Tip:请求报文一般只有头部信息,没有报文主体信息,所有对
					字符串的过滤一般是应答报文的过滤
			tcp:
				--dport
				--sport
				--tcp-flags list1 list2 ;检查list1所列出的项中,list2出现的项必须
					为1,未出现的项必须为0;
					list常见项:(参见tcp 维基)
						SYN:为1表示请求建立连接
						ACK:为1表示确认号字段有效, 表示响应
						FIN:为1表示数据传输完成,要求释放连接
						RST:为1表示严重差错,要求重新建立tcp连接
						PSH:为1表示接收方要尽快将报文交给应用层而不用等
							缓冲区填满	
						URG:为1表示高优先级包,紧急指针字段有效
		-g:指定下个目标chain
		下面的选项在前面加!表示取反,如 '! -d 192.168.181.10'
		-p:	指定协议类型,包含隐式扩展
			-p tcp
		-i:指定包流入接口
		-o:指定包流出接口
		-s:指定源ip
		-d:指定目标ip
	iptables规则编写法则:
		1、同类型匹配,匹配范围小的规则在上面;
		2、匹配报文数量较多的规则放在上面;
		3、合并多条可以合并的同类型规则为一条;
		4、设置默认策略(默认策略是最后匹配)
		5、测试的结果,并不权威:
			默认规则为drop,流量匹配drop规则会继续向后匹配,直到
			出现匹配accept规则,或匹配到最后一条默认drop规则;意思即是:
			当默认规则为drop时,流量匹配到前面的规则为drop,匹配到后面
			的规则为accept,则最终为accept,匹配到最终的规则为默认规则
			drop,则为drop
			默认规则为accept时,流量匹配的规则为accept则会继续向后匹配,
			直到出现匹配drop规则,此drop规则立即生效;匹配不到drop规则
			会一直匹配到最后一条默认规则accept,此时流量为accept
			思考:
				output链默认规则为drop,设置了状态为established,related的
				流量accept,此时要拒绝web的某类流量流出该如何设置
			解:使用reject动作,而非与默认相同的drop动作
	iptables放行被动模式ftp服务:
		@插入ftp连接追踪帮助模块:
			modprobe nf_conntrack_ftp
		@编写防火墙规则:
			iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
			iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED
				-j ACCEPT	
		Tip:开机自动插入额外防火墙模块
			方法一:/etc/sysconfig/modules中创建脚本文件nf_conntrack_ftp.modules:
				#!/bin/bash
				if /usr/sbin/modinfo nf_conntrack_ftp &> /dev/null;then
					/usr/sbin/modprobe nf_conntrack_ftp;
				fi
				chmod +x nf_conntrack_ftp.modules
			方法二:/etc/sysconfig/iptables-config文件中修改配置项:
				IPTABLES_MODULES="nf_conntrack_ftp”
			或者在开机启动执行脚本中添加modprobe命令;
3、firewalld和firewall-cmd
	iptables是静态的,每次服务重载都需要卸载内核netfilter模块和其他额外模块
	firewalld是动态的,支持运行时配置和永久配置
	firewalld包括firewalld服务、firewall-cmd命令行配置命令、firewall、firewall-
		config(需安装包firewall-config)图形配置命令
	firewalld的配置文件和规则存放位置为:
		/etc/firewalld/目录
		/usr/lib/firewalld/目录
		规则文件存放为xml格式

示例:

1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过
100个每秒;web服务器包含了amdin字符串的页面不允许访问;web服
务器仅允许响应报文离开本机;
命令:
	iptables -P INPUT DROP 
	iptables -P OUTPUT DROP
	iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
	iptalbes -A INPUT -m state --state ESTABLISHED -j ACCEPT
	iptalbes  -A INPUT -p tcp --dport 80 -m limit  --limit 100/second -m state
		--state NEW -m time  ! --weekdays 1 -m string --algo bm ! --string
		 'admin'  -j ACCEPT
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务器给
172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
命令:
	iptables -P INPUT DROP
	iptables -P OUTPUT DROP
	iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
	iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
	modprobe nf_conntrack_ftp
	iptables -A INPUT -p tcp --dport 21 -s 172.16.0.0/16 -m time --weekdays
		1,2,3,4,5 --timestart 08:30 --timestop 18:00 -j ACCEPT
	iptables -A OUTPUT -m state --state RELATED -m limit --limit 5/minute
		--limit-burst 3 -j ACCEPT
3、开放本机的ssh服务给172.16.100.1-172.16.100.100中的主机,新请求
建立的速率一分钟不得超过2个;仅允许响应报文通过其服务器端口离开本机;
命令:
	iptables -P INPUT DROP
	iptables -P OUTPUT DROP
	iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
	iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
	iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 172.16.100.1-
		172.16.100.100 -m state --state NEW -m limit --limit 2/minute --limit-
		burst 2 -j ACCEPT
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
命令:
	iptalbes -P INPUT DROP
	iptables -P OUTPUT DROP
	iptalbes -A INPUT -m state --state ESTABLISHED -j ACCEPT
	iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
	iptables -A INPUT -p tcp -m tcp --tcp-flags ALL ALL -j REJECT
	iptables -A INPUT -p tcp -m tcp --tcp-flags ALL NONE -j REJECT
	Tip:默认规则为drop时,在做立即生效的拒绝规则时,要换一种拒绝
		动作,不然流量会继续向下匹配,会被后面匹配的放行规则放行;
5、允许本机ping别的主机,但不开放别的主机ping本机;
命令:
	iptalbes -P INPUT DROP
	iptables -P OUTPUT DROP
	iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
	iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
	iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
	iptables -A OUTPUT-p icmp --icmp-type 8 -j ACCEPT
6、自定义链引用,在检查完成后返回主链
命令:
	iptables -N check_IN
	iptables -A check_IN -d 255.255.255.255 -p icmp -j DROP
	iptables -A check_IN -d 192.168.181.255 -p icmp -j DROP
	iptalbes -A check_IN -p tcp ! --syn -m state --state NEW -j DROP
	iptables -A check_IN -d 192.168.181.10 -j RETURN
引用自定义链:
	iptables -A INPUT -d 192.168.181.10 -j check_IN
?7、利用recent扩展控制单ip连接数,如对ssh的每ip连接数控制
	对recent模块的运行机制不太理解,等待后续
	参考:非常详细的recent模块讲解
	https://www.cnblogs.com/kevingrace/p/10008487.html
8、tcpwrapper:
	对基于tcp协议开发并提供服务、并调用了tcpwrapper库的应用程序,
	进行访问控制;tcpwrapper基于库来实现其功能
	判断程序是否可由tcp_wrapper进行访问控制:
		1、动态编译tcpwrapper库的程序:ldd命令,链接库包含libwrap
			则支持;
		2、静态编译tcpwrapper库的程序:strings命令查看程序文件,
			出现hosts.allow和hosts.deny则支持
	配置文件:
		/etc/hosts.allow
		/etc/hosts.deny
		程序调用tcpwrapper库先检查hosts.allow文件:
			有匹配项则放行,不继续检查;
			无匹配项则检查hosts.deny文件
		检查hosts.deny文件:
			有匹配项则拒绝
			无匹配项则放行
		未在此两个文件中定义项的程序不受tcpwrapper控制;
	配置文件格式:deamon_list: client_list
		deamon_list:
			应用程序的文件名,而非服务名称或其他(用rpm -ql查看其可执行
				程序文件名)
			多项以‘,’隔开;
			ALL表示所有服务
		client_list:
			IP:
			NET:网络段;
				192.168.255.0/255.255.255.0(支持centos6或7)
				192.168.255.0/24(仅支持centos7)
				简短格式,例如:172.16. ;最后的‘.’不能省略
			HOST:主机名
			ALL:所有主机
			KNOW:可以解析的地址
			UNKNOW:不能解析的地址
			PARANOID:正反解不匹配的客户端地址
		[:option:]:
			deny:用于hosts.allow文件中拒绝主机访问服务,如
				sshd:	192.168.181.1	:deny ;拒绝改主机访问sshd
			allow::用于hosts.deny文件中允许主机访问服务
				sshd:	192.168.181.1	:allow;允许该主机访问sshd
			spawn:启动额外应用程序,例/etc/hosts.deny中定义
				vsftpd:ALL	:spawn /bin/echo “`date` login attempt from 
				%c to %s, %d” >> /var/log/vsftpd.deny.log
				%c,%s,%d为spawn内置的宏,详情见man 5 hosts_access,
					man 5 hosts_options
		EXCEPT:除外,例
			/etc/hosts.allow中定义:
				sshd:	172.16. EXCEPT 172.16.100. :deny
					除开172.16.100子网的其他172.16.网段主机拒绝访问sshd
					(172.16.100子网及其他网段主机继续向后检查)
				sshd:	172.16. EXCEPT 172.16.100. EXCEPT 172.16.100.1
				:deny
					172.16.100子网的主机除开100.1继续向后检查,其他172.16
					网段主机拒绝访问sshd
	示例:
		@仅允许客户端192.168.181.1连接sshd、vsftpd服务;
			/etc/hosts.allow
				vsftpd,sshd:	192.168.181.1
			/etc/hosts.deny
				vsftpd,sshd:	ALL
		@不允许192.168.181.1访问centos6上的telnet服务;
			/etc/hosts.deny:
				in.telnetd:	192.168.181.1
			Tip:此处不要用服务名telnet,使用rpm -ql 命令查看telnet-server
			中服务程序文件名为in.telnetd,用该名称;
		@控制telnet服务仅允许172.16.网段的主机访问,但不包括172.16.100
			子网段的主机,登录成功日志记录在/var/log/telnet.allow.log,失败
			日志记录在/var/log/telnet.deny.log中
			/etc/hosts.allow中定义:
				in.telnetd:	172.16. EXCEPT 172.16.100.	:spawn /bin/echo "
				`date` login successfully from %c to %s, %d" >> /var/log/telnet
				.allow.log
			/etc/hosts.deny中定义:
				in.telnetd:	ALL	:spawn /bin/echo "`date` login attempt from 
				%c to %s failed, %d" >> /var/log/telnet.deny.log

优质文章:

1、IBM社区使用firewall构建动态防火墙:
	http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html
2、知乎关于firewalld的详细介绍:
	https://zhuanlan.zhihu.com/p/23519454

扩展练习:

1、iptables layer 7
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值