Linux防火墙之firewalld

  firewalld常用笔记。

工作机制

  相较于传统的iptables:日常使用过程中支持动态更新,不用重启服务;并加入了常见防火墙的“zone”概念(便于快速切换机器环境,如办公、家庭等)。相比iptables语法更加简明易懂。默认配置文件有两个:

/usr/lib/firewalld/ (系统自带配置,尽量不要修改。如包升级可能需要考虑丢失配置)
/etc/firewalld/ (用户配置地址,优先生效)

  在firewalld运行过程中,对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:

  • 1、source,也就是源地址,优先级最高

  • 2、interface,接收请求的网卡,优先级第二

  • 3、firewalld.conf中配置的默认zone,优先级最低

  这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个,也就是在firewalld.conf中配置的默认zone。

zone简单说明

  • public

  默认接口都在public域,该zone的初始化配置为拒绝流入的数据包,除非与输出流量数据包相关或是ssh,dhcpv6-client服务则允许。

  • dmz

  该zone的初始化配置为拒绝流入的数据包,除非与输出流量数据包相关或是ssh服务则允许。生产环境我们可以使用dmz这个名字,为以后可能存在的单机多域预留扩展。

  (其实,zone只是个便于人为管理和识别的名字而已。)

一般开局

# 查看当前生效规则
firewall-cmd --list-all
firewall-cmd --zone=XXXX --list-all --permanent
# 注:域内多个规则出现冲突时,第一条规则优先生效
# 查看指定接口所属区域
firewall-cmd --get-zone-of-interface=eno16777736
# 将本机设置为dmz
firewall-cmd --set-default-zone=dmz
firewall-cmd --get-default-zone
# 将接口加入域
firewall-cmd --zone=dmz --add-interface=eno16777736
# 查看指定区域打开的端口及服务
firewall-cmd --zone=dmz --list-ports
firewall-cmd --zone=dmz --list-services
# 开启业务需要的服务http(80)
firewall-cmd --zone=dmz --add-service=http --permanent
# 开启自定义端口ssh(60123)
firewall-cmd --remove-service=ssh --permanent
firewall-cmd --add-port=60123/tcp --permanent

# 修改规则后,动态更新
firewall-cmd --reload

# 高级用法
# 当基本的语法规则不能满足要求时,可以使用更复杂的规则
# 1、rich规则
# man 5 firewalld.richlanguage
# 2、direct规则
# man 5 firewalld.direct

# 源IP限制
firewall-cmd --add-rich-rule="rule family="ipv4" source address="114.253.30.102" port protocol="tcp" port="22" accept" --permanent

# 地址转发(NAT)
# 首先需要开启IP伪装
firewall-cmd --permanent --zone=dmz --add-masquerade
# 另外需要确保系统参数IPV4数据转发开启
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

# 端口转发
# 注,如果开启了NAT配置,通过该功能转发的数据包,源地址会变为转发机的IP
firewall-cmd --add-rich-rule="rule family=ipv4 source address="114.253.30.102" forward-port to-addr=10.119.3.253 to-port=11940 protocol=tcp port=11940" --permanent

# direct规则
# 防火墙masquerade状态查看
firewall-cmd --query-masquerade
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.0.0.0/24 -o ens37 -j MASQUERADE
firewall-cmd --complete-reload
# 转发查询
firewall-cmd --direct --get-all-passthroughs
# 组播查询
firewall-cmd --direct --get-all-rules

# 应急:
# 关闭所有对外接口(只推荐本地操作)
firewall-cmd --panic-on

# 彻底重启防火墙(仅在异常时使用)
firewall-cmd --complete-reload
# 业务已经正常运行过程中,如果想要打开防火墙进行设置(之前测试阶段防火墙是关闭的)
# 需要注意只能从配置文件入手(防火墙关闭状态下无法使用命令配置)
# 域信息配置:
vi /etc/firewalld/firewalld.conf
DefaultZone=dmz
# 端口及网卡绑定信息配置:
vi /etc/firewalld/zones/dmz.xml
# 编辑内容格式如下
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>DMZ</short>
  <description>For computers in your demilitarized zone that are publicly-accessible with limited access to your internal network. Only selected incoming connections are accepted.</description>
  <interface name="lo"/>
  <interface name="ens3"/>
  <interface name="ens9"/>
  <service name="ssh"/>
  <port protocol="tcp" port="22"/>
  <port protocol="tcp" port="8066"/>
  <port protocol="tcp" port="9066"/>
  <port protocol="tcp" port="10050"/>
</zone>
# 清除配置
# 可以直接删除下列配置即可
/etc/firewalld/zones/dmz.xml
/etc/firewalld/direct.xml 

# 【特殊】
# direct组播规则配置
vi /etc/firewalld/direct.xml 
# 格式如下
<?xml version="1.0" encoding="utf-8"?>
<direct>
  <rule priority="0" table="filter" ipv="ipv4" chain="INPUT">--in-interface ens3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT</rule>
  <rule priority="0" table="filter" ipv="ipv4" chain="OUTPUT">--out-interface ens3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT</rule>
</direct>

# 按地址段进行规制管理
firewall-cmd --permanent --new-ipset=whitelist-app --type=hash:ip
firewall-cmd --permanent --ipset=whitelist-app --add-entry=10.0.0.2
firewall-cmd --permanent --ipset=whitelist-app --add-entry=10.0.0.3
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source ipset=whitelist-app service name="http" accept'

发表评论

评论列表,共 3 条评论

  • mvkmoypqny
    fmfunuydiiwztvzqxksjvsjenuylfj
  • ousenkwemt
    lsyikvuuutmfzqwgrzrnzuqlgdupmx
  • gpsljyjufg
    jkhmpoxrhksuhzpsueshqysqljqmlj