netfilter/iptables是集成在linux2.4.x版本内核中的包过滤防火墙系统。linux
该框架能够实现数据包过滤,网络地址转换以及数据包管理功能。linux中的防火墙系统包括两个部分:netfilte和iptables。netfilte能够对本机全部流入、流出、转发的数据包进行查看、修改、丢弃、拒绝等操做。因为netfilter在内核空间中,用户一般没法接触内核和修改内核,此时须要命令行工具,通常使用iptables,firewalld等工具。使用iptables能够添加、删除具体的过滤规则,iptables默认维护四个表和五个链,全部的防火墙策略规则都将被分别写入表和链中。centos7系统防火墙模块存放在/lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilter/目录下,当须要某个模块功能时,能够经过modprobe加载。vim
centos7在原有的netfilter/iptables架构上又增长了firewalld。iptables工具是一个比较低级别的工具,仅能够调整ipv4的防火墙规则,因此在centos7上使用了firewalld做为默认的用户防火墙工具,但当用户使用firewalld编写ipv4防火墙规则时,firewalld依然是调用了底层的iptables实现具体的功能,只是这个调用过程对用户是透明的。
后端
1、iptablescentos
默认的iptables规则表又fileter表(过滤规则表),nat表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表)。每一个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)和POSTROUTING(路由后过滤),防火墙规则须要写入到这些具体的数据链中。bash
如下为流程服务器
1)外部主机发送数据包给防火墙本机,数据将会通过PEROUTING与INPUT链;网络
2)若是防火墙本机发送数据包到外部主机,数据通过OUTPUT于POSTRTOUTING链架构
3)若是防火墙做为路由负责转发数据,则数据通过PEROUTING链、FORWARD链已经POSTROUTING链框架
iptables的表与链的关系以下所示:
运维
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
2、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-zones #显示系统预约义的zone,默认为九个zone
firewall-cmd --get-services #显示系统预约义的服务名称
firewall-cmd --get-zone-of-interface=ens192 #查询接口匹配的zone
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服务禁用,避免干扰