Linux 下如何设置防火墙,你会吗
<p><img title="Linux 下如何设置防火墙,你会吗" alt="Linux 下如何设置防火墙,你会吗" border="0" src="https://zhuji.jb51.net/uploads/img/202305/b928eb4ca763a8bc2e81575a610fd7f2.jpg"></p>
<p>
防火墙,顾名思义,就是用一睹墙隔绝了外部的攻击,让墙里面的环境相对安全
</p>
<p>
在 Linux 中,防火墙是以一个守护进程的方式存在,服务的名字是 firewalld,它能够定义一组规则来控制外部传入系统中的网络流量,规则允许的流量才能进入系统,规则禁止的流量会被拦下
</p>
<h3>
简介
</h3>
<p>
firewalld 提供了一个动态定制规则的方式,我们可以实时 创建、更改和删除规则
</p>
<p>
firewalld 使用区域和服务的概念来简化流量管理。区域是预定义的规则集,网络接口可以分配给区域。流量能否进入主机取决于计算机连接的网络以及为网络设置的安全级别。所有预定义的规则,对各服务的传入流量,都有一些必要的设置
</p>
<p>
服务是通过端口和外部应用通讯的,而防火墙就是根据端口进行流量过滤的,Linux 的防火墙默认是关闭所有端口的,如果要允许服务和外部应用进行通讯,必须开启服务的端口,但是某些区域 ( 例如:trusted ),默认是允许所有流量通过的
</p>
<ul>
<li>
区域
</li>
</ul>
<p>
防火墙能够根据用户设置的信任级别把网络划分成许多的区域,一个网络连接只能归属于一个区域,一个区域能容纳很多的网络连接
</p>
<p>
系统默认的所有区域存储在 /usr/lib/firewalld/zones 目录中,它们可以应用在网络接口上 , 下面的截图展示了各区域默认配置
</p>
<p>
<img title="Linux 下如何设置防火墙,你会吗" alt="Linux 下如何设置防火墙,你会吗" border="0" src="https://zhuji.jb51.net/uploads/img/202305/5bea12f53fc3b5b7893455da2334940b.jpg"></p>
<p>
block : 对于外部主动主动发起的连接,主机会返回一个 icmp 包来拒绝,但主机可以向外部主动发起连接
</p>
<p>
dmz: 非军事区域内的计算机可以公开访问,但是对于内部网络,只接受指定的连接
</p>
<p>
drop:对于传入的网络数据包,主机直接拒接,不返回任何消息包,只允许从主机传出数据包
</p>
<p>
external:用于使用伪装的外部网络,尤其是路由器,为了防止网络中其他计算机的攻击,仅接受指定的传入连接
</p>
<p>
home: 用于在家里使用,此时,对于网络中的计算机,大多比较信任,也是仅接受指定的传入连接
</p>
<p>
internal:用于内部网络,此时,对于网络中的计算机,大多比较信任,也是仅接受指定的传入连接
</p>
<p>
public:用于公共区域,此时,不能信任网络中的计算机,仅接受指定的传入连接
</p>
<p>
trusted:接受所有的网络连接
</p>
<p>
work:用于工作区域,此时,对于网络中的计算机,大多比较信任,但也仅接受指定的传入连接
</p>
<p>
在上述区域中,public 是安装防火墙时默认的区域,当有网络连接到达时,会将它分配到默认区域里
</p>
<h3>
安装
</h3>
<p>
一般发行版的 Linux 都预装了防火墙,如果没有装的话,可以使用下面的命令进行安装
</p>
<ol class="dp-sql">
<li class="alt">
<span><span>yum install firewalld -y </span></span>
</li>
</ol>
<p>
启动、关闭防火墙
</p>
<ol class="dp-sql">
<li class="alt">
<span><span>systemctl start firewalld # 启动防火墙服务 </span></span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span>systemctl stop firewalld # 关闭防火墙服务 </span>
</li>
</ol>
<p>
设置开机启动、禁止开机启动
</p>
<ol class="dp-sql">
<li class="alt">
<span><span>systemctl enable firwalld # 开机启动防火墙服务 </span></span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span>systemctl disable firwalld # 禁止开机启动防火墙服务 </span>
</li>
</ol>
<h3>
常用选项
</h3>
<p>
firewall-cmd 是防火墙配置管理工具,它的参数较多,下表列出常用的参数及作用,更多参数自行通过 man 命令进行查看
</p>
<table break-word overflow-wrap: border-box box-sizing: justify text-align: letter-spacing: font-size: sans-serif arial yahei ui gb sans sc neue helvetica data-source-line="78">
<thead><tr>
<th>
选项
</th>
<th>
说明
</th>
</tr></thead>
<tbody>
<tr>
<td>
--state
</td>
<td>
防火墙开启状态
</td>
</tr>
<tr>
<td>
--reload
</td>
<td>
重新加载防火墙规则
</td>
</tr>
<tr>
<td>
--get-default-zone
</td>
<td>
获取默认区域
</td>
</tr>
<tr>
<td>
--set-default-zone=xxx
</td>
<td>
设置默认区域为 xxx
</td>
</tr>
<tr>
<td>
--list-all --zone=xxx
</td>
<td>
列出 xxx 区域中所有允许的子项
</td>
</tr>
<tr>
<td>
--list-all-zones
</td>
<td>
列出所有区域中所有允许的子项
</td>
</tr>
<tr>
<td>
--permanent --new-zone=xxx
</td>
<td>
增加一个永久的新区域
</td>
</tr>
<tr>
<td>
--permanent --delete-zone=xxx
</td>
<td>
移除一个已存在的永久区域
</td>
</tr>
<tr>
<td>
--list-ports --zone=xxx
</td>
<td>
列出 xxx 区域中添加的端口
</td>
</tr>
<tr>
<td>
--add-port=x --zone=xxx
</td>
<td>
xxx 区域中添加 x 端口
</td>
</tr>
<tr>
<td>
--remove-port=x --zone=xxx
</td>
<td>
xxx区域中移除 x 端口
</td>
</tr>
<tr>
<td>
--query-port=x --zone=xxx
</td>
<td>
查询 xxx 区域中是否已添加 x 端口
</td>
</tr>
<tr>
<td>
--list-services=x --zone=xxx
</td>
<td>
列出 xxx 区域中所有允许的服务器
</td>
</tr>
<tr>
<td>
--query-service=x --zone=xxx
</td>
<td>
查询是否允许 xxx 区域中 x 服务的流量
</td>
</tr>
<tr>
<td>
--add-service=x --zone=xxx --timeout= t
</td>
<td>
允许 xxx 区域中 x 服务的流量,超时时间 t
</td>
</tr>
<tr>
<td>
--remove-service=x --zone=xxx
</td>
<td>
从 xxx 区域中移除 x 服务<br>
</td>
</tr>
</tbody>
</table>
<h3>
常用操作
</h3>
<ul>
<li>
运行时和永久
</li>
</ul>
<p>
对防火墙规则的修改有运行时和永久两种模式
</p>
<p>
运行时模式又称为当前生效模式,是默认的模式,它在防火墙服务重新加载、重启服务,重启系统时会失效
</p>
<p>
--permanent 是设置永久的选项,设置之后不会立马生效,需要重启服务、重新加载防火墙服务或者系统重启才生效
</p>
<p>
没有 --permanent 选项,修改的仅仅是运行时的配置,另外,--permanent 选项并不是对所有的选项都有效
</p>
<p>
如果要运行时和永久都生效的话,需要运行时和永久性各设置一次,也即 运行时不带 --permanent ,而永久性时则需添加该选项
</p>
<p>
例如:现在设置 public 区域允许 80 端口 TCP 流量通过,并且运行时和永久性都都生效,具体的设置如下
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--zone=public --list-port --permanent </span><span></span></span>
</li>
<li>
<span># firewall-cmd <span class="comment">--zone=public --list-port</span><span> </span></span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=public --add-port=80/tcp </span><span></span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=public --add-port=80/tcp --permanent </span><span></span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=public --list-port --permanent </span><span></span></span>
</li>
<li>
<span>80/tcp </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=public --list-port</span><span> </span></span>
</li>
<li>
<span>80/tcp </span>
</li>
</ol>
<p>
设置之前,运行时和永久都禁止 80 端口的流量通过,设置后,都允许通过,--add-port=80/tcp 是设置运行时,--add-port=80/tcp --permanent 是设置永久
</p>
<ul>
<li>
查看防火墙状态
</li>
</ul>
<p>
防火墙未启用
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--state</span><span> </span></span>
</li>
<li>
<span><span class="op">not</span><span> running </span></span>
</li>
</ol>
<p>
防火墙已启用
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--state</span><span> </span></span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span>running </span>
</li>
</ol>
<ul>
<li>
重新加载
</li>
</ul>
<p>
--reload 选项是重新加载防火墙规则,并保持活跃连接的状态
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--reload</span><span> </span></span>
</li>
<li>
<span>success </span>
</li>
</ol>
<p>
需要注意的是,重新加载会导致已经添加的运行时的规则丢失
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--zone=public --add-port 80/tcp</span><span> </span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=public --list-port </span><span></span></span>
</li>
<li>
<span>80/tcp </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--reload</span><span> </span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=public --list-port</span><span> </span></span>
</li>
<li>
<span># </span>
</li>
</ol>
<p>
上面的示例中,先设置 public 区域允许 80 端口通过 TCP 协议的流量,通过 --zone=public --list-port 选项的结果确认设置成功了
</p>
<p>
重新加载防火墙规则,然后再次查询 public 区域中所有已经允许流量通过的端口号,从上述结果中可以知道之前的设置丢失了
</p>
<p>
要想重新加载之后配置依然生效的话,需要添加永久选项 --permanent
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--zone=public --add-port 80/tcp --permanent</span><span> </span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=public --list-port --permanent</span><span> </span></span>
</li>
<li>
<span>80/tcp </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--reload</span><span> </span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=public --list-port --permanent</span><span> </span></span>
</li>
<li>
<span>80/tcp </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=public --list-port</span><span> </span></span>
</li>
<li>
<span>80/tcp </span>
</li>
</ol>
<p>
可以看到,在添加了 --permanent 选项后,重新加载防火墙规则,之前的设置依然是有效的,所以,如果想要添加的规则永久生效,需要加上 --permanent 选项
</p>
<ul>
<li>
当前默认区域
</li>
</ul>
<p>
新的网络连接,默认是分配到防火墙 public 区域的,这个默认区域可以通过下面的命令获取
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--get-default-zone</span><span> </span></span>
</li>
<li>
<span><span class="keyword">public</span><span> </span></span>
</li>
</ol>
<p>
下面的命令是设置默认区域为 public,由于当前默认区域已经是 public 了,所以会提示当前默认区域已经是 public
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--set-default-zone=public</span><span> </span></span>
</li>
<li>
<span>Warning: ZONE_ALREADY_SET: <span class="keyword">public</span><span> </span></span>
</li>
</ol>
<ul>
<li>
列出所有可用的区域
</li>
</ul>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--get-zones</span><span> </span></span>
</li>
<li>
<span>block dmz <span class="keyword">drop</span><span> external home internal </span><span class="keyword">public</span><span> trusted </span><span class="keyword">work</span><span> </span></span>
</li>
</ol>
<ul>
<li>
添加和删除新区域
</li>
</ul>
<p>
添加一个新的永久的区域 myzone,添加新区域需要加上 --permanent 选项,之后再重新加载一下就可以生效了
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--new-zone=myzone --permanent</span><span> </span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--reload</span><span> </span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=myzone --list-all</span><span> </span></span>
</li>
<li>
<span>myzone </span>
</li>
<li class="alt">
<span>interfaces: </span>
</li>
<li>
<span>sources: </span>
</li>
<li class="alt">
<span>services: </span>
</li>
<li>
<span>ports: </span>
</li>
<li class="alt">
<span>masquerade: <span class="keyword">no</span><span> </span></span>
</li>
<li>
<span><span class="keyword">forward</span><span>-ports: </span></span>
</li>
<li class="alt">
<span>icmp-blocks: </span>
</li>
<li>
<span>rich rules: </span>
</li>
</ol>
<p>
移除区域 myzone,同样,移除一个已存在的区域也需要加上 --permanent 选项,并且需要重新加载才会生效
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--delete-zone=myzone --permanent</span><span> </span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--reload</span><span> </span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=myzone --list-all</span><span> </span></span>
</li>
<li>
<span>Error: INVALID_ZONE: myzone </span>
</li>
</ol>
<ul>
<li>
查询区域允许的服务和端口
</li>
</ul>
<p>
使用 --list-all 选项可查询默认区域中允许的服务以及端口, 下面的结果中 services 和 ports 分别表示允许的服务和端口
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--list-all</span><span> </span></span>
</li>
<li>
<span><span class="keyword">public</span><span> (</span><span class="keyword">default</span><span>, active) </span></span>
</li>
<li class="alt">
<span>interfaces: ens33 </span>
</li>
<li>
<span>sources: </span>
</li>
<li class="alt">
<span>services: dhcpv6-client samba-client ssh </span>
</li>
<li>
<span>ports: 80/tcp </span>
</li>
<li class="alt">
<span>masquerade: <span class="keyword">no</span><span> </span></span>
</li>
<li>
<span><span class="keyword">forward</span><span>-ports: </span></span>
</li>
<li class="alt">
<span>icmp-blocks: </span>
</li>
<li>
<span>rich rules: </span>
</li>
</ol>
<p>
如果需要查询指定区域所有允许的服务和端口,可以加上 --zone = xxx 选项, xxx 表示指定的区域,比如:下面的命令是查询 trusted 区域允许的服务和端口
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--zone=trusted --list-all</span><span> </span></span>
</li>
<li>
<span>trusted </span>
</li>
<li class="alt">
<span>interfaces: </span>
</li>
<li>
<span>sources: </span>
</li>
<li class="alt">
<span>services: </span>
</li>
<li>
<span>ports: </span>
</li>
<li class="alt">
<span>masquerade: <span class="keyword">no</span><span> </span></span>
</li>
<li>
<span><span class="keyword">forward</span><span>-ports: </span></span>
</li>
<li class="alt">
<span>icmp-blocks: </span>
</li>
<li>
<span>rich rules: </span>
</li>
</ol>
<ul>
<li>
查看是否允许指定服务的流量通过
</li>
</ul>
<p>
不指定区域时,默认区域是 public, 下面是查看默认区域是否允许 SSH 以及 HTTPS 流量
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--query-service=ssh</span><span> </span></span>
</li>
<li>
<span>yes </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--query-service=https</span><span> </span></span>
</li>
<li>
<span><span class="keyword">no</span><span> </span></span>
</li>
</ol>
<p>
如果查看其它区域,则需要指定具体的区域
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--zone=public --query-service=ssh</span><span> </span></span>
</li>
<li>
<span>yes </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--zone=trusted --query-service=ssh</span><span> </span></span>
</li>
<li>
<span><span class="keyword">no</span><span> </span></span>
</li>
</ol>
<ul>
<li>
允许和禁止指定服务的流量通过
</li>
</ul>
<p>
public 区域允许 samba-client 服务的流量通过
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--add-service=samba-client --zone=public </span><span></span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--query-service=samba-client --zone=public</span><span> </span></span>
</li>
<li>
<span>yes </span>
</li>
</ol>
<p>
public 区域禁止 samba-client 服务的流量
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--remove-service=samba-client --zone=public </span><span></span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--query-service=samba-client --zone=public </span><span></span></span>
</li>
<li>
<span><span class="keyword">no</span><span> </span></span>
</li>
</ol>
<ul>
<li>
查看是否允许指定端口的流量通过
</li>
</ul>
<p>
查看 public 区域所有允许的端口
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--list-port --zone=public </span><span></span></span>
</li>
<li>
<span>80/tcp 6379/tcp 6000-6010/tcp </span>
</li>
</ol>
<p>
查看 public 区域是否允许 6379 端口的 TCP 流量通过
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--list-port --zone=public </span><span></span></span>
</li>
<li>
<span>80/tcp 6379/tcp 6000-6010/tcp </span>
</li>
</ol>
<ul>
<li>
允许和禁止指定端口的流量通过
</li>
</ul>
<p>
public 区域允许 8080 端口的 TCP 流量通过,也可以理解为对外开启 8080 端口
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--add-port=8080/tcp --zone=public </span><span></span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--list-port --zone=public </span><span></span></span>
</li>
<li>
<span>80/tcp 6379/tcp 8080/tcp 6000-6010/tcp </span>
</li>
</ol>
<p>
public 区域禁止 8080 端口的 TCP 流量
</p>
<ol class="dp-sql">
<li class="alt">
<span><span># firewall-cmd </span><span class="comment">--remove-port=8080/tcp --zone=public</span><span> </span></span>
</li>
<li>
<span>success </span>
</li>
<li class="alt">
<span># firewall-cmd <span class="comment">--list-port --zone=public </span><span></span></span>
</li>
<li>
<span>80/tcp 6379/tcp 6000-6010/tcp </span>
</li>
</ol>
<h3>
小结
</h3>
<p>
本文讲解了 Linux 中的防火墙服务 firewalld 的一些常用操作,防火墙作为公网与内网之间的流量屏障,对系统至关重要,所以,熟练掌握防火墙的知识是很有必要的
</p>
<p>
原文链接:https://mp.weixin.qq.com/s/BIOySoD4J63oSyXfd9tWtQ
</p>
頁:
[1]