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