使用FirewallD替代Iptables的一些配置

前几天新服务器安装vsftp后,然后准备打开端口,突然发现iptables没有开启,然后systemctl status iptables了一下竟然没有iptables!果网上一查才找到centos7默认使用firewalld替代了iptables,想起来之前装MySQL时也发现mysql被MariaDB替代了。FIrewalld没听过也不会呀,这叫如何是好,百度了也全是说怎么禁掉firewalld再装iptables的,竟然没有说怎么配置Firewalld的。好吧我对新事物的好奇心还是很强的,果断将文档gg翻译一下再学习配置,iptables被换掉总是有理由的,话说人怎么能一直重复以前的旧故事呢

导航目录

  1. firewalld的理解
  2. firewalld安装和配置
  3. 总结
firewalld的理解

RHEL7中的FirewallD支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项,被称作动态管理防火墙,也就是说不需要重启整个防火墙便可应用更改,不过貌似其实现方式还是和iptables一样的,但是不像mariaDB那样兼容MySQL命令,FirewallD无法解析由 ip*tables 和 ebtables 命令行工具添加的防火墙规则

FirewallD使用区域(zone)的概念来管理,每个网卡对应一个zone,这些zone的配置文件可在/usr/lib/firewalld/zones/下看到,默认的是public,其他区域:
drop

任何流入网络的包都被丢弃,不作出任何响应,只允许流出的网络连接。即使开放了某些服务(比如http),这些服务的数据也是不允许通过的。

block

任何进入的网络连接都被拒绝,并返回 IPv4 的 icmp-host-prohibited 报文或者 IPv6 的 icmp6-adm-prohibited 报文。只允许由该系统初始化的网络连接。

public(默认)

用以可以公开的部分。你认为网络中其他的计算机不可信并且可能伤害你的计算机,只允许选中的服务通过。

external

用在路由器等启用伪装的外部网络。你认为网络中其他的计算机不可信并且可能伤害你的计算机,只允许选中的服务通过。

dmz

用以允许隔离区(dmz)中的电脑有限地被外界网络访问,只允许选中的服务通过。

work

用在工作网络。你信任网络中的大多数计算机不会影响你的计算机,只允许选中的服务通过。

home

用在家庭网络。你信任网络中的大多数计算机不会影响你的计算机,只允许选中的服务通过。

internal

用在内部网络。你信任网络中的大多数计算机不会影响你的计算机,只允许选中的服务通过。

trusted

允许所有网络连接,即使没有开放任何服务,那么使用此zone的流量照样通过(一路绿灯)。 

由上可以看见服务器的话使用默认zone就可以了,当然你可以设置所在zone:

#firewall-cmd --set-default-zone=public
firewalld安装和配置

可以通过yum轻松安装firewalld:

#yum install firewall

开启/关闭服务,注意RHEL7使用systemctl代替service和chkconfig管理服务,小心如果是远程操作主机必需确保ssh端口是默认开放的,不然开启后你就连不上了,具体后面会细说:

#systemctl start firewalld.sevice
#systemctl stop firewalld.sevice

服务自启动:

#systemctl enable firewalld.service

fierwalld可以直接修改配置文件进行配置,也可以通过配置工具的命令,这里因为是远程操作为了确保开启后ssh端口是开放的,所以直接修改配置文件:

  1. 先查看/etc/firewalld/firewalld.conf中DefaultZone的值,默认是DefaultZone=public,这时/etc/firewalld/zones/目录下应该有个public.xml文件,vi打开它修改成:

     <?xml version="1.0" encoding="utf-8"?>
     <zone>
       <short>Public</short>
       <description>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.</description>
       <service name="dhcpv6-client"/>
       <service name="ssh"/>
       <service name="http"/>
       <service name="https"/>
     </zone>
    

    这就代表在public zone中开放ssh(22)、http(80)、https(443)端口,其中对应每一个在/usr/lib/firewalld/services/下*.xml文件定义好的服务类型,比如http.xml文件如下:

     <?xml version="1.0" encoding="utf-8"?>
             <service>
               <short>WWW (HTTP)</short>
               <description>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.</description>
               <port protocol="tcp" port="80"/>
             </service>
    

    所以也可以直接在public.xml中这样:

     <?xml version="1.0" encoding="utf-8"?>
             <zone>
               <short>Public</short>
               <description>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.</description>
               <service name="dhcpv6-client"/>
               <service name="ssh"/>
               <port protocol="tcp" port="80"/> #等效的
               <service name="https"/>
             </zone>
    
  2. 每次改配置文件还是比较麻烦的,firewalld可以使用firewall-config和firewall-cmd进行配置,前者是由于GUI模式下,后者为命令行下工具,一些常用命令如下:

     # Check firewall state.
     firewall-cmd --state
    
     # Check active zones.
     firewall-cmd --get-active-zones
    
     # Check current active services.
     firewall-cmd --get-service
    
     # Check services that will be active after next reload.
     firewall-cmd --get-service --permanent
     
     #reload the config after making any changes.
     firewall-cmd --reload
    

    设置默认区域为trusted,注意trusted是信任等级最高的,默认允许所有连接,即使没有设置任何的服务

     firewall-cmd --set-dedault-zone=trusted
    

    添加http服务

     firewall-cmd --add-service=http
    

    禁用某种服务

     firewall-cmd [--zone=<zone>] --remove-service=<service>
    

    查询区域中是否启用了特定服务,如果服务启用,将返回1,否则返回0

     firewall-cmd [--zone=<zone>] --query-service=<service>
    

    在firewalld里添加一个端口

     firewall-cmd --add-port=8080/tcp
    

    查询开启的端口

     firewall-cmd --query-poert=8080/tcp
    

    关闭端口

     firewall-cmd [--zone=<zone>] --remove-poert=<port>/tcp
    

    启用区域端口和协议组合,此举将启用端口和协议的组合。端口可以是一个单独的端口或者是一个端口范

     firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>]
    

    启用区域的ICMP阻塞功能

     firewall-cmd [--zone=<zone>] --add-icmp-block=<icmptype>
    

    在区域中永久启用端口转发或映射

     firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address>}
    
最后的话

个人觉得firewalld还是比较方便的,没必要禁用掉然后再开启Iptables。fiewalld默认是打开ssh服务的,话说我还一直担心开启防火墙之后怎么才能连上SSH,没文化真可怕。。

标签: firewalld, iptables, centos

仅有一条评论

  1. dtbsky dtbsky

    查询开启的端口

    firewall-cmd --query-poert=8080/tcp

    关闭端口
    firewall-cmd [--zone=] --remove-poert=/tcp

    你这有字母写错了哦
    firewall-cmd --query-port=8080/tcp
    firewall-cmd [--zone=] --remove-port=/tcp
    这样才对额

添加新评论