firealld 和iptables 都是规则生成工具,真正的是生效的是基于内核上netfilter.
firewalld 的规则最终要转化成iptables规则。至于iptables工作原理不做介绍。
firewalld 具有特点:动态防火墙守护进程,具有主流防火墙zone的定义,支持ipv4和ipv6防火墙设置。
解释:动态防火墙:支持运行时配置,能立即生效。(iptables必须重启服务),还支持状态跟踪。
虽然iptables也支持状态跟踪,iptables 是基于模板的定义的状态跟踪。
解释:zone:规则的集合
firewalld 配置文件(自定义zone会详讲)
firewalld配置文件以xml格式为主(除了fireealld.conf)文件目录位置
1,/etc/firewalld/
2,/usr/lib/firewalld/
重点:当我们定义了多个zone.如果流量进来,是如何处理的?处理流程
1,如果进来的流量的源地址,被一个zone定义的源地址规则匹配,
那么这个流量被这个zone所处理。(源地址优先级最高)
2,如果进来的流量通过一个接口,那么流量将会被接口所定义的zone处理。 (接口次之)
3,如果流量没有被源地址和接口匹配,将会被默认zone处理(优先级最低,系统默认zone=public)
注解:首先查找数据流量的源地址,如果源地址被drop或者block这两个zone的源地址规则匹配。则不会再去找数据流入接口。
如果数据的流量的源地址,没有被定义被drop和block 两个zone的源地址规则匹配,而是被其它zone的源地址匹配,
那么数据的流量将会进入该zone,
如果数据流量的接口,被drop或者block这两个zone的接口匹配,
则不会交给默认zone处理
如果没有找到对应的服务。数据流量会去找接口所在的zone中的服务,
如果找到相应的服务,即能完成访问,如果接口没有找到对应的服务,
那么会交给默认zone来处理。及时有对应的服务也是拒绝访问。
实验环境:
物理主机,两台vm虚拟机,系统为redhat7.
物理主机的ip地址为192.168.0.111
(下面就称:防火墙)一台虚拟主机模拟防火墙设置两块网卡:一块设置为桥接类型,
模拟外网地址:192.168.0.200/24 gw:192.168.0.1 dns 8.8.8.8
第二块为hostonly,模拟内网地址:192.168.10.11/24 网关可以不用配置
第二台虚拟主机模拟内网设置一块网卡:网卡类型为hostonly:
地址为192.168.10.13/24 gw:192.168.10.11 必须和firewall内网在同一个vmnet中。
在防火墙配置一个ftp服务。
先打开防火墙的转发功能。
echo 1 > /proc/sys/net/ipv4/ip_forward ---零时生效。
编辑:/usr/lib/sysctl.d/00-system.conf
添加 net.ipv4.ip_forward = 1
sysctl -p /usr/lib/sysctl.d/00-system.conf 重新加载配置文件,可以永久有效
firewalld默认有9个zone(zone是firewalld的单位)
默认zone为public
drop(丢弃):任何接受的网络数据包都被丢弃,没有任何回复,
仅能有发送出去的网络连接(数据包不能进来,但是可以出去)
block(限制):任何接受的网络连接都被IPv4的icmp-host-prohibited信息和IPv6的icmp6-adm-prohibited信息所拒绝。(和drop相比,比较宽松一些,主要是为了针对icmp)
piblic(公共):在公共区域内使用,不能相信网络内其他计算机不会对你造成危害,只能接受经过选取的连接。
external(外部):特别是为路由器启用了伪装功能的外部网,你不能信任来自网络的其他计算,不能相信他们不会对你造成伤害,只能接受经过选择的连接。
dmz(非军事区):用于你的非军事区内的电脑,此区域可公开访问,可以有限的进入你的内部网络,仅仅接受经过选择的连接。
work(工作):用于工作区,你可以基本信任网络内的其他电脑不会对你造成危害,仅仅接收经过选择的连接。
home(家庭):用于内部网络,你可以基本上信任网络内其他电脑不会对你造成危害,仅仅接收经过选择的连接。
internal(内部):用于内部网络,你可以基本上信任网络内其他电脑不会对你造成危害,仅仅接收经过选择的连接。
trusted(信任):可接受所有的网络连接。
firewalld 和iptables,ip6tables,ebtables 不能同时使用,我们写个脚本禁用它们
#!/bin/bash
for i in iptable ip6tables ebtables ;do
systemctl stop $i
systemctl disable $i
systemctl mask $i
done
systemctl start firewalld 启动防火墙
systemctl enable firewalld 开机自启动
systemctl disable firewalld 关闭开机自启动
systemctl status firewalld 查看状态
systemctl stop firewalld 停止防火墙
systemctl mask firewalld 屏蔽防火墙
systemctl unmask firewalld 关闭屏蔽防火墙
firewall-cmd 命令的使用 (下面的xx表示上面九个zone中的一个)
firewall-cmd --version 查看版本号
firewall-cmd --help 查看帮助
firewall-cmd 查看状态
firewall-cmd --get-active-zones 查看活动的zone
什么是active-zone 即:有source(源地址)或interface(有接口)的zone
# firewall-cmd --get-active-zones
home
interfaces: eno33554992
work
sources: 192.168.0.0/24
public
interfaces: eno16777736
firewall-cmd --reload 不停止服务,重新加载配置文件。
firewall-cmd --get-default-zone 查看默认zone
firewall-cmd --set-default-zone= 修改默认zone
firewall-cmd --get-zone-of-interface=eno16777736 查看指定接口属于哪个zone
firewall-cmd --list-all 查看默认zone信息
firewall-cmd --list-all --zone=xx 查看指定zone信息
firewall-cmd --list-all-zones 查看所有zone的信息
firewall-cmd --list-interfaces 查看默认zone的接口 可以指定--zone=xxx
firewall-cmd --list-ports 查看默认zone的端口 可以指定--zone=xx
firewall-cmd --list-services 查看默认zone的服务 可以指定--zone=xx
firewall-cmd --zone=xx --change-interface=eno16777736 将指定接口转移到xxzone
------------------------------------------------------
firewall-cmd --add-source=xxx.xxx.xxx.xxx 在默认zone中添加源地址 如果换zone可以加--zone=xx
firewall-cmd --add-interface=eno16777736 在默认zone中添加一个接口,如果换zone可以加--zone=xx
firewall-cdm --add-port=portnumber/[tcp|udp]在默认zone中添加一个端口,如果换zone可以加--zone=xx
firewall-cdm --add-service=servername 在默认zone中添加一个服务。如果还zone可以加--zone
firewall-cmd --remove-source=xxx.xxx.xxxx.xxx 移除默认zone 中的源地址。可以指定--zone=xx
firewall-cmd --remove-interface=eno16777736 移除默认zone中的接口,可以指定--zone=xx
firewall-cmd --remove-port=portnumber/[tcp|udp] 移除默认zone中的端口 可以指定--zone=xx
firewall-cmd --remove-service=servername 移除默认zone 中的服务,可以指定--zone=xx
firewall-cmd --add-rich-rule '' 添加富规则 可以指定--zone=xx
firewall-cmd --remove-rich-rule '' 删除富规则 可以指定--zone=xx
firewall-cmd --add-forward-port 添加端口映射 可以指定--zone=xx
以上的命令都可以接--permanent 表示永久生效。但必须要firewall-cmd --reload
富规则;提供了log,地址伪装,端口转发,速率限制。是规则更加精细化
富规则的处理顺序:
端口转发和伪装 优先
log 日志 次之
允许 再次之
拒绝 最低
添加富规则的语法:firewall-cmd [--zone=xx] [--permanent] --add-rich-rule
'rule [family="rule family"]
[ source [NOT] [address="address"] [mac="mac-address"] [ipset="ipset"] ]
[ destination [NOT] address="address" ]
[ element ]
[ log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] ]
[ audit ]
[ action ]'
解释:''规则是用单引号包裹的
rule 关键字
[family="ipv4"后者"ipv6"]
[source 关键字 address=xxx.xxx.xxx.xxx [mac="mac-address"]]
[ destination 关键字 address="address" ]
Elements:元素
The element can be only one of the following element types: service, port, protocol, masquerade, icmp-block, forward-port, and source-port.
元素类型只可能是这其中的一种:service, port, protocol, masquerade, icmp-block, forward-port, source-port.
service name=service_name
服务的表示法
port port=number_or_range protocol=protocol
端口的表示法,必须要跟协议
protocol value=protocol_name_or_ID
端口的值表示法
icmp-block name=icmptype_name
icmp 类型
forward-port port=number_or_range protocol=protocol /
to-port=number_or_range to-addr=address
本机端口转发的表示法
source-port port=number_or_range protocol=protocol
源端口的表示法
log [prefix=prefix text] [level=log level] limit value=rate/duration
日志记录的表示发
ferfix=text 表示;标识符
level:日志记录的级别
limit:限制(关键字)
value=值(速率)
action:
accept | reject [type=reject type] | drop | mark set="mark[/mask]"
accept:通过
reject:拒绝
drop:丢弃
mask set= 打标记(集群服务会用到)
例子,以下的例子都是在默认zone为public。接口interface 也是在public zone中,其它zone没有定义源地址。
1,添加一条富规则,禁止源地址为192.168.0.111的主机访问
#firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.111/32" drop'
2,删除已有的富规则,先用firewall-cmd --list-all 查看规则。在用firewall-cmd --remove-rich-rule'规则'
` # firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.0.111/32" drop'``
3,添加一条富规则,禁止源地址为192.168.0.0/24网段的地址,访问22端口
# firewall-cmd --add-rich-rule
'rule family=ipv4 source address=192.168.0.0/24 port port=22 protocol=tcp reject'
4,添加一条富规则。禁止所有的tcp连接
`firewall-cmd --add-rich-rule 'rule family=ipv4 protocol value=tcp reject'`
5,添加一条富规则,禁止源地址为192.168.0.0/24网段的地址,访问ssh服务
`#firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.0.0/24 service name=ssh reject'`
6,添加一条富规则,显示ftp每分钟只接受两个新连接。
`#firewall-cmd --add-rich-rule 'rule family=ipv4 service name=ftp limit value=2/m accept' `
什么时候要用masquerade:当我们只有一个公网地址,内网主机需要上网的时候。
1,添加端口伪装,是后端(192.168.10.13)的主机能够访问互联网。
firewall-cmd --add-masquerade --permanent -----必须先添加伪装
firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.10.13/32 masquerade' --permanent
firewall-cmd --reload
什么时候,需要用用到端口转发,比如说,httpd我们定义了一个非标准的端口(8009),可以把80端口访问都转发到那个非标准端口
2,本机的端口转发。来至192.168.0.0/24的主机访问端口443,都把流量转发到端口22上去。
```firewall-cmd --zone=public --permanent --add-rich-rule
'rule family="ipv4" source address="192.168.0.0/24" forward-port port="443" protocol="tcp" to-port="22"'
firewall-cmd --reload
## 5,forwarding a port --端口映射
端口映射语法:
` firewall-cmd --add-forward-port=port=xx:proto=[tcp|dup]:toport=xx:toaddr`
什么时候能用带端口映射,外网用户想访问内网的主机。
1,把防火墙的80端口,映射到后端192.168.10.13的80端口上(注意,要关闭防火墙上的httpd服务,后端主机防火墙要开放http)
```#firewall-cmd --add-masquerade --permanent
##firewall-cmd --add-forward- port=port=80:proto=tcp:toport=80:toaddr=192.168.10.13 --permanent
#firewall-cmd --reload
firewalld配置文件以xml格式为主(除了fireealld.conf)文件目录位置
1,/etc/firewalld/
2,/usr/lib/firewalld/
如果修改配置文件的话,/usr/lib/firewalld/下的文件不能修改,可以复制到/etc/firewalld/对应目录下进行修改。
运行时用到的配置文件为/etc/firewalld/目录下文件
我们来看一下/etc/firewalld/zone/public.xml的语法格式
-----------------------------------------------------------------------
---定义xml使用的版本和字符集类型
---用xxx 封装一个zone
Public ---用 封装zone的名字
For use in public areas.
You do not trust the other computers on
networks to not harm your computer. Only selected
incoming connections are accepted. --用 封装表述信息
----用 封装接口的名字
用一个 表示一个服务
---用 封装规则
---里面规则语句
------------------------------------------------------------------------
添加自定义zone方法:
创建一个zone模板3种方法:
1,` firewall-cmd --permanent --new-zone=xx` 用命令创建模板
2 ,` cp /usr/lib/firewalld/zone/public.xml /etc/firewalld/zone/xx.xml `
复制创建模板,需要修改里面的xx .
3,图形界面添加一个zone
至于配置规则和系统自带的9个zone没有区别,可以用命令或者图形界面配置规则
也可以手动修改xx.xml文件添加规则
复制`/usr/lib/firewalld/service/http.mxl /etc/firewalld/service/xxx.mxl `我们看一下语法格式
WWW (HTTP)
HTTP is the protocol used to serve Web pages.
If you plan to make your Web server publicly available,
enable this option. This option is not required for viewing
pages locally or developing Web pages.
--用一个 定义一 个协议和端口
创建-个service模板的3种方法
1,`firewall-cmd --permanent --new-service=xx`
2,` /usr/lib/firewalld/service/http.mxl /etc/firewalld/service/xxx.mxl`
需要修改 添加需要的名字,修改修改为自己所需要的协议和端口
3,图形界面添加一个service
selinux定义了一些安全的端口。通过selinux的定义的端口通信,selinux是放行的。
查看所有selinux开放的安全端口。 # semanage port -l
如果你定义的端口没有在selinux定义安全端口中,则服务无法启动,需要加进安全端口里#semanage port -t -a PORT-TYPE -p [tcp|dup] portnumber
例如:semanage port -a -t http_port_t -p tcp 81
详细请man semanage-port查看
花了一天多的时间,终于敲完了,纯手动敲打,如果有问题请见谅。这是我看文档,查资料总结的,如果有不对的地方希望大佬指点。
转载于:https://blog.51cto.com/zhuxu91313/2148766