firealld 定义防火墙配置
firewalld zone分类
dmz 非军事区(Demilitarized Zone)
两道防火墙,可以被外部用户访问的主机放在第一道防火墙里,其他不能被外部访问的主机放到第二道防火墙里,如果是一道防火墙的话,可以被外部访问的主机,和不能被外部访问的主机放在了同一个局域网中,可能会带来安全风险,万一可以被外部访问的主机被黑客攻击,这些主机就可能被当做跳板机访问内部的其他主机,中间的区域就叫DMZ,
firewalld配置
firewall-cmd --get-services 查看预定义服务列表
/usr/lib/firewalld/services/*.xml预定义服务的配置
三种配置方法
firewall-config (firewall-config包)图形工具
firewall-cmd (firewalld包)命令行工具
/etc/firewalld 配置文件,一般不建议
一、firewall-config (firewall-config包)图形工具
前提要求,firewalld 服务是开启状态
默认区域是public ,当开启firewalld这个服务没有明确允许的都默认拒绝,有打钩的可以访问,没打勾的默认拒绝,打钩及时生效,但只是在内存里生效,没有保存,需要永久生效的话,将Configuration后面的Runtime 改为Permanent
Runtime:能生效不保存
Permanent:能保存不生效
Permanent上点击了对应的服务如果不生效的话,还可以点击Options里的Reload Firewalld重新生效,或者换到字符界面重启防火墙或systemctl reload firewalld重读使其生效
默认的是服务固定的端口,例如http对应80,
通过直接搜索到对应的name,如我这是http8080,点击Add添加端口,点击Options里的Reload Firewalld重新生效
二、firewall-cmd (firewalld包)命令行工具
1、列出所有可用区域
firewall-cmd --get-zones
2、查询默认区域
firewall-cmd --get-default-zone
3、设置默认区域trusted(trusted允许所有流量)
firewall-cmd --set-default-zone=trusted
4、列出当前正使用的区域
firewall-cmd --get-active-zones
5、允许服务的流量通过,如果无--zone= 选项,使用默认区域(如ftp)
firewall-cmd --add-service=ftp
6、列出允许访问的服务
firewall-cmd --list-services
7、查看开放的端口
firewall-cmd --list-ports
8、在internal zone中增加源地址192.168.0.0/24的永久规则
firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
9、在internal zone(internal 区域)中增加协议mysql的永久规则
firewall-cmd --permanent –zone=internal --add-service=mysql
10、添加非标端口如tcp8080
firewall-cmd --permanent --zone=public --add-port=8080/tcp
以上不加 --Permanent均为临时生效,重启服务后会自动丢失,永久保存在服务后面添加 --Permanent(注意是保存,不会生效,)(Tab键可以自动补全)
firewall-cmd --add-service=ftp --permanent
加载新规则,重新生效, --Permanent不会立即生效,通过这个命令可以立即生效
firewall-cmd --reload
禁用iptables,手动起不来
systemctl mask iptables
针对上面禁用iptables服务,通过unmask可以关闭mask,可以通过正常启动服务开启
systemctl unmask firewalld
三、配置文件
/etc/firewalld/zones/public.xml
Permanent里面打钩的会自动保存在这个里面,取消打钩会自动删除里面的对应行
其它规则
当基本firewalld语法规则不能满足要求时,可以使用以下更复杂的规则
rich-rules 富规则,功能强,表达性语言
Direct configuration rules 直接规则,灵活性差
帮助:man 5 firewalld.direct
1、拒绝从192.168.0.11的所有流量,当address 选项使用source 或 destination时,必须用family= ipv4 |ipv6
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'
2、限制每分钟只有两个连接到ftp服务
firewall-cmd --add-rich-rule=‘rule service name=ftp limit value=2/m accept’
3、抛弃esp( IPsec 体系中的一种主要协议)协议的所有数据包
firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop'
4、接受所有192.168.1.0/24子网端口5900-5905范围的TCP流量
firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=5900-5905 protocol=tcp accept'
rich日志规则
log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]
<LOGLEVEL> 可以是emerg,alert, crit, error, warning, notice, info, debug.
<DURATION> s:秒, m:分钟, h:小时, d:天
audit [limit value="<RATE/DURATION>"]
rich日志规则实例
接受ssh新连接,记录日志到syslog的notice级别,每分钟最多三条信息
firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh " level="notice" limit value="3/m" accept
从2001:db8::/64子网的DNS连接在5分钟内被拒绝,并记录到日志到audit,每小时最大记录一条信息
firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.0 service name="http" log level=notice prefix="NEW HTTP " limit value="3/s" accept'
伪装和端口转发
NAT网络地址转换,firewalld支持伪装和端口转发两种NAT方式
伪装NAT
firewall-cmd --permanent --zone=<ZONE> --add-masquerade
检查是否允许伪装
firewall-cmd --query-masquerade
允许防火墙伪装IP
firewall-cmd --add-masquerade
禁止防火墙伪装IP
firewall-cmd --remove-masquerade
示例:从192.168.0.0这个网段过来的数据,就允许伪装,通过本机的某一个网卡连接到互联网上去
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
端口转发
端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口。通常要配合地址伪装才能实现
firewall-cmd --permanent --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>]
说明:toport= 和toaddr= 至少要指定一个
示例:
转发传入的连接9527/TCP,到防火墙的80/TCP到public zone 的192.168.0.254
1 firewall-cmd --add-masquerade 启用伪装
2 firewall-cmd --zone=public --add-forward-port=port=9527:proto=tcp:toport=80:toaddr=192.168.0.254
示例:将访问192.168.1.7:80的转发给192.168.1.15的80端口
1、在192.168.1.7机器上,启用伪装
firewall-cmd --add-masquerade
2、将访问本机的80端口转发到192.168.1.15的80端口上
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.15