【Linux安全管理】Firewalld详解
目录
1、与iptables不同
- firewalld采用区域和服务管理,而不是链式规则
- 动态管理规则,允许更新规则而不破坏原有会话与连接
2、配置防火墙
- firewall-cmd 命令行模式 推荐使用
- firewall-config(如果没装图形化界面就不行)
- vi /etc/firewalld/firewalld.conf
# (查看状态) # firewall-cmd --state #(更新配置) # firewall-cmd --reload
3、firewalld区域概念
zone
- trusted 信任区域 默认允许所有流量传入
- public 公共区域 (默认区域)默认允许ssh 服务 dhcp
- external 外部区域 默认允许ssh其余均拒绝
- home 家庭区域 有ssh, 预定于服务等
- internal 内部区域 默认允许ssh 服务 dhcp服务等
- work 工作区域 默认ssh
- dmz 隔离区
- block 限制区域 默认拒绝所有流量传入
- drop 丢弃区域 默认丢弃所有流量传入
工作原理:
管理数据包时:
1、先根据数据包的源IP进行相应区域的防火墙规则匹配; 如果源地址关联到特定的区域,则按特定区域的规则执行; 如果未关联到特定的区域,则按默认区域的规则执行。
2、根据传入的网络接口,进行相应区域的防火墙规则匹配; 如果源地址关联到特定的区域,则按特定区域的规则执行; 如果未关联到特定的区域,则按默认区域的规则执行。
绑定源地址的区域规则> 网卡绑定的区域规则> 默认区域规则
4、filewalld 配置生效
运行时配置:
- 不中断现有连接
- 不能修改服务配置
永久配置
- 不立即生效,除非重启或者重新加载配置
- 不中断现有连接
- 可以修改服务配置
- 注意:添加--permanent选项,表示永久配置,但是需要重启firewalld或者重新加载--reload,如果 不带这个选项,则表示用于设置运行时配置,这些规则在系统重启,firewalld重启,或者重新加载后失 效,需要将运行时配置永久生效,则需要将运行时配置规则写入配置文件中,执行firewall-cmd -- runtime-to-permanent。
5、firewalld服务
# systemctl status firewalld # systemctl start firewalld # systemctl enable firewalld
# 显示所有可用区域 # firewall-cmd --get-zones # 显示当前默认区域 # firewall-cmd --get-default-zone # 设置默认区域 # firewall-cmd --set-default-zone=public # 显示当前使用的区域和对应网卡 # firewall-cmd --get-active-zones # 显示指定接口绑定的区域 # firewall-cmd --get-zone-of-interface=ens33 # 为指定接口绑定区域 # firewall-cmd --zone=dmz --add-interface=ens37 # 为指定的区域更改绑定的网络接口 # firewall-cmd --zone=dmz --change-interface=ens33 # 为指定的区域删除绑定的网络接口 # firewall-cmd --zone=dmz --remove-interface=ens37 # 查看默认区域设置 # firewall-cmd --list-all # 查看指定的区域设置 # firewall-cmd --zone=dmz --list-all # 显示指定区域可以访问的服务 # firewall-cmd --zone=public --list-services # 显示系统预定义的服务名 # firewall-cmd --get-service # 为指定区域添加允许访问的服务 # firewall-cmd --zone=public --add-service=http # 为指定区域删除允许访问的服务 # firewall-cmd --zone=public --remove-service=http # 添加多个服务 # firewall-cmd --zone=public --add-services={http,https,redis,ssh} # 永久生效,运行时配置结束后统一执行 # firewall-cmd --runtime-to-permanent # 永久生效,需要在设置时加--permanent选项,但是并不是运行时生效,需要重启启动firewalld或者重 新reload # firewall-cmd --permanent --zone=public --add-services=http # firewall-cmd --reload 或者 systemctl restart firewalld # 显示指定域中允许访问的端口 # firewall-cmd --zone=public --list-port # 位指定域中添加允许访问的端口 # firewall-cmd --zone=public --add-port=22/tcp --add-port=80-100/tcp #位指定域中删除允许访问的端口 # firewall-cmd --zone=public --remove-port=22/tcp --remove-port=80-100/tcp
如果执行命令显示success但是效果没有出现,使用firewall-cmd --reload
firewalld 端口映射
# 设置禁止来源IP为192.168.100.134的ip地址访问 # firewall-cmd --add-source=192.168.100.134/24 --zone=drop --类似于iptables中 DROP # firewall-cmd --add-source=192.168.100.134/24 --zone=block --类似于iptables中 REJECT # 设置允许来源IP为192.168.100.134的ip地址访问 # firewall-cmd --add-source=192.168.100.134/24 --zone=trusted # 地址转发端口映射 # firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 # firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.100.134 (在访问添加了这个规则的ip的数据包会转发到192.168.100.134的80端口)
当你修改了http配置文件(改端口为8080,并且重启了httpd),也添加了转发端口映射,查看服务也有http服务,为什么curl还是不通?
因为没对外没有提供相应的8080端口;
虽然系统起的是8080端口,但是对外来说我们的端口是80端口,必须通过80端口连进来,在、才能经过映射访问到8080端口;
所以没添加8080端口,却访问了8080端口是不行的;
如果添加了8080端口,直接用8080端口进行httpd访问,而不是通过连接80端口再经端口映射转发从8080端口进行访问;
富规则 rich-rule
只用firewalld的服务以及端口进行配置的时候限制比较多;为了解决这一问题,所以用富规则;
# 查看帮助手册 # man 5 firewalld.richlanguage # 列出富规则 # firewall-cmd --list-rich-rule # 添加富规则 # firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.100.134" accept' (添加富规则,允许192.168.100.134访问) # firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.100.134" port port=22 protocol=tcp reject' (拒绝来自这个ip的22端口的访问) # 删除富规则 # firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.100.134" forward-port port=80 protocol=tcp to-port=8080 '
请求连接时被拒绝;