linux防火墙: iptables、netfilter
防火墙的类别:
软件防火墙:iptables、ISA
硬件防火墙:华为、思科
按防护墙作用范围分类: 主机防火墙 、网络防火墙
原理:根据数据包的源ip、目标ip、源port、目标端口、协议、状态、资源、内容,如果数据包符合预定的规定,则放行;如果不符合规则,则阻拦数据包。
tcp数据包:
数据包:
source port:源端口 destination :目标端口 sequence number :请求序号
acknoledgment number :应答序号 data offset :数据偏移量
状态标志位:
FIN:表示要断开连接 (如果是要请求断开的话,fin值是1,否则是0)
SYN:表示请求建立链接的包(如果是要请求链接的话,syn值是1,否则syn是0)
ACK:表示这个数据包是对于之前对方发送数据包的响应数据包(如果是响应数据包的话,那么ack的值为1,否则ack的值为0)
URP:紧急标志,当设置此位置时,数据的优先于其他数据的
PSH:推送标志,这个标志告诉应用程序立刻发送数据
PST:重置标志,重置tcp链接
主机直接的通信条件:
sip:源ip
dip:目标ip
smac:源mac地址
dmac:目标mac地址
sport:源端口
dport:目标端口
syn:0 fin:0 ack:1
iptables防火墙
作用:可以对进出的数据包,进行过滤,也可以实现地址、端口的转换
iptables的基本组成:
链
PREROUTING:在对数据包进行路径选择之前所应用的链(防火墙刚收到的数据包)
FORWARD:将数据包从一个网络转发到另一个网络的过程所应用的链
POSTROUTING:在数据包进行路径选择之后所应用的链
INPUT:对数据包的目标时防火墙的本身的情况下使用
OUPUT:对有防火墙的上层应用所产生的数据包应用的链
表
filter:过滤数据包 (三个链:INPUT、OUTPUT、FORWARD)
nat表:不能过滤数据包,仅仅修改数据包的IP的端口 (三个链: OUTPUT、 PREROUTING、 POSTROUTING)
mangle表:不能过滤数据包也不能修改,仅仅修改数据包的报文,比如说修改ttl值 (五个值)ttl:每次转发ttl值减1,ttl值是0时就会从网络丢弃。
rawa表:决定是否对被追踪到状态进行处理.(两个链:PREOUTING、OUTPUT)
iptables的工作流程
数据包向后转发的时候会指定一个IP地址,路由选择不一定是基于IP做选择。
iptables应用:centos6和centes7中的防火不一样
centos6:防火就只有iptables
centos7:支持iptables和firewalld,默认用的firewalldiptable、firewalld本质一样
在使用firewalld的时候,其实还是调用iptables来完成工作
禁用firewalld
centos7默认的防火墙软件是firewalld
#设置防火墙永久关闭【下次启动系统的时候,firewalld不启动】
[root@localhost ~]# systemctl disable firewalld
#立刻关闭防火墙 [root@localhost ~]# systemctl stop firewalld
确认启动情况
出现disabled 表示下次开机的时候,防火墙不会自动启动;出现inactive(dead) 表示防火墙已经关闭了。
安装iptables
安装组件:iptables-services
组件作用:实现iptables的管理操作,例如启动、关闭、重启等
[root@localhost ~]# yum install iptables-services -y
启动防火墙:
[root@localhost ~]# systemctl start iptables
设置防火墙开机自动启动:
[root@localhost ~]# systemctl enable iptables
查看防火墙的状态:
出现enables 表示防火墙是开机自己启动,出现active 表示防火墙在运行。
防火墙的常规操作
iptables命令
格式: iptables 【-t 表名】 COMMAND 链名 【规则序号】
说明:
如果表名省略,则默认时对filter进行操作。
COMMAND:是要执行的命令,包括添加规则、删除规则、替换规则、修改规则。
如果规则序号省略,那么通常是对最后一个进行操作。
匹配条件:是对什么样的数据包进行过滤
执行的操作:是匹配到数据包如何处理,比如放行、阻止。
iptables相关命令(COMMAND)
-A: 链名:在指定的链中追加规则(末尾追加)
-L(大写i) 链名 【num】:在指定的链中插入规则(默认首部插入)
-D 链名 【num】:删除指定的链中的规则(默认是删除最后一个)
-R 链名 【num】:替换规则
-F 链名:清除链中的规则,如果不指定链名,则删除整个表的全部的链的规则
-N:自定义一个新链
-X;删除自定义的链(必须是空链)
-P 链名: 修改一个链的默认规则
-L:显示iptables中的规则列表-n:以数字方式显示(如果不加-n会将数字反解为服务名,往往速度特变缓慢)-v:显示规则的详细信息,包括每个规则所匹配到的数据包数量--line:在显示规则的时候,在规则的前面显示一个序号
-t 表名:指定查看哪个表中的规则【默认是查看filter】
-j:
执行的操作做: ACCEPT :放行 DROP:丢弃 REJECT:认为数据包危险,告诉客户数据包危险没放行,并且丢弃数据包 SNAT:源地址转换 DNAT:目标地址转换
案例1:查看filter表中规则: iptables -L -n --line -t filter
案例2:清楚nat表中的规则:iptables -t nat -F
案例3:保存防火墙规则: service iptables save
通用匹配: -s:匹配数据包的源IP -d:匹配数据包的目标IP -i:匹配数据包是从哪个网卡进入的 -o:匹配数据包是从哪个网卡发出的
案例: 禁止1.1.1.1访问主机 iptables -t filter -A INPUT -S 1.1.1.1 -j DROP
允许1.1.1.2访问主机 iptables -t filter -A INPUT -s 1.1.1.2 -j ACCEPT
删除filter中的第一条规则: iptables -t filter -D INPUT 1
禁止别人通过ens37网卡来访问 iptables -t filter -A INPUT -i ENS37 -j ACCEPT
允许别人通过ens33网卡来访问 iptables -t filter -A INPUT -i ens33 -j ACCEPT
禁止主机访问192.168.0.116 iptables -t filter -A OUTPUT -d 192.168.6.116 -j DROP
允许主机访问192.168.6.11 iptables -t filter -A OUTPUT -d 192.168.6.116 -j ACCEPT
扩展匹配
tcp扩展:-p: 指定数据包中协议类型(tcp、udp、icmp)
-p tcp--sport:指定源端口 -p tcp--dport:指定目标端口
-p tcp--tcp-flag 列表1 列表2:列表1指定要检查的标志位,列表2指定列表1中必须为1的标志位,如果列表1中有,但列表2中没有,那么这个标志位必须为0
例子:将数据包源IP为1.1.1.1,协议类型为tcp,目标端口为22的数据包放行
iptables -t -A INPUT -s 1.1.1.1 -p tcp --dport 22 -j ACCEPT
例子:将数据包源IP为1.1.1.1,三次握手的第一次的数据包丢弃
iptables -t filter -A INPUT -s 1.1.1.1 -p tcp --tcp-flag ack,fin,syn syn -j DROPiptables -t filter -A OUTPUT -s 1.1.1.1 -p tcp --tcp-flag ack,fin,syn syn,ack -j DROP
icmp的扩展
例子:将客户端IP为1.1.1.1的主机所发送的ping包丢弃
iptables -t filter -A INPUT -s 1.1.1.1 -p icmp -j DROP
ping的命令使用的是icmp协议
格式:-p icmp
-p icmp --icmp-type X ping的请求包的类型8,ping的响应的类型0
案例:禁止让物理机ping虚拟机,但是虚拟机可以ping物理机
iptables -t filter -A INPUT -s 192.168.6.116 -p icmp--type 8 -j DROP
#禁止物理机ping虚拟机iptables -t filter -A OUTPUT -s 192.168.6.116 -p icmp --icmp-type 0 -j ACCEPT
#允许6.116主机发送ping包
显示扩展
状态扩展
匹配处于各种状态的数据包
格式:
-m state --state 状态
状态的表示方式:
NEW:表示新的链接请求(可以是三次握手的第一次,也可以是ping的第一次)
ESTABLISHED:表示请求链接的相应,链接建立完成的数据包
案例:实现防止木马基于80端口进行反弹式链接
第一步: iptables -t filter -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
第二步: iptables -t filter -A OUTPUT -p tcp --sport 80 -m state --state NEW -j DROP
第三步: iptables -t filter -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT