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"

 

posted @ 2020-12-09 11:17  丿上善若水  阅读(81)  评论(0编辑  收藏  举报