Linux防火墙详解
一、防火墙基础Linux防火墙主要工作在网络层,属于典型的包过滤防火墙。redhat 6 使用的是iptablesredhat 7 使用的是firewalldiptables服务会把配置好的防火墙策略交由内核层面的 netfilter 网络过滤器来处理firewalld服务则是把配置好的防火墙策略交由内核层面的 nftables 包过滤框架来处理iptables和firewalld都是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种(了解)
- filter表:用来对数据包进行过滤,表内包含三个链,即:INPUT,FORWARD,OUTPUT
- Nat表:nat表主要用来修改数据包的ip地址、端口号等信息。包含三个链,即PREROUTING,POSTROUTING,OUTPUT
- Mangle表:用来修改数据包的TOS、TTL,或者为数据包设置MARL标记,实现流量×××,策略路由等高级应用,包含五个链,PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD
- Raw表:用来决定是否对数据包进行状态跟踪,包含两个链:即OUTPUT,PREROUTING
规则链分为以下5种(了解)
- INPUT链:当收到访问防火墙本机地址的数据包(入站),应用此链中的规则。
- OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
- FORWARD链:当收到需要通过防火墙中转发送给其他地址的数据包(转发)时,应用此链中的规则。
- PREROUTING链:在对数据包做路由选择之前,应用此链中的规则。
- 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比起来至少有两大好处:
- firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;
- 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
2. 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:标识添加的端口;
五、systemctl 和 service 区别
- systemctl命令:是一个systemd工具,主要负责控制systemd系统和服务管理器。
- service命令:可以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。
- chkconfig命令:是管理系统服务(service)的命令行工具。所谓系统服务(service),就是随系统启动而启动,随系统关闭而关闭的程序。
systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起。
systemctl是RHEL 7 的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。可以使用它永久性或只在当前会话中启用/禁用服务。
所以systemctl命令是service命令和chkconfig命令的集合和代替。
1. 运行级别概念的区分
System V init 运行级别 | systemd 目标名称 | 作用 |
---|---|---|
0 | runlevel0.target, poweroff.target | 关机 |
1 | runlevel1.target, rescue.target | 单用户模式 |
2 | runlevel2.target, multi-user.target | 等同于级别 3 |
3 | runlevel3.target, multi-user.target | 多用户的文本界面 |
4 | runlevel4.target, multi-user.target | 等同于级别 3 |
5 | runlevel5.target, graphical.target | 多用户的图形界面 |
6 | runlevel6.target, reboot.target | 重启 |
emergency | emergency.target | 紧急 Shell |
2. 管理服务的启动、重启、停止、重载、查看状态等常用命令区分
foo 服务名
作用 | System V init 命令(RHEL 6) | systemctl 命令(RHEL 7) |
---|---|---|
启动服务 | service foo start | systemctl start foo.service |
重启服务 | service foo restart | systemctl restart foo.service |
停止服务 | service foo stop | systemctl stop foo.service |
重新加载配置文件(不终止服务) | service foo reload | systemctl reload foo.service |
查看服务状态 | service foo status | systemctl status foo.service |
3. 设置服务开机启动、不启动、查看各级别下服务启动状态等常用命令
foo 服务名
作用 | System V init 命令(RHEL 6) | systemctl 命令(RHEL 7) |
---|---|---|
开机自动启动 | chkconfig foo on | systemctl enable foo.service |
开机不自动启动 | chkconfig foo off | systemctl disable foo.service |
查看特定服务是否为开机自动启动 | chkconfig foo | systemctl is-enabled foo.service |
查看各个级别下服务的启动与禁用情况 | chkconfig --list | systemctl list-unit-files --type=service |
更多推荐
所有评论(0)