防火墙管理

防火墙是网络安全中的重要组件,可以过滤非法流量,保护主机和应用免受网络攻击。

firewalld

firewall-cmd 是 firewalld 服务的命令行管理工具。firewalld 是动态防火墙管理器,支持网络/防火墙区域以及临时和永久规则,可以用来查询、添加、修改、删除配置,或重新加载、重启服务。

安装

> yum install -y firewalld
> yum install -y firewall-config   # 图形界面,可选

服务管理

> systemctl start firewalld     # 启动
> systemctl status firewalld    # 查看当前状态
> systemctl enable firewalld    # 开机自启
> systemctl stop firewalld      # 停止
> systemctl disable firewalld   # 取消开机自启
> firewall-cmd --state          # 查看防火墙是否运行

查看规则

> firewall-cmd --list-ports           # 已开放的端口
> firewall-cmd --list-services        # 已开放的服务
> firewall-cmd --list-all             # 当前区域的完整规则
> firewall-cmd --get-default-zone     # 默认区域
> firewall-cmd --get-active-zones     # 生效中的区域

开放端口

# 对所有人开放 5000/tcp(永久生效)
> firewall-cmd --zone=public --add-port=5000/tcp --permanent

# 开放端口范围
> firewall-cmd --zone=public --add-port=6400-6499/tcp --permanent

# 开放服务
> firewall-cmd --zone=public --add-service=http --permanent

# 关闭端口
> firewall-cmd --zone=public --remove-port=5000/tcp --permanent

# 重新加载,使永久规则生效
> firewall-cmd --reload

按来源限制访问

# 仅允许 192.168.0.0/24 网段访问 22 端口
> firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=192.168.0.0/24 port port=22 protocol=tcp accept'

# 删除规则时,规则内容必须与添加时完全一致
> firewall-cmd --permanent --remove-rich-rule 'rule family=ipv4 source address=192.168.0.0/24 port port=22 protocol=tcp accept'

> firewall-cmd --reload

端口映射

# 添加:将本机 6106 端口转发到 5006
> firewall-cmd --permanent --add-forward-port=port=6106:proto=tcp:toport=5006

# 删除:内容与添加时一致
> firewall-cmd --permanent --remove-forward-port=port=6106:proto=tcp:toport=5006

# 启用新配置
> firewall-cmd --reload

如需转发到其他主机,在参数中追加 :toaddr=192.168.1.10。

提示

也可以直接修改 /etc/firewalld/zones/public.xml 来维护规则,然后执行 firewall-cmd --reload 重新加载。

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <port protocol="tcp" port="6400-6499"/>
  <forward-port to-port="22" protocol="tcp" port="6400"/>
  <forward-port to-port="8080" protocol="tcp" port="6401"/>
</zone>
临时规则与永久规则

不加 --permanent 的规则立即生效,但重启后失效;加 --permanent 的规则需要执行 firewall-cmd --reload 才会生效。

iptables

iptables 是 Linux 中配置网络流量规则的工具,可以按 IP、端口、协议等条件允许或拒绝流量。firewalld 与 iptables 不能同时使用,使用 iptables 前需先停止并禁用 firewalld。

# 保存规则依赖 iptables-services
> yum install -y iptables-services

# 查看防火墙规则
> iptables -L -n -v

# 放行 22 端口
> iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 删除规则
> iptables -D INPUT -p tcp --dport 22 -j ACCEPT

# 保存规则(重启后仍生效)
> service iptables save

SELinux 端口管理

semanage(Security Enhanced Linux Manage)用于配置 SELinux 策略,可调整端口上下文、布尔值、文件上下文等,常用于修改服务绑定的非默认端口。

# 安装(CentOS 7)
> yum install -y policycoreutils-python

# 查看已允许的端口
> semanage port -l | grep http_port_t

# 添加允许端口(参数 -a)
> semanage port -a -t http_port_t -p tcp 8888

# 修改已有端口(参数 -m)
> semanage port -m -t http_port_t -p tcp 8888

# 删除允许端口(参数 -d)
> semanage port -d -t http_port_t -p tcp 9090

参考