Linux防火墙
防火墙类型
-
包过滤防火墙--iptables/firewalld
-
应用代理防火墙
-
状态检测防火墙
包过滤防火墙
firewalld/iptables防火墙属于用户态,定义防火墙的各种规则,内部结构指向netfilter网络过滤子系统(linux防火墙的内核态)来实现包过滤防火墙功能
Linux防火墙类型
-
iptables 工作在网络层,属于包过滤防火墙。基于接口设置规则
-
firewalld 工作在网络层,属于包过滤防火墙。支持网络区域所定义的网络连接以及接口安全等级
iptables与firewalld的区别
-
iptables主要是基于接口来设置规则;firewalld基于区域来设置不同的规则
-
iptables在/etc/sysconfig/iptables中存储配置;firewalld将配置存储在/etc/firewalld/和/usr/lib/firewalld/中的各种xml文件
-
iptables单独更改是清除所有旧的规则和从/etc/sysconfig/iptables里读取所有新的规则;firewalld不会创建新的规则,仅运行规则中的不同之处,在运行时间内,更改设置不丢失现行连接
-
iptables防火墙类型为静态防火墙;firewalld防火墙类型为动态防火墙
iptables--四表五链
四表--raw->mangle->nat->filter
-
filter 包过滤
-
-
INPUT
-
OUTPUT
-
FORWARD
-
-
nat 地址转换,包路由
-
-
OUTPUT
-
PREROUTING
-
POSTROUTING
-
-
raw 基于数据包的状态进行规则设定
-
-
OUTPUT
-
PREROUTING
-
-
mangle 修改数据包的内容,例如ttl
五链
-
INPUT 一般处理未被PREROUTIN修改过的包
-
OUTPUT
-
FORWARD 一般处理被PREROUTING链修改过的包
-
PREROUTING 对数据包的目的地址进行修改,DNAT;最先生效;被修改过后的包发往FORWARD链;未被修改的包发往INPUT
-
POSTROUTING
处理动作
-
ACCEPT 接收数据包,不会再匹配其他链条和规则
-
DROP 丢弃数据包,且没有任何返回
-
REJECT 拒绝数据包,但会返回拒绝信息
-
RETURN 当前规则不做处理,返回,让给下一条规则处理
-
LOG 当前规则只将请求信息记录到系统日志中,返回,给下一条规则处理
基础配置
iptables -t nat -nvL --line-numbers # n域名解析;v详细信息;L所有 iptables -t filter -A INPUT -s 192.168.44.0/24 -j REJECT iptables -t filter -D INPUT -s 192.168.44.0/24 -j REJECT iptables -t filter -D FORWARD 1 #删除编号为1的FORWARD链规则 iptables -t filter -F INPUT #清空INPUT链 iptables -A INPUT -p tcp -j DROP iptables -A INPUT -p tcp --dport=22 -s 192.168.44.0/24 -j DROP iptables -A INPUT -p tcp -m multiport --dports=22,5900 -s 192.168.44.0/24 -j DROP iptables -A INPUT -p tcp -m multiport ! --dports=22,5900 -j DROP #22或80链接可能衍生出一些RELATED链接,可能出现端口不是22或80,若丢弃会导致通信失败 iptables -A INPUT -m state --state RELATED,ESTABLISTED -j ACCEPT ## 规则持久化 iptables-save > /etc/iptables.conf # 保存 vim /etc/rc.local iptables-restore < /etc/iptables.conf # 恢复
firewalld
基于区域来设置不同的规则,根据数据包的源IP地址或传入的网络接口等条件将流量传入相应区域。
每个区域都定义了自己打开或关闭的端口或服务列表。
9个区域
-
drop 丢弃;不存在相应
-
block 阻塞区域,已经建立的连接才会被通过,只允许系统初始化的网络连接
-
public 只接受被选中的连接;默认zone;默认只允许ssh与dhcp;默认拒绝ping包
-
external 只有指定连接才能被接收
-
DMZ 只允许部分服务被外部访问
-
work 只能定义内部网络
-
home 只允许被选中的流量
-
internal 只允许被选中的流量
-
trusted 允许所有传入流量
数据处理流程
对于进入系统的数据包,会根据数据包的源IP地址或传入的网络接口等条件,将数据流量转入相应区域的防火墙规则。
对于进入系统的数据包,首先检查的就是源地址。
检查数据包的源地址规则
-
若源地址关联到特定的区域(即源地址或接口绑定的区域有冲突),则执行该区域所制定的规则
-
若源地址未关联到特定的区域(即源地址或接口绑定的区域没有冲突),则使用传入网络接口的区域并执行该区域所制定的规则
-
若网络接口也未关联到特定的区域( 即源地址或接口都没有绑定特定的某个区域),则使用默认区域并执行该区域所制定的规则
配置模式
-
运行时配置模式:实时生效,并持续的重新启动或加载firewalld配置;不中断连接;不能修改服务配置
-
永久配置模式:不立即生效,除非重新启动或加载firewalld配置;中断现有连接,可以修改服务配置
firewall-cmd --permanent RULE firewall-cmd --reload
基础配置
# 服务查看与启动 [root@localhost ~]# systemctl status firewalld [root@localhost ~]# systemctl start firewalld # firewall-cmd命令 ## 查看firewalld运行状态 [root@localhost ~]# firewall-cmd --state running ## 查看firewalld默认区域 [root@localhost ~]# firewall-cmd --get-default-zone public ## 查看firewalld当前正在使用的区域与接口 [root@localhost ~]# firewall-cmd --get-active-zones public interfaces: eth0 [root@localhost ~]# firewall-cmd --get-zones block dmz drop external home internal public trusted work ## 指定接口的区域 ## 查看指定接口绑定的区域 [root@localhost ~]# firewall-cmd --get-zone-of-interface=eth0 public ## 从指定区域删除绑定的接口 [root@localhost ~]# firewall-cmd --zone=internal --remove-interface=eth0 success ## 指定区域绑定接口 [root@localhost ~]# firewall-cmd --zone=public --add-interface=eth0 success ## 更改指定区域的绑定接口 [root@localhost ~]# firewall-cmd --zone=internal --change-interface=eth0 success ## 指定源地址的区域 ## 查看指定源地址的区域 [root@localhost ~]# firewall-cmd --get-zone-of-source=192.168.122.0/24 no zone ## 指定源地址的区域 [root@localhost ~]# firewall-cmd --zone=internal --add-source=192.168.122.0/24 success [root@localhost ~]# firewall-cmd --get-zone-of-source=192.168.122.0/24 internal ## 更改源地址的区域 [root@localhost ~]# firewall-cmd --zone=dmz --change-source=192.168.122.0/24 success ## 删除源地址的区域 [root@localhost ~]# firewall-cmd --zone=dmz --remove-source=192.168.122.0/24 success [root@localhost ~]# firewall-cmd --get-zone-of-source=192.168.122.0/24 no zone ## 区域的规则--服务、端口、ICMP类型 ## 查看所有区域的规则 [root@localhost ~]# firewall-cmd --list-all-zones ## 查看指定区域的所有规则 [root@localhost ~]# firewall-cmd --zone=public --list-all public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ## 查看指定区域允许放行的服务 [root@localhost ~]# firewall-cmd --zone=public --list-services ssh dhcpv6-client ## 设置指定区域允许放行的服务 [root@localhost ~]# firewall-cmd --zone=public --add-service=http success [root@localhost ~]# firewall-cmd --zone=public --list-services ssh dhcpv6-client http [root@localhost ~]# firewall-cmd --zone=public --remove-service=http success [root@localhost ~]# firewall-cmd --zone=public --list-services ssh dhcpv6-client ## 设置指定区域放行的端口策略 [root@localhost ~]# firewall-cmd --zone=public --list-ports [root@localhost ~]# firewall-cmd --zone=public --add-port=23/tcp success [root@localhost ~]# firewall-cmd --zone=public --remove-port=23/tcp success ## 查看指定区域拒绝访问的icmp类型 [root@localhost ~]# firewall-cmd --get-icmptypes #查看icmptype类型 [root@localhost ~]# firewall-cmd --list-icmp-blocks ## 设置指定区域的拒绝访问的icmp类型 [root@localhost ~]# firewall-cmd --add-icmp-block=echo-request success [root@kvm01 ~]# ping 192.168.122.166 PING 192.168.122.166 (192.168.122.166) 56(84) bytes of data. From 192.168.122.166 icmp_seq=1 Destination Host Prohibited From 192.168.122.166 icmp_seq=2 Destination Host Prohibited [root@localhost ~]# firewall-cmd --remove-icmp-block=echo-request success
直接规则--类似iptables的四表五链
-
直接规则优先于firewalld规则
[root@localhost ~]# firewall-cmd --direct --get-all-chains ## 规则定义: --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args> [root@localhost ~]# firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p icmp -j REJECT success [root@localhost ~]# firewall-cmd --direct --remove-rule ipv4 filter INPUT 0 -p icmp -j REJECT success [root@localhost ~]# firewall-cmd --direct --get-all-rules ## 定义NAT规则 firewall-cmd --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth1 -j MASQUERADE -s 192.168.122.0/24
富规则--精确控制
[root@localhost ~]# firewall-cmd --list-rich-rules ## 富规则语法 rule family=ipv4 source address=192.168.122.0/24 [destination address=192.168.44.0/24] service|port|protocol|icmp-block|masquerade|forward-port [log] [audit] accept|reject|drop firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject' firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept' firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 service name=ssh reject'
NAT和端口转发
# 地址伪装masquerade firewall-cmd --permanent --zone=<ZONE> --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade' # 端口转发 frewall-cmd --permanent --zone=public --add-forward-port=port=513:proto=tcp:toport=132:toaddr=192.168.0.254 # 本地端口转发 firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.25.0.10/32 forward-port port=80 to-port=22 protocol=tcp' # 目标地址转发 firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.25.0.10/32 forward-port port=80 to-port=80 protocol=tcp to-addr=172.25.0.254'