Linux 防火墙
概述
一般防火墙工作在网络或主机的边缘,对进出网络或主机的数据包基于一定的规则进行检查.并在匹配某些规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略.
在RHEL7里有几种防火墙共存:firewalld、iptables、ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等
7.0版本之前iptables
服务状态/启动/重启/关闭 service iptables status/start/restart/stop
iptables
-L 表示列出规则.
-n 表示将单词表达形式改成数字形式显示.
-nL 合并使用
--line-number 显示每一条规则的行号.
规则设置
iptables -I INPUT -p tcp --dport 80 -j ACCEPT //允许访问80端口
-I INSERT表示将规则插入到最前面
-A APPEND表示将规则追加到最后面
INPUT 进站请求 OUTPUT 出站请求
-p protocol 指定协议icmp/tcp/udp
--dport 指定端口号
-j 指定行为结果. 允许ACCEPT /禁止REJECT /丢弃DROP
规则修改
规则删除
保存重启
[root@localhost ~] # /etc/init.d/iptables save //保存 [root@localhost ~] # service iptables restart //重启
7.0版本之后firewalld
firewalld与iptables对比
firewalld是iptables的前端控制器,
iptables静态防火墙中任一条策略变更都需要reload所有的策略会丢失现有链接.
firewalld动态防火墙中任一条策略变更不需要reload所有策略,将变更部分保存到iptables中不丢失现有的链接.
firewalld默认是拒绝状态每个服务都需要设置才能放行,iptables默认是允许需要拒绝才需要设置.
firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。
firewalld优势
1.firewalld可以动态修改单条规则,修改之后不需要全部刷新.
2.使用比较人性化.
初始化区域 zone
区域名称 | 默认配置(配置文件/usr/lib/firewalld/zones/) |
阻塞区域/block | 任何传入的网络数据包都将被阻止。拒绝所有的网络连接 |
工作区域/work | 相信网络上的其他计算机,不会损害你的计算机。仅接受ssh、ipp-client或dhcpv6-client服务连接 |
家庭区域/home | 相信网络上的其他计算机,不会损害你的计算机。用于家庭网络,仅接受ssh、mdns、ipp-client或dhcpv6-client服务连接 |
公共区域/public | 在公共区域内使用。仅接受ssh或dhcpv6-client服务连接 |
隔离区域/dmz | 隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。仅接受ssh服务连接 |
信任区域/trusted | 所有的网络连接都可以接受 |
丢弃区域/drop | 任何传入的网络连接都被拒绝。接受的数据包都被抛弃,且没有任何回复 |
内部区域/internal | 信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。仅接受ssh、mdns、ipp-client或dhcpv6-client服务连接 |
外部区域/external | 不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。仅接受ssh服务连接 |
安装使用
# 安装firewalld yum install firewalld firewall-config systemctl status firewalld # 或者 firewall-cmd --state 查看状态 systemctl stop firewalld # 停止 systemctl start firewalld # 启动 systemctl enable firewalld # 打开开机启动 systemctl disable firewalld # 关闭开机启动 # 关闭firewalld服务,使用iptables,命令如下:
systemctl stop firewalld systemctl disable firewalld yum install iptables-services systemctl start iptables systemctl enable iptables
选项说明
firewall-cmd --zone=zoneName # 指定zone --permanent # 永久修改,--reload 后生效 --timeout=seconds # 到期后自动移除,用于调试,不能与--permanent同时使用 --state # 显示firewalld的状态; --reload # 不中断服务的重新加载; --complete-reload # 中断所有连接的重新加载; --runtime-to-permanent# 将当前防火墙的规则永久保存; --check-config # 检查配置正确性; --help # 查看帮助信息 --version # 查看版本
日志选项
--get-log-denied # 获取记录被拒绝的日志; --set-log-denied=<value> # 设置记录被拒绝的日志,只能为 'all','unicast','broadcast','multicast','off' 其中的一个;
配置firewalld
firewall-cmd --panic-on //拒绝所有包. firewall-cmd --panic-off //取消拒绝包. firewall-cmd --query-panic //查看是否拒绝.
// 查看支持的区域列表 firewall-cmd --get-zones // 查看默认区域 firewall-cmd --get-default-zone
// 查看当前已被激活的zone信息 firewall-cmd --get-active-zones // 查看某个接口所属的区域信息 firewall-cmd --get-zone-of-interface=enp03s // 查看指定区域的所有信息 firewall-cmd --zone=public --list-all // 设置默认区域,立即生效无需重启 firewall-cmd --set-default-zone=public
// 将接口添加到指定区域永久生效. 需要reload防火墙. firewall-cmd --zone=dmz --add-interface=eth0 --permanent
// 临时修改网络接口(enp0s3)为内部区域(internal). firewall-cmd --zone=internal --change-interface=enp03s // 永久修改网络接口enp03s为内部区域(internal). firewall-cmd --permanent --zone=internal --change-interface=enp03s
端口管理
// 查看防火墙,开放的端口也可以看到 firewall-cmd --list-all // 查看默认区域开放的端口 firewall-cmd --list-ports // 开放通过tcp访问3306端口 firewall-cmd --add-port=3306/tcp // 阻止通过tcp访问3306端口 firewall-cmd --remove-port=80tcp // 开放通过udp访问233端口 firewall-cmd --add-port=233/udp //开放public区域开放tcp 8080端口 firewall-cmd --zone=public --add-port=8080/tcp //注意: 不指定区域都是添加到默认区域,不指定--permanent都是临时开放重启后失效.配置完成后需要重新加载 firewall-cmd --reload
服务管理
// 显示当前开放的服务 firewall-cmd --list-services
// 开放mysql服务端口 firewall-cmd --add-service=mysql // 阻止http服务端口 firewall-cmd --remove-service=http
// 添加HTTP服务到内部区域(internal)需重新加载 firewall-cmd --permanent --zone=internal --add-service=http
自定义服务
// 查看集成的服务命令 firewall-cmd --get-service
//内置服务配置文件目录 /usr/lib/firewalld/services/
//自定义服务配置目录 /etc/firewalld/services/
//拷贝内置的服务模板 [root@bak services]# cp /usr/lib/firewalld/services/mysql.xml /etc/firewalld/services/
//参考模板进行修改 [root@bak services]# vim ./mysql.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 <service> 3 <short>MySQL</short> 4 <description>MySQL Database Server</description> 5 <port protocol="tcp" port="3306"/> 6 </service>
伪装IP
//查看Zone是否允许ip地址伪装 firewall-cmd --zone=external --query-masquerade
//打开伪装 firewall-cmd --zone=external --add-masquerade
//关闭伪装 firewall-cmd --zone=external --remove-masquerade
端口转发
//目的: 端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。
// 1.当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去。 // 2.端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。
//如果配置好端口转发之后不能用,可以检查下面两个问题:
//1. 比如首先检查本地的 80 端口和目标的 8080 端口是否开放监听. //2. 其次检查是否允许伪装 IP,没允许的话要开启伪装 IP
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 将80端口的流量转发至192.168.0.1 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口
//注意: //转发的目的如果不指定ip默认为本机,如果指定了 ip 没指定端口,则默认使用来源端口。
直接模式
// FirewallD包括一种直接模式,使用它可以完成一些工作,例如打开TCP协议的9000端口 firewall-cmd --direct -add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j accept firewall-cmd --reload
其他
//配置public zone的icmp firewall-cmd --get-icmptypes //查看所有支持的icmp类型
//列出 firewall-cmd --zone=public --list-icmp-blocks
//添加echo-request屏蔽禁止ping firewall-cmd --zone=public --add-icmp-block=echo-request [--timeout=seconds]
//移除echo-reply屏蔽 firewall-cmd --zone=public --remove-icmp-block=echo-reply
//ip封禁 firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address ='172.16.30.79' reject"