centos7系统上firewalld的坑
事故:线上环境中部署的是docker(事先不知道容器的ip地址转发依赖于防火墙)容器,并使用rancher(docker web管理工具)管理的,当自己由于部署zabbix_agentd把防火墙关闭时,容器里的resin服务都不可以访问了
处理过程:立即启动防火墙,然后在rancher web管理界面重启容器
在CentOS7中,引入Firewalld,防火墙守护firewalld服务引入了一个信任级别的概念来管理与之相关联的连接与接口。它支持ipv4与ipv6,并支持网桥,采用firewall-cmd(command)或firewall-config(gui)来动态的管理kernel netfilter的临时或永久的接口规则,并实时生效而无需重启服务
zone
Firewall 能将不同的网络连接归类到不同的信任级别,Zone提供了一下几个级别
- drop:丢弃所有进入的包,而不给出任何响应
- block:拒绝所有外部发起的连接,允许内部发起的连接
- public:允许指定的进入连接
- external:同上,对伪装的进入连接,一般用于路由转发
- dmz:允许受限制的进入连接
- work:允许受信任的计算机被限制的进入连接,类似workgroup
- home:同上,类似homegroup
- internal:同上,范围针对所有互联网用户
- trusted:信任所有连接
过滤规则
- source:根据源地址过滤
- interface:根据网卡过滤
- service:根据服务名过滤
- port:根据端口过滤
- icmp-block:icmp报文过滤,按照icmp类型配置
- masquerade:ip地址伪装
- forward-port:端口转发
- rule:自定义规则
其中,过滤规则的优先级遵循如下顺序1.source
2.interface
3.firewalld.conf
使用方法
systemctl start firewalld #启动
systemctl enable firewalld #开机启动
systemctl stop firewalld #关闭
systemctl disable firewalld #取消开机启动
具体的规则管理,可以使用firewall-cmd,具体的使用方法可以
firewall-cmd --help
--zone=NAME #指定 zone
--permanent #永久修改,--reload 后生效
--timeout=seconds #持续效果,到期后自动移除,用于调试,不能与--permanent 同时使用
1 查看规则
查看运行状态
firewall-cmd --state
查看已被激活的Zone信息
firewall-cmd --get-active-zone
public
interfaces:eth0 eth1
查看指定级别的接口
firewall-cmd --zone=public --list-interfaces
eth0
查看指定级别的所有信息,譬如public
firewall-cmd --zone=public --list-all
public (default,active)
interfaces:eth0
sources:
ports:
masquerade:no
forward-ports:
icmp-blocks:
rich rules:
查看所有级别被允许的信息
firewall-cmd --get-service
查看重启后所有Zones级别中被允许的服务,即永久放行的服务
firewall-cmd --get-service --permanent
2 管理规则
firewall-cmd --panic-on #丢弃
firewall-cmd --panic-off #取消丢弃
firewall-cmd --reload #更新规则,不重启服务
firewall-cmd --complete-reload #更新规则,重启服务
添加某接口至某信任等级,譬如添加eth0至public,永久修改
firewall-cmd --zone=public --add-interface=eth0 --permanent
设置public为默认的信任级别
a 管理端口
列出dmz 级别的被允许的进入端口
firewall-cmd --zone=dmz --list-ports
允许tcp端口8080至dmz级别
firewall-cmd --zone=dmz --add-port=8080/tcp
允许某范围的udp端口至public级别,并永久生效
firewall-cmd --zone=public --add-port=10050-10051/udp --permanent
b 网卡接口
列出public zone所有网卡
firewall-cmd --zone=public --list-interfaces
将eth0添加至public zone,永久
firewall-cmd --zone=public --permanent --add-interface=eth0
eth0存在与public zone,将该网卡添加至work zone,并将之从public zone中删除
firewall-cmd --zone=work --permanent --change-interface=eth0
删除public zone中的eth0,永久
firewall-cmd --zone=public --permanent --remove-interface=eth0
c 管理服务
添加smtp服务至work zone
firewall-cmd --zone=work --add-service=smtp
移除work zone中的smtp服务
firewall-cmd --zone=work --remove-service=smtp
d 配置external zone中的ip地址伪装
查看
firewall-cmd --zone=external --query-masquerade
打开伪装
firewall-cmd --zone=external --add-masquerade
关闭伪装
firewall-cmd --zone=external --remove-masquerade
e 配置public zone的端口转发
打开端口转发,则需要先
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
f 配置public zone的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]
移除 echo-reply 屏蔽
firewall-cmd --zone=public --remove-icmp-block=echo-reply
g IP封禁
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='222.222.222.222' reject"
当然,我们仍然可以通过 ipset 来封禁 ip
封禁 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
倒入 ipset 规则
firewall-cmd --permanent --zone=public --new-ipset-from-file=/path/blacklist.xml
``` bash
然后封禁 blacklist
``` bash
firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist drop'
重新载入以生效
firewall-cmd --reload