Linux防火墙详解

一、防火墙基础

Linux防火墙主要工作在网络层,属于典型的包过滤防火墙。

  • redhat 6 使用的是iptables
  • redhat 7 使用的是firewalld

iptables服务会把配置好的防火墙策略交由内核层面的 netfilter 网络过滤器来处理

firewalld服务则是把配置好的防火墙策略交由内核层面的 nftables 包过滤框架来处理

iptables和firewalld都是Linux配置内核防火墙的工具


二、iptables

iptables 是一款基于命令行的防火墙策略管理工具,具有大量参数,学习难度较大。好在对于日常的防火墙策略配置来讲,大家对“四表五链”的理论概念了解即可,只需要掌握常用的参数并做到灵活搭配即可,这就足以应对日常工作了。

iptables命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成功,iptables就会根据策略规则所预设的动作来处理这些流量。另外,再次提醒一下,防火墙策略规则的匹配顺序是从上至下的,因此要把较为严格、优先级较高的策略规则放到前面,以免发生错误。下表总结归纳了常用的iptables命令参数。再次强调,我们无需死记硬背这些参数,只需借助下面的实验来理解掌握即可。

Iptables采用了表和链的分层结构,每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表,raw表,mangle表,nat表,filter表,每个表容器内包括不同的规则链,根据处理数据包的不同时机划分为五种链,而决定是否过滤或处理数据包的各种规则,按先后顺序存放在各规则链中。

规则表分为以下4种(了解

  1. filter表:用来对数据包进行过滤,表内包含三个链,即:INPUT,FORWARD,OUTPUT
  2. Nat表:nat表主要用来修改数据包的ip地址、端口号等信息。包含三个链,即PREROUTING,POSTROUTING,OUTPUT
  3. Mangle表:用来修改数据包的TOS、TTL,或者为数据包设置MARL标记,实现流量×××,策略路由等高级应用,包含五个链,PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD
  4. Raw表:用来决定是否对数据包进行状态跟踪,包含两个链:即OUTPUT,PREROUTING

规则链分为以下5种(了解

  1. INPUT链:当收到访问防火墙本机地址的数据包(入站),应用此链中的规则。
  2. OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
  3. FORWARD链:当收到需要通过防火墙中转发送给其他地址的数据包(转发)时,应用此链中的规则。
  4. PREROUTING链:在对数据包做路由选择之前,应用此链中的规则。
  5. POSTROUTING链:在对数据包做路由选择之后,应用此链中的规则。

防火墙策略规则是按照从上到下的顺序匹配的,因此一定要把允许动作放到拒绝动作前面,否则所有的流量就将被拒绝掉,从而导致任何主机都无法访问我们的服务。


防火墙策略

防火墙策略规则的设置有两种:一种是“通”(即放行),一种是“堵”(即阻止)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用

  • ACCEPT(允许流量通过)
  • REJECT(拒绝流量通过)
  • LOG(记录日志信息)
  • DROP(拒绝流量通过)

REJECT 和 DROP 的不同点

DROP 来说,它是直接将流量丢弃而且不响应

REJECT 则会在拒绝流量后再回复一条“您的信息已经收到,但是被扔掉了”信息,从而让流量发送方清晰地看到数据被拒绝的响应信息。

iptables 命令格式:

iptables [-t 表] -命令 匹配 操作

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

参数 作用
-P 设置默认策略
-F 清空规则链
-L 查看规则链
-A 在规则链追加新规则
-I 在规则链插入新规则
-R 替换规则链中的相应规则
-D 删除某一条规则
-Z 清空规则链中的数据包计数器和字节计数器
-p<协议> 匹配协议,如 TCP、UDP、ICMP
-s<源地址> 指定要匹配的数据包的源IP地址
–dport 匹配目标端口号
–sport 匹配来源端口号
-j 指定要跳转的目标(一般写策略规则)

案例:

查看开放的端口:

[root@linuxprobe ~]# cat /etc/sysconfig/iptables
[root@linuxprobe ~]# netstat -ntlp   #列出所有端口

开启端口(以80端口为例):


方法一:
[root@linuxprobe ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT     #写入修改
[root@linuxprobe ~]# service iptables save   #保存修改 
[root@linuxprobe ~]# service iptables restart    重启防火墙,修改生效

方法二:
[root@linuxprobe ~]# vi /etc/sysconfig/iptables  #打开配置文件加入如下语句:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT   
#重启防火墙,修改完成

关闭端口:

方法一: 
[root@linuxprobe ~]# iptables -I INPUT -p tcp --dport 80 -j DROP   #写入修改
[root@linuxprobe ~]# service iptables  save   #保存修改
[root@linuxprobe ~]# service iptables restart  #重启防火墙,修改生效 

方法二: 
[root@linuxprobe ~]#  vi /etc/sysconfig/iptables  #打开配置文件加入如下语句: 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j DROP   
#重启防火墙,修改完成

查看端口状态:

     [root@linuxprobe ~]#  /etc/init.d/iptables status

将 INPUT 规则链设置为只允许指定网段的主机访问本机的 22 端口,拒绝来自其他所有主机的流量:

[root@linuxprobe ~]# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT 
[root@linuxprobe ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT

向 INPUT 规则链中添加拒绝所有人访问本机 12345 端口的策略规则:

[root@linuxprobe ~]# iptables -I INPUT -p tcp --dport 12345 -j REJECT 
[root@linuxprobe ~]# iptables -I INPUT -p udp --dport 12345 -j REJECT

向 INPUT 规则链中添加拒绝 192.168.10.5 主机访问本机 80 端口(Web 服务)的策略规则:

[root@linuxprobe ~] # iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT

向 INPUT 规则链中添加拒绝所有主机访问本机 1000~1024 端口的策略规则:

[root@linuxprobe ~]# iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT 
[root@linuxprobe ~]# iptables -A INPUT -p udp --dport 1000:1024 -j REJECT

查看已有的防火墙规则链:

[root@linuxprobe ~]# iptables -L

把 INPUT 规则链的默认策略设置为拒绝:

[root@linuxprobe ~]# iptables -P INPUT DROP

向防火墙的INPUT 规则链中添加一条允许 ICMP 流量进入的策略规则默认允许了这种 ping 命令检测行为:

[root@linuxprobe ~]# iptables -I INPUT -p icmp -j ACCEPT

删除 INPUT 规则链中刚刚加入的那条策略(允许 ICMP 流量),并把默认策略设置为允许:

[root@linuxprobe ~]# iptables -D INPUT 1 
[root@linuxprobe ~]# iptables -P INPUT ACCEPT

使用 iptables 命令配置的防火墙规则默认会在系统下一次重启时失效,如果想让配置的防火墙策略永久生效,还要执行保存命令:

[root@linuxprobe ~]# service iptables save

三、firewalld

相较于传统的防火墙管理配置工具,firewalld 支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是 firewalld 预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。


firewalld跟iptables比起来至少有两大好处:

  1. firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;
  2. firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。

注:firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。

一个重要的概念:区域管理

firewalld将网卡对应到不同的区域(zone),zone 默认共有9个:
block dmz drop external home internal public trusted work

都保存在“/usr/lib/firewalld/zones/”目录下。

firewalld 中常用的区域名称及测了规则

区域 默认规则
阻塞区域(block) 任何传入的网络数据包都将被阻止。
工作区域(work) 相信网络上的其他计算机,不会损害你的计算机。
家庭区域(home) 相信网络上的其他计算机,不会损害你的计算机。
公共区域(public) 不相信网络上的任何计算机,只有选择接受传入的网络连接。
隔离区域(DMZ) 隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
信任区域(trusted) 所有的网络连接都可以接受。
丢弃区域(drop) 任何传入的网络连接都被拒绝。
内部区域(internal) 信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
外部区域(external) 不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。

终端管理工具 firewalld-cmd

firewall 可以看成整个防火墙服务,而 firewall-cmd 可以看成是其中的一个功能,可用来管理端口

firewalld-cmd 命令中使用的参数以及作用

参数 作用
–get-default-zone 查询默认的区域名称
–set-default-zone=<区域名称> 设置默认的区域,使其永久生效
–get-zones 显示可用的区域
–get-services 显示预先定义的服务
–get-active-zones 显示当前正在使用的区域与网卡名称
–add-source= 将源自此 IP 或子网的流量导向指定的区域
–remove-source= 不再将源自此 IP 或子网的流量导向某个指定区域
–add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
–change-interface=<网卡名称> 将某个网卡与区域进行关联
–list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
–list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
–add-service=<服务名> 设置默认区域允许该服务的流量
–add-port=<端口号/协议> 设置默认区域允许该端口的流量
–remove-service=<服务名> 设置默认区域不再允许该服务的流量
–remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
–reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
–panic-on 开启应急状况模式
–panic-off 关闭应急状况模式

案例:
查看 firewall 防火墙程序是否正在运行:

[root@linuxprobe ~]# firewall-cmd --state

查看已打开的所有端口:

[root@linuxprobe ~]# firewall-cmd --zone=public --list-ports

开启指定端口:

[root@linuxprobe ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent 
(--permanent 永久生效,没有此参数重启后失效)
重新加载 firewall,修改配置后,必须重新加载才能生效:
firewall-cmd --reload 

关闭指定端口:

[root@linuxprobe ~]# ffirewall-cmd --zone=public --remove-port=8080/tcp --permanent
(--permanent 表示永久生效,没有此参数重启后失效)
重新加载 firewall,修改配置后,必须重新加载才能生效:
firewall-cmd --reload 

firewall-cmd对端口的操作,如开放端口等信息,都放在"/etc/firewall/zones/public.xml"中记录,所以直接修改此文件也是可以的


四、linux防火墙状态命令

  1. iptables防火墙
目的 命令
查看防火墙状态 service iptables status
停止防火墙 service iptables stop
启动防火墙 service iptables start
重启防火墙 service iptables restart
永久关闭防火墙 chkconfig iptables off
永久关闭后重启 chkconfig iptables on

开启80端口
vim /etc/sysconfig/iptables
加入如下代码
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

保存退出后重启防火墙
service iptables restart


  1. firewall防火墙
目的 命令
查看firewall服务状态 systemctl status firewalld
查看firewall的状态 firewall-cmd --state
开启防火墙,启动 firewall 服务 systemctl start firewalld
重启防火墙,重启 firewall 服务 systemctl restart firewalld
关闭防火墙,停止 firewall 服务 systemctl stop firewalld
开机自动启动服务 systemctl enable firewalld.service
查看防火墙规则 firewall-cmd --list-all
查询端口是否开放 firewall-cmd --query-port=8080/tcp
开放80端口 firewall-cmd --permanent --add-port=80/tcp
移除端口 firewall-cmd --permanent --remove-port=8080/tcp
重启防火墙(修改配置后要重启防火墙) firewall-cmd --reload

参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、–permanent:表示设置为持久;
3、–add-port:标识添加的端口;

猜你喜欢

转载自blog.csdn.net/w918589859/article/details/108696103