防火墙:firewalld

一、firewalld的9个zone

通过将网络划分成不同的区域(通常情况下称为zones),制定出不同区域之间的访问控制策略来控制不同程度区域间传送的数据流。

例如:公共 WIFI 网络连接应该不信任,而家庭有线网络连接就应该完全信任。

使用这个命令可以列出它们:

firewall-cmd --get-zones
block drop work internal external home dmz public trusted

drop:(丢弃)
任何接受的网络数据包都被丢弃,不回复。只能出站不能入站。
block:(限制)
任何接受的连接都被IPv4的icmp-host-prohibited信息和IPv6的icmp-adm-prohibited信息拒绝。
public:(公共)
公共区域,允许指定的进入连接。
external:(外部)
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz:(非军事区)
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work:(工作区)
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home:(家庭)
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal:(内部网络)
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted:(信任)
可接受所有的网络连接。

简单语法

  • drop:丢弃 reject:拒绝访问,会给来源网路一条提示 accept:允许访问
  • --permanent:永久生效,如果不加及时生效,但系统重启或服务重启后该条规则失效。 要使命令既是持久性的,又是立即生效的,请输入命令两次:一次使用--permanent,一次不使用。这是因为firewalld重新载入比重复命令需要更多时间,因为它必须重新载入所有配置文件并重新创建整个防火墙配置。重新加载时,出于安全原因,内置链的策略设置为DROP,然后在最后重置为ACCEPT。重新加载期间可能会造成服务中断。
  • firewall-cmd --reload:重载服务使规则生效(每次permanent操作后都需要执行,不然不及时生效)。
  • --add-:添加服务
  • --remove-:移除服务
  • --zone=:指定zone

二、管理端口(port)

列出dmz配置的端口

firewall-cmd --zone=dmz --list-ports

将8080端口的tcp 协议添加至dmz

firewall-cmd --zone=dmz --add-port=8080/tcp

允许某范围端口的udp协议在public,并永久生效

firewall-cmd --zone=public --add-port=5060-5059/udp --permanent

三、管理服务(service)

添加 smtp 服务至 work zone

firewall-cmd --zone=work --add-service=smtp

四、管理IP

1. 简单的管理

# 拒绝一个IP
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='222.222.222.222' reject"

# 拒绝IP段
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='222.222.222.0/24' reject"

2. 针对某一端口管理

在某个端口管理IP

firewall-cmd --permanent --zone=public  --add-rich-rule="rule family=ipv4 source address=192.168.1.2 port port=80  protocol=tcp  accept"

在某个端口管理IP段

firewall-cmd --permanent --zone=public  --add-rich-rule="rule family=ipv4 source address=192.168.1.2/24 port port=80  protocol=tcp  accept"

3. ipset

有的时候,需要封禁的IP比较多,我们不可能都直接添加到zone里边去,否则的话查看起来非常费力,而这个时候就可以通过ipset来定义。

查看有哪些ipset:

firewall-cmd --get-ipsets

添加IP或IP段到ipset,指定zone:

# 添加IP
firewall-cmd --permanent --zone=public --new-ipset=blacklist --type=hash:ip
firewall-cmd --permanent --zone=public --ipset=blacklist --add-entry=222.222.222.222

# 添加网段
firewall-cmd --permanent --zone=public --new-ipset=blacklist --type=hash:net
firewall-cmd --permanent --zone=public --ipset=blacklist --add-entry=222.222.222.0/24

将规则进行限制处理:

# 针对zone配置规则封禁 blacklist
firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist drop'

# 针对zone的某一端口配置规则
firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist port port=80 protocol=tcp drop'

需要注意的一点是,添加的ipset规则需要和开放的服务在同一个zone。
例如,如果开放的服务在public zone,而你针对这个服务的ipset限制规则放在drop zone,则该条规则不会生效,因为它在public zone中已经被放行。

查看指定的ipset列表

# 使用
firewall-cmd --ipset=blacklist --get-entries
# 或者
firewall-cmd --info-ipset=blacklist

从一个包含IP地址列表的文件添加ipset规则:

cat > iplist.txt <<EOL
192.168.0.2
192.168.0.3
192.168.1.0/24
192.168.2.254
EOL

# 然后执行:
firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=iplist.txt

针对ipset配置文件操作:

# 首先复制备份
cp /etc/firewalld/ipsets/blacklist.xml ./

# 删除ipset规则的配置文件(不删除规则)
firewall-cmd --permanent --zone=public --delete-ipset=blacklist

# 此时查看/etc/firewalld/ipsets/目录下已经没有了blacklist,但规则中还存在。然而由于配置文件已经没有了,所以该条规则是无效的。

# 然后我们可以从一个配置文件导入规则,如果不是之前的备份文件,则需要注意文件内容的语法
firewall-cmd --permanent --zone=public --new-ipset-from-file=/root/blacklist.xml

五、ip 地址伪装

查看

firewall-cmd --zone=external --query-masquerade

打开伪装

firewall-cmd --zone=external --add-masquerade

六、端口转发

要打开端口转发,则需要先
firewall-cmd --zone=public --add-masquerade

然后转发 tcp 22 端口至 3753

firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=3753

转发 22 端口数据至另一个 ip 的相同端口上

firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toaddr=192.168.1.100

转发 22 端口数据至另一 ip 的 2055 端口上

firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.100

七、icmp

查看所有支持的 icmp 类型

firewall-cmd --get-icmptypes

destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded

列出

firewall-cmd --zone=public --list-icmp-blocks

添加 echo-request 屏蔽

firewall-cmd --zone=public --add-icmp-block=echo-request [--timeout=seconds]

八、管理网卡

列出 public zone 所有网卡

firewall-cmd --zone=public --list-interfaces

将网卡配置到一个zone:

firewall-cmd --permanent --zone=public --add-interface=ens33

# 列出网卡
firewall-cmd --zone=public --list-interfaces
ens33

改变网卡的zone(会在之前的zone中删除网卡):

firewall-cmd --zone=work --permanent --change-interface=ens33

# 有趣的是,我并没有执行change,而是直接--add-interface=ens33到--zone=work中也是可以直接改变的:
firewall-cmd --permanent --zone=work --add-interface=ens33
The interface is under control of NetworkManager, setting zone to 'work'.
success

此时再次查看public zone,已经没有了网卡:

firewall-cmd --zone=public --list-interfaces

标签: 防火墙

添加新评论