netfilter/iptables是集成在linux2.4.x版本内核中的包过滤防火墙系统。
该框架可以实现数据包过滤,网络地址转换以及数据包管理功能。linux中的防火墙系统包括两个部分:netfilte和iptables。netfilte可以对本机所有流入、流出、转发的数据包进行查看、修改、丢弃、拒绝等操作。由于netfilter在内核空间中,用户通常无法接触内核和修改内核,此时需要命令行工具,一般使用iptables,firewalld等工具。使用iptables可以添加、删除具体的过滤规则,iptables默认维护四个表和五个链,所有的防火墙策略规则都将被分别写入表和链中。centos7系统防火墙模块存放在/lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilter/目录下,当需要某个模块功能时,可以通过modprobe加载。
centos7在原有的netfilter/iptables架构上又增加了firewalld。iptables工具是一个比较低级别的工具,仅可以调整ipv4的防火墙规则,所以在centos7上使用了firewalld作为默认的用户防火墙工具,但当用户使用firewalld编写ipv4防火墙规则时,firewalld依然是调用了底层的iptables实现具体的功能,只是这个调用过程对用户是透明的。
一、iptables
默认的iptables规则表又fileter表(过滤规则表),nat表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表)。每个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)和POSTROUTING(路由后过滤),防火墙规则需要写入到这些具体的数据链中。
以下为流程
1.1 iptables的语法
iptables定义规则的方式比较复杂:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :3个filter nat mangle
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
-j ACTION :指定如何进行处理
选项:
-t 指定需要维护的防火墙规则表,不使用-t时,则默认操作对象为filter表
-A 追加防火墙规则
-D 删除防火墙规则
-I 插入防火墙规则
-F 清空防火墙规则
-L 列出防火墙规则
-R 替换防火墙规则
-Z 清空防火墙数据表统计信息
-P 设置默认规则
匹配参数:
[!]-p 匹配协议,!代表取反
[!]-s 匹配源地址
[!]-d 匹配目标地址
[!]-o 匹配入站网卡接口
[!]--sport 匹配源端口
[!]--dport 匹配目的端口
[!]--src-range 匹配目标地址范围
[!]--dst-range 匹配目标地址范围
[!]--limit 匹配数据表速率
[!]--mac-source 匹配源mac地址
[!]--sports 匹配多个源地址
[!]--dports 匹配多个目的地址
[!]--state 匹配状态(INVALID,ESTABLISHED,NEW,EELATED)
[!]--string 匹配应用层字符串
触发动作:
ACCEPT 允许数据包通过
REJECT 拒绝数据包通过
LOG 将数据包信息记录syslog日志
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址欺骗
REDIRECT 重定向
iptables防火墙规则的顺序非常重要,内核按顺序检查这些规则,如果发现有匹配的股则条目按,则立刻执行相关动作,停止继续向下查找规则条目,如果所有的防火墙规则都未能匹配成功,
则按照默认策略处理。使用-A选项添加防火墙规则会将该规则追加到整个链的最后,而使用-I选项添加的规则则默认会插入到链中作为第一条规则。下面通过实例简单演示iptables命令的使用方法。
iptables -nL #查看filter表的所有规则 iptables -t nat -nL #查看nat表所有的规则 iptables -F #清空filter表中所有的规则 iptables -A INPUT -s 192.168.0.1 -j DROP #向filter表中添加一条新的入站规则,丢弃192.168.0.1主机发送给防火墙本机的所有的数据包 iptables -I INPUT -s 192.168.0.22 -p icmp -j REJECT #向filter表中插入一条新的入站规则,拒绝192.168.0.22 ping iptables -nL --line-number #查看表中防火墙规则并显示规则编号 iptables -D INPUT 1 #删除表中INPUT链的第一条规则 iptables -R INPURT 2 ! -s 192.168.0.254 -j REJECT #替换filter表中INPUT链的第二条规则,拒绝192.168.0.254之外的任何主机连接防火墙本机 iptables -t fileter -p INPUT ACCEPT #修改filte表中INPUT链的默认规则为接收数据包 iptables -I INPUT -s 192.168.0.10 -p tcp --dport 22 -j LOG #将192.168.0.10主机发送给防火墙本机的22端口的所有数据包信息记录到messages日志 iptables -I INPUT -i eth1 --p tcp --dport 80 -j ACCEPT #允许任何主机从eth1网络接口访问本机的80端口
1.2运用举例
1) 允许任意客户端访问服务器主机提供的日常服务(HTTP,HTTPS,DNS,NTP,SMTP,POP3,SSH),在linux系统中,/etc/services文件可以找到各种服务所对应的标准端口信息
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p udp --dport 25 -j ACCEPT iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 110 -j ACCEPT iptables -A INPUT -p tcp --dport 143 -j ACCEPT iptables -A INPUT -p tcp --dport 123 -j ACCEPT iptables -P INPUT -P INPUT DROP iptables -P INPUT -p OUTPUT ACCEPT
2)使用SNAT共享上网,服务器作为软路由,内部所有的192.168.0.0/24网端内的主机连接外网时,防火墙自动将所有源地址修改为公网IP,最后互联网将信息返回给路由后,由路由再转交给真正的后端主机。防火墙源地址转换(SNAT)规则需要被写入到NAT表中的POSTROUTING链
vim /etc/sysctl.conf
systctl -p #重新加载内核参数配置文件 iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.125.199.84 #配置nat表,使用snat方式将源地址段192.168.0.0/24 转换为124.125.199.84公网地址
3)配置DNAT,外部网络公网IP访问内网业务服务器
sed -i '$a\net.ipv4.ip_forward = 1' /etc/sysctl.conf #配置文件最后一行添加 systctl -p #重新加载内核配置文件 iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100 #配置nat表,使用dnat方式,访问公网地址80端口转换192.168.0.100 iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101
4)限制单位时间内数据包的个数,防止网络攻击发送大量无效的数据包给服务器,造成服务器无法响应正常的请求包
iptables -I INPUT -m limit --limit 500/sec -j ACCCEPT #当每秒数据包个数为500的时候接收入站连接,否则拒绝连接 iptables -P INPURT DROP
5)根据数据连接状态设置防火墙规则,放行所有的出站数据包,拒绝入站的新连接请求与无效链接,放行入站的回应请求
iptables -F iptables -A INPUT -m state --state NEW -j DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -P OUTPUT ACCEPT
6)防火墙设置规则,记录192.168.0.1 到192.168.0.22地址段内所有的主机发送给路由要求转发的数据包,并允许转发这些数据包
iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j LOG iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j ACCEPT
1.4 iptables备份与还原
默认的iptables防火墙规则会立刻生效,但是如果不保存,当计算机重启后,所有的规则将会丢失,所以需要即时保存。
iptables软件包提供了两个非常有用的工具,iptables-save和iptables-restore,可以方便的处理大量的防火墙规则。centos7系统中的防火墙规则默认保存再/etc/sysconfig/iptables文件中,使用iptables-save将规则保存至该文件中实现保存防火墙规则的作用,重启后会自动加载该文件中的规则。如果使用iptables-save将规则保存到其他位置,可以实现备份防火墙规则的作用。当防火墙规则需要做还原时,可以使用iptables-restore将备份文件直接导入当前防火墙规则。
iptables-save > /etc/sysconfig/iptables iptables-save > firewall.bak iptables-restore < firewall.bak
二、firewalld
firewalld将所有的网络流量都分类汇聚到zones中,它通过zones管理防火墙规则,每一个进入系统的数据包,都会首先检查源IP地址和接口,如果与某个zone匹配,则该zone的规则将生效。而每个zone都会有开启或关闭服务和端口的列表,以实现允许或拒绝链接服务和端口。如果数据包的源IP地址和网卡接口都不能和任何zone匹配,则该数据包将匹配默认zone,一般情况下是一个public的默认zone。firewalld会提供block,dmz,drop,external,home,internal,public,trusted,work这九个zone。比如有一个数据包从eno1网卡进入本机,根据规则进入work这个zone而在work这和zone中有允许访问http服务的规则,则最后该数据包将可以进入本机并访问http服务
大部分zone都定义的有自己的允许规则,规则通过端口/协议(631/udp)或者预定义的服务(ssh)这种形式设置,如果数据包没有匹配这些允许的规则,则该数据包一般会被防火墙拒绝。但是如果有名为trusted的zone,默认会运行所有的数据流量,如果有一个数据包进入了该zone,则被允许访问所有的资源。
具体的firwalld预定义zone及其描述信息如下所示:
drop(丢弃):任何接受的网络数据包都被丢弃,没有任何回复,
仅能有发送出去的网络连接(数据包不能进来,但是可以出去)
block(限制):任何接受的网络连接都被IPv4的icmp-host-prohibited信息和IPv6的icmp6-adm-prohibited信息所拒绝。(和drop相比,比较宽松一些,主要是为了针对icmp)
piblic(公共):在公共区域内使用,不能相信网络内其他计算机不会对你造成危害,只能接受经过选取的连接。
external(外部):特别是为路由器启用了伪装功能的外部网,你不能信任来自网络的其他计算,不能相信他们不会对你造成伤害,只能接受经过选择的连接。
dmz(非军事区):用于你的非军事区内的电脑,此区域可公开访问,可以有限的进入你的内部网络,仅仅接受经过选择的连接。
work(工作):用于工作区,你可以基本信任网络内的其他电脑不会对你造成危害,仅仅接收经过选择的连接。
home(家庭):用于内部网络,你可以基本上信任网络内其他电脑不会对你造成危害,仅仅接收经过选择的连接。
internal(内部):用于内部网络,你可以基本上信任网络内其他电脑不会对你造成危害,仅仅接收经过选择的连接。
trusted(信任):可接受所有的网络连接。
2.1 firewalld-cmd命令
可以使用firewall-cmd命令来管理防火墙规则,语法格式如下:
用法:
firwall-cmd [OPTIONS....]
选项:
--get-default-zone 获取默认zone信息
--set-default-zone=<zone> 设置默认zone
--get-active-zones 显示当前正在使用的zone信息
--get-zones 显示系统预定义的zone
--get-zone-of-interface=<interface> 查询某个接口与哪个zone匹配
--get-zone-of-source=<source>[/<mast>/] 查询某个源地址与哪个zone匹配
--list-all-zones 显示所有的zone信息的所有规则
--add-service=<service> 向zone中添加允许访问的服务
--add-port=<portid>[-<portid>]/<protocol> 向zone中添加允许访问的端口
--add-interface=<interface> 将接口与zone绑定
--add-source=<source>[/<mask>/] 将源地址与zone绑定
--list-all 列出某个zone所有的规则信息
--remove-service=<service> 从zone中移除允许某个服务的规则
--remove-port=<portid>[-<portid>]/<protocol> 从zone中移除允许的某个端口规则
--remove-source=<source>[/<mask>] 将源地址与zone解除绑定
--remove-interface=<interface> 将网卡接口与zone接触绑定
--permanent 设置永久有效的规则,默认的情况规则都是临时的
--reload 重新加载防火墙规则
firewall-cmd --get-default-zone #查看默认zone,为public firewall-cmd --set-default-zone=trusted #设置默认zone为trusted
firewall-cmd --get-active-zones #显示当前正在使用的zone信息
firewall-cmd --get-services #显示系统预定义的服务名称
firewall-cmd --list-all-zones #显示所有的zone以及对应的规则信息
firewall-cmd --add-service=ftp --zone=public #public中添加允许访问ftp服务的规则 firewall-cmd --remove-service=ftp --zone=public #public中删除允许访问ftp服务的规则 firewall-cmd --add-port=3306/tcp --zone=public #public中添加允许访问3306服务的规则 firewall-cmd --remove-port=3306/tcp --zone=public #public中删除允许访问3306服务的规则 firewall-cmd --add-interface=eno1 --zone=public #将网卡eno1与public绑定,流量接入该接口匹配public规则 firewall-cmd --remove-port=eno1 --zone=public #将网卡eno1与public解绑定 firewall-cmd --add-source=1.1.1 --zone=public #将源地址1.1.1.1与public绑定,以后该主机访问本机时匹配public中的规则 firewall-cmd --list-all --zone=public #查看public中这个zone的规则列表 firewall-cmd --permanet --add-port=3306/tcp --zone=public #public中添加一条永久规则 firewall-cmd --reload #重启防火墙
一般在实际运维中,我们主要使用 iptables做为防火墙,将firewalld服务禁用,避免干扰