Iptables&Firewalld防火墙

一、IPtables

1、IPtables入门简介

       Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。Iptables主要工作在OSI七层的二、三、四层。

Iptables 是Linux 内核集成的 IP 信息包过滤系统。如果Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

        防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 信息包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。

虽然Netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。

Netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

Iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。

2、IPtables表与链功能

Iptables的规则链分为三种:输入、转发和输出。

  • 输入——这条链用来过滤目的地址是本机的连接。例如,如果一个用户试图使用SSH登陆到你的PC/服务器,iptables会首先匹配其IP地址和端口到iptables的输入链规则。

  • 转发——这条链用来过滤目的地址和源地址都不是本机的连接。例如,路由器收到的绝大数数据均需要转发给其它主机。如果你的系统没有开启类似于路由器的功能,如NATing,你就不需要使用这条链。

  • 输出——这条链用来过滤源地址是本机的连接。例如,当你尝试ping jfedu.net时,iptables会检查输出链中与ping和jfedu.net相关的规则,然后决定允许还是拒绝你的连接请求。

注意:当ping一台外部主机时,看上去好像只是输出链在起作用。但是请记住,外部主机返回的数据要经过输入链的过滤。当配置iptables规则时,请牢记许多协议都需要双向通信,所以你需要同时配置输入链和输出链。人们在配置SSH的时候通常会忘记在输入链和输出链都配置它。

3、IPTABLES数据包流程

数据包先经过PREOUTING,由该链确定数据包走向:

  • 目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①--->②;

  • 若满足PREROUTING的nat表上的转发规则,则发送给FORWARD,然后再经过POSTROUTING发送出去,流程为: ①--->③--->④--->⑥;

  • 主机发送数据包时,流程则是⑤--->⑥;

  • 其中PREROUTING和POSTROUTING指的是数据包的流向,如上图所示POSTROUTING指的是发往公网的数据包,而PREROUTING指的是来自公网的数据包。

 

4、IPTABLES四张表&五条链

iptables具有Filter, NAT, Mangle, Raw四种内建表。

5、Linux下IPtables下Filter表

Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:

  • INPUT链 – 处理来自外部的数据;

  • OUTPUT链 – 处理向外发送的数据;

  • FORWARD链 – 将数据转发到本机的其他网卡设备上。

 6、Linux下IPtables下NAT表

NAT (网络地址转换) 技术在平时是很多见的,如家庭中在使用路由器共享上网时,一般用的就是 NAT 技术,它可以实现众多内网 IP 共享一个公网 IP 上网。

NAT 的原理,简单的说就是当内网主机访问外网时,当内网主机的数据包要通过路由器时,路由器将数据包中的源内网 IP 地址改为路由器上的公网 IP 地址,同时记录下该数据包的消息;

       外网服务器响应这次由内而外发出的请求或数据交换时,当外网服务器发出的数据包经过路由器时,原本是路由器上的公网 IP 地址被路由器改为内网 IP 。

SNAT 和 DNAT 是 iptables 中使用 NAT 规则相关的的两个重要概念。如上图所示,如果内网主机访问外网而经过路由时,源 IP 会发生改变,这种变更行为就是 SNAT;反之,当外网的数据经过路由发往内网主机时,数据包中的目的 IP (路由器上的公网 IP) 将修改为内网 IP,这种变更行为就是 DNAT 。NAT表有三种内建链:

  • PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。

  • POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。

  • OUTPUT链 – 处理本机产生的数据包。

 7、Linux下IPtables命令图解

Linux下IPtables命令剖析:

1.命令:
-A 顺序添加,添加一条新规则
-I 插入,插入一条新规则 -I 后面加一数字表示插入到哪行
-R 修改, 删除一条新规则 -D 后面加一数字表示删除哪行
-D 删除,删除一条新规则 -D 后面加一数字表示删除哪行
-N   新建一个链
-X   删除一个自定义链,删除之前要保证次链是空的,而且没有被引用
-L 查看
 @1.iptables -L -n 以数字的方式显示
 @2. iptables -L -v显示详细信息
 @3. iptables -L -x 显示精确信息
-E   重命名链
-F 清空链中的所有规则
-Z   清除链中使用的规则
-P 设置默认规则
2.匹配条件:
隐含匹配:
   -p  tcp udp icmp
   --sport指定源端口
   --dport指定目标端
   -s 源地址
   -d 目的地址
-i 数据包进入的网卡
-o 数据包出口的网卡
扩展匹配:
-m state --state   匹配状态的
-m mutiport --source-port   端口匹配 ,指定一组端口
-m limit --limit 3/minute   每三分种一次
-m limit --limit-burst  5   只匹配5个数据包
-m string --string --algo bm|kmp --string"xxxx"  匹配字符串
-mtime--timestart 8:00 --timestop 12:00  表示从哪个时间到哪个时间段
-mtime--days    表示那天
-m mac --mac-source xx:xx:xx:xx:xx:xx 匹配源MAC地址
-m layer7 --l7proto qq   表示匹配腾讯qq的 当然也支持很多协议,这个默认是没有的,需要我们给内核打补丁并重新编译内核及iptables才可以使用 -m layer7 这个显示扩展匹配
3.动作:
-j
DROP 直接丢掉
ACCEPT 允许通过
REJECT 丢掉,但是回复信息
LOG --log-prefix"说明信息,自己随便定义" ,记录日志
SNAT       源地址转换
DNAT       目标地址转换
REDIRECT   重定向
MASQUERAED  地址伪装
保存iptables规则
service iptables save
# 重启iptables服务
service iptables stop
service iptables start

8、Linux下IPtables企业案例解析

含义:

:INPUT ACCEPT [0:0]# 该规则表示INPUT表默认策略是ACCEP ([ 0:0 ]里记录的就是通过该规则的数据包和字节总数。)
:FORWARD ACCEPT [0:0]# 该规则表示FORWARD表默认策略是ACCEPT
:OUTPUT ACCEPT [0:0]# 该规则表示OUTPUT表默认策略是ACCEPT
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT# 意思是允许进入的数据包只能是刚刚我发出去的数据包的回应,ESTABLISHED:已建立的链接状态。RELATED:该数据包与本机发出的数据包有关。
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT# 意思就允许本地环回接口在INPUT表的所有数据通信,-i 参数是指定接口,接口是lo,lo就是Loopback(本地环回接口)
-A INPUT -j REJECT –reject-with icmp-host-prohibited
-A FORWARD -j REJECT –reject-with icmp-host-prohibited
# 这两条的意思是在INPUT表和FORWARD表中拒绝所有其他不符合上述任何一条规则的数据包。并且发送一条host prohibited的消息给被拒绝的主机。
下面来介绍一下,我添加的每个参数是什么意思,跟我没讲得允许22端口的一样
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
-A 最后添加一条规则
-j 后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)
–dport 限制目标的端口号码。
-p 协定:设定此规则适用于哪种封包格式 主要的封包格式有: tcp, udp, icmp 及 all 。
-m state –state 模糊匹配一个状态,
NEW 用户发起一个全新的请求
ESTABLISHED 对一个全新的请求进行回应
RELATED 两个完整连接之间的相互关系,一个完整的连接,需要依赖于另一个完整的连接。
INVALID 无法识别的状态。

9、IPtables企业案例规则实战一

 (1)WEB服务器,开启80端口;

[root@www-jfedu-net ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
邮件服务器,开启25,110端口;  
[root@www-jfedu-net ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@www-jfedu-net ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
FTP服务器,开启21端口
[root@www-jfedu-net ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@www-jfedu-net ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
DNS服务器,开启53端口
[root@www-jfedu-net ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
允许icmp包通过,也就是允许ping,
[root@www-jfedu-net ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
[root@www-jfedu-net ~]# iptables -A INPUT -p icmp -j ACCEPT    (INPUT设置成DROP的话)
将本机的8080端口转发至其他主机,主机IP:192.168.1.162,目标主机IP和端口:192.168.1.163:80,规则如下;
iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.0.162 --dport 8080 -j DNAT --to-destination 192.168.1.163:80
iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.162:8080
echo 1 > /proc/sys/net/ipv4/ip_forward
同时开启iptables forward转发功能。 

(2)生产环境,线上门户网站iptables规则策略如下:

[root@localhost ~]# vim /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Wed Dec 14 21:05:31 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [602:39593]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#########################
-A INPUT -i lo -j ACCEPT
-A INPUT -s 116.22.202.146 -j DROP
-A INPUT -s 139.224.227.121 -j ACCEPT
##########################
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -s 116.243.139.7 -p tcp -m state --state NEW -m tcp --dport 7001 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8801 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
####
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Dec 14 21:05:31 2016

二、Firewalld入门简介

      从CentOS7开始,默认是没有iptables的,而使用了firewall防火墙,FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。

     什么是动态防火墙?回忆一下iptables service 管理防火墙规则的模式:用户将新的防火墙规则添加进/etc/sysconfig/iptables 配置文件当中,再执行命令 service iptables reload 使变更的规则生效。

       这整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。

       哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。

        firewalld 和 iptables 之间的关系, firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。firewalld 使用 python 语言开发,在新版本中已经计划使用 c++ 重写 daemon 部分。

1、什么是区域(zone)?

Firewalld将网卡对应到不同的区域(zone),zone 默认共有9个,block dmz drop external home internal public trusted work.

不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在CentOS7系统中,默认区域被设置为public.

在最新版本的fedora(fedora21)当中随着 server 版和 workstation 版的分化则添加了两个不同的自定义 zone FedoraServer 和 FedoraWorkstation 分别对应两个版本。

使用下面的命令分别列出所有支持的 zone 和查看当前的默认 zone:

[root@www-jfedu-net ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@www-jfedu-net ~]# firewall-cmd --get-default-zone
public

区域(zone)说明如下:
iptables service 在 /etc/sysconfig/iptables 中储存配置
firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里

/etc/firewalld/的区域设定是一系列可以被快速执行到网络接口的预设定。列表并简要说明如下:

drop(丢弃)
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制)
任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
public(公共)
在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external(外部)
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区)
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work(工作)
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭)
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部)
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted(信任)
可接受所有的网络连接。
指定其中一个区域为默认区域是可行的。当接口连接加入了 NetworkManager,它们就被分配为默认区域。安装时firewalld 里的默认区域被设定为公共区域。

2、什么是服务?

在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等.
与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70+ 种服务供我们使用.
当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中.
service 配置的好处显而易见:
第一,通过服务名字来管理规则更加人性化,
第二,通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。

每加载一项 service 配置就意味着开放了对应的端口访问,使用下面的命令分别列出所有支持的 service 和查看当前 zone 种加载的 service:

[root@www-jfedu-net ~]# firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
[root@www-jfedu-net ~]# firewall-cmd --list-services
dhcpv6-client ssh

动态添加一条防火墙规则如下:
假设自定义的 ssh 端口号为 12222,使用下面的命令来添加新端口的防火墙规则:

firewall-cmd --add-port=12222/tcp --permanent

如果需要使规则保存到 zone 配置文件,则需要加参数 –permanent
举例如下:

[root@www-jfedu-net zones]# firewall-cmd --add-port=12222/tcp
success
[root@www-jfedu-net zones]# cat /etc/firewalld/zones/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"/>
</zone>
[root@www-jfedu-net zones]# firewall-cmd --add-port=12222/tcp --permanent
success
[root@www-jfedu-net zones]# cat /etc/firewalld/zones/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="12222"/>
</zone>

# 注意:防火墙配置文件也可以手动修改,修改后记得重载,重载方法请看下文。

3、Firewalld必备命令

# 关闭firewalld
[root@www-jfedu-net zones]# systemctl stop firewalld.service
# 启动firewalld
[root@www-jfedu-net zones]# systemctl start firewalld.service
# 把firewalld加入到系统服务
[root@www-jfedu-net zones]# systemctl enable firewalld.service
# 从系统服务移除
[root@www-jfedu-net zones]# systemctl disable firewalld.service
rm '/etc/systemd/system/basic.target.wants/firewalld.service'
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
# 查看firewalld状态 两种方法2选1即可
[root@www-jfedu-net zones]# firewall-cmd --state
running
[root@www-jfedu-net zones]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon

# 重读防火墙
# 以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@www-jfedu-net ~]# firewall-cmd --reload
success

# 以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@www-jfedu-net ~]# firewall-cmd --complete-reload
success

# 注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

4、Firewalld区域操作

# 获取支持的区域(zone)列表

[root@www-jfedu-net zones]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

# 获取所有支持的服务

[root@www-jfedu-net zones]# firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https

# 获取所有支持的ICMP类型

[root@www-jfedu-net zones]# firewall-cmd --get-icmptypes
destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded

# 列出全部启用的区域的特性

[root@www-jfedu-net zones]# firewall-cmd --list-all-zones
# 输出格式是:
<zone>
interfaces: <interface1> ..
services: <service1> ..
ports: <port1> ..
forward-ports: <forward port1> ..
icmp-blocks: <icmp type1> ..

# 输出区域 <zone> 全部启用的特性。如果生略区域,将显示默认区域的信息。
firewall-cmd [–zone=<zone>] –list-all

[root@www-jfedu-net zones]# firewall-cmd --list-all
public (default, active)
interfaces: eno16777736
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
[root@www-jfedu-net zones]# firewall-cmd --zone=work --list-all
work
interfaces:
sources:
services: dhcpv6-client ipp-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

# 获取默认区域的网络设置

[root@www-jfedu-net zones]# firewall-cmd --get-default-zone
public

# 设置默认区域

[root@www-jfedu-net zones]# firewall-cmd --set-default-zone=work
success

# 注意:流入默认区域中配置的接口的新访问请求将被置入新的默认区域。当前活动的连接将不受影响。

# 获取活动的区域

[root@www-jfedu-net zones]# firewall-cmd --get-active-zones
work
interfaces: eno16777736

# 根据接口获取区域
firewall-cmd –get-zone-of-interface=<interface>

[root@www-jfedu-net zones]# firewall-cmd --get-zone-of-interface=eno16777736
public

## 以下关于区域和接口的操作,可以根据实际情况修改.
# 将接口增加到区域

firewall-cmd [--zone=<zone>] --add-interface=<interface>

# 如果接口不属于区域,接口将被增加到区域。如果区域被省略了,将使用默认区域。接口在重新加载后将重新应用。

# 修改接口所属区域

firewall-cmd [--zone=<zone>] --change-interface=<interface>

# 这个选项与 –add-interface 选项相似,但是当接口已经存在于另一个区域的时候,该接口将被添加到新的区域。

# 从区域中删除一个接口

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

# 查询区域中是否包含某接口

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

# 注意:返回接口是否存在于该区域。没有输出。

# 列举区域中启用的服务

firewall-cmd [ --zone=<zone> ] --list-services

# 这两条简单点说,就是断网和连网.
# 启用应急模式阻断所有网络连接,以防出现紧急状况

firewall-cmd --panic-on

# 禁用应急模式

firewall-cmd --panic-off

# 查询应急模式

firewall-cmd --query-panic

# 启用区域中的一种服务

firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>]

# 此举启用区域中的一种服务。如果未指定区域,将使用默认区域。如果设定了超时时间,服务将只启用特定秒数。如果服务已经活跃,将不会有任何警告信息。
# 例: 使区域中的 ipp-client 服务生效60秒:

firewall-cmd --zone=home --add-service=ipp-client --timeout=60

# 例: 启用默认区域中的http服务:

firewall-cmd --add-service=http

# 禁用区域中的某种服务

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

# 此举禁用区域中的某种服务。如果未指定区域,将使用默认区域。
# 例: 禁止 home 区域中的 http 服务:

firewall-cmd --zone=home --remove-service=http

# 区域种的服务将被禁用。如果服务没有启用,将不会有任何警告信息。

# 查询区域中是否启用了特定服务

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

# 如果服务启用,将返回1,否则返回0。没有输出信息。

# 启用区域端口和协议组合

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

# 此举将启用端口和协议的组合。端口可以是一个单独的端口 <port> 或者是一个端口范围 <port>-<port> 。协议可以是 tcp 或 udp。

# 禁用端口和协议组合

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

# 查询区域中是否启用了端口和协议组合

firewall-cmd [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>

# 如果启用,此命令将有返回值。没有输出信息。

# 启用区域中的 IP 伪装功能

firewall-cmd [--zone=<zone>] --add-masquerade

# 此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。

# 禁用区域中的 IP 伪装

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

# 查询区域的伪装状态

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

# 如果启用,此命令将有返回值。没有输出信息。

# 启用区域的 ICMP 阻塞功能

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

# 此举将启用选中的 Internet 控制报文协议 (ICMP) 报文进行阻塞。 ICMP 报文可以是请求信息或者创建的应答报文,以及错误应答。

# 禁止区域的 ICMP 阻塞功能

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

# 查询区域的 ICMP 阻塞功能

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

# 如果启用,此命令将有返回值。没有输出信息。
# 例: 阻塞区域的响应应答报文:

firewall-cmd --zone=public --add-icmp-block=echo-reply

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

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

# 端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口 <port> 或者是端口范围 <port>-<port> 。协议可以为 tcp 或udp 。目标端口可以是端口号 <port> 或者是端口范围 <port>-<port> 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能仅可用于IPv4。

# 禁止区域的端口转发或者端口映射

firewall-cmd [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

# 查询区域的端口转发或者端口映射

firewall-cmd [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

# 如果启用,此命令将有返回值。没有输出信息。
# 例: 将区域 home 的 ssh 转发到 127.0.0.2

firewall-cmd --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2

5、Firewalld永久设置

永久选项不直接影响运行时的状态。这些选项仅在重载或者重启服务时可用。为了使用运行时和永久设置,需要分别设置两者。 选项--permanent 需要是永久设置的第一个参数。

# 获取永久选项所支持的服务。

firewall-cmd --permanent --get-services

# 获取永久选项所支持的ICMP类型列表

firewall-cmd --permanent --get-icmptypes

# 获取支持的永久区域

firewall-cmd --permanent --get-zones

# 启用区域中的服务

firewall-cmd --permanent [--zone=<zone>] --add-service=<service>

# 此举将永久启用区域中的服务。如果未指定区域,将使用默认区域。

# 禁用区域中的一种服务

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

# 查询区域中的服务是否启用

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

# 如果服务启用,此命令将有返回值。此命令没有输出信息。
# 例: 永久启用 home 区域中的 ipp-client 服务

firewall-cmd --permanent --zone=home --add-service=ipp-client

# 永久启用区域中的一个端口-协议组合

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

# 永久禁用区域中的一个端口-协议组合

firewall-cmd --permanent [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>

# 查询区域中的端口-协议组合是否永久启用

firewall-cmd --permanent [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>

# 如果服务启用,此命令将有返回值。此命令没有输出信息。

# 例: 永久启用 home 区域中的 https (tcp 443) 端口

firewall-cmd --permanent --zone=home --add-port=443/tcp

# 永久启用区域中的伪装

firewall-cmd --permanent [--zone=<zone>] --add-masquerade

# 此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。

# 永久禁用区域中的伪装

firewall-cmd --permanent [--zone=<zone>] --remove-masquerade

# 查询区域中的伪装的永久状态

firewall-cmd --permanent [--zone=<zone>] --query-masquerade

# 如果服务启用,此命令将有返回值。此命令没有输出信息。

# 永久启用区域中的ICMP阻塞

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

# 此举将启用选中的 Internet 控制报文协议 (ICMP) 报文进行阻塞。 ICMP 报文可以是请求信息或者创建的应答报文或错误应答报文。

# 永久禁用区域中的ICMP阻塞

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

# 查询区域中的ICMP永久状态

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

# 如果服务启用,此命令将有返回值。此命令没有输出信息。
# 例: 阻塞公共区域中的响应应答报文:

firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply

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

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

# 端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口 <port> 或者是端口范围 <port>-<port> 。协议可以为 tcp 或udp 。目标端口可以是端口号 <port> 或者是端口范围 <port>-<port> 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能仅可用于IPv4。

# 永久禁止区域的端口转发或者端口映射

firewall-cmd --permanent [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

# 查询区域的端口转发或者端口映射状态

firewall-cmd --permanent [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

# 如果服务启用,此命令将有返回值。此命令没有输出信息。
# 例: 将 home 区域的 ssh 服务转发到 127.0.0.2

firewall-cmd --permanent --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2

## 直接选项
# 直接选项主要用于使服务和应用程序能够增加规则。 规则不会被保存,在重新加载或者重启之后必须再次提交。传递的参数 <args> 与 iptables, ip6tables 以及 ebtables 一致。
# 选项 –direct 需要是直接选项的第一个参数。
# 将命令传递给防火墙。参数 <args> 可以是 iptables, ip6tables 以及 ebtables 命令行参数。

firewall-cmd --direct --passthrough { ipv4 | ipv6 | eb } <args>

# 为表 <table> 增加一个新链 <chain> 。

firewall-cmd --direct --add-chain { ipv4 | ipv6 | eb } <table> <chain>

# 从表 <table> 中删除链 <chain> 。

firewall-cmd --direct --remove-chain { ipv4 | ipv6 | eb } <table> <chain>

# 查询 <chain> 链是否存在与表 <table>. 如果是,返回0,否则返回1.

firewall-cmd --direct --query-chain { ipv4 | ipv6 | eb } <table> <chain>

# 如果启用,此命令将有返回值。此命令没有输出信息。

# 获取用空格分隔的表 <table> 中链的列表。

firewall-cmd --direct --get-chains { ipv4 | ipv6 | eb } <table>

# 为表 <table> 增加一条参数为 <args> 的链 <chain> ,优先级设定为 <priority>。

firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>

# 从表 <table> 中删除带参数 <args> 的链 <chain>。

firewall-cmd --direct --remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args>

# 查询 带参数 <args> 的链 <chain> 是否存在表 <table> 中. 如果是,返回0,否则返回1.

firewall-cmd --direct --query-rule { ipv4 | ipv6 | eb } <table> <chain> <args>

# 如果启用,此命令将有返回值。此命令没有输出信息。

# 获取表 <table> 中所有增加到链 <chain> 的规则,并用换行分隔。

firewall-cmd --direct --get-rules { ipv4 | ipv6 | eb } <table> <chain>

6、Firewalld配置文件实战

系统本身已经内置了一些常用服务的防火墙规则,存放在/usr/lib/firewalld/services/ (模板服务配置路径)
注意,请勿修改/usr/lib/firewalld/services/ ,只有 /etc/firewalld/services 的文件可以被编辑:

[root@www-jfedu-net ~]# ls /usr/lib/firewalld/services/
amanda-client.xml dhcpv6.xml high-availability.xml ipp-client.xml kpasswd.xml libvirt.xml mysql.xml pmcd.xml pop3s.xml RH-Satellite-6.xml smtp.xml tftp.xml
bacula-client.xml dhcp.xml https.xml ipp.xml ldaps.xml mdns.xml nfs.xml pmproxy.xml postgresql.xml rpc-bind.xml ssh.xml transmission-client.xml
bacula.xml dns.xml http.xml ipsec.xml ldap.xml mountd.xml ntp.xml pmwebapis.xml proxy-dhcp.xml samba-client.xml telnet.xml vnc-server.xml
dhcpv6-client.xml ftp.xml imaps.xml kerberos.xml libvirt-tls.xml ms-wbt.xml openvpn.xml pmwebapi.xml radius.xml samba.xml tftp-client.xml wbem-https.xml

以下例子均以系统自带的public zone 为例子.

1. 如果想开放80端口供外网访问http服务,例子如下

1.1 将 http.xml复制到/etc/firewalld/services/下面,以服务形式管理防火墙,
# 这个cp命令其实是可以省略的,系统会优先去读取 /etc/firewalld 里面的文件,读取完毕后,会去/usr/lib/firewalld/services/ 再次读取.为了方便修改和管理,建议复制到/etc/firewalld

[root@www-jfedu-net ~]# cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/
[root@www-jfedu-net ~]# ls /etc/firewalld/services/
http.xml
[root@www-jfedu-net ~]# ls /etc/firewalld/zones/
public.xml public.xml.old

1.2 修改public.xml,加入http服务

cat /etc/firewalld/zones/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"/>
<service name="http"/> # 这行是后加的,要匹配 /etc/firewalld/services/文件夹下的文件名
</zone>

1.3 重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@www-jfedu-net ~]# firewall-cmd --reload
success

以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@www-jfedu-net ~]# firewall-cmd --complete-reload
success

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

2. 修改防火墙ssh的端口方法
2.1 复制ssh.xml文件到/etc/firewalld/services/

[root@www-jfedu-net ~]# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/

2.2 修改ssh.xml文件 12222为ssh端口

[root@www-jfedu-net ~]# cat /etc/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="12222"/>
</service>

2.3 重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@www-jfedu-net ~]# firewall-cmd --reload
success

以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@www-jfedu-net ~]# firewall-cmd --complete-reload
success

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

3. 指定ip访问ssh端口
3.1 修改/etc/firewalld/zones/

# rule字段内为要限制的ip和使用的服务;

[root@www-jfedu-net ~]# cat /etc/firewalld/zones/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"/>
<rule family="ipv4">
<source address="192.168.23.1"/>
<service name="ssh"/>
<accept/>
</rule>
</zone>

执行如下指令也可以实现IP和端口允许和限制;

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.142" port protocol="tcp" port="6379" accept"

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.142" port protocol="tcp" port="6379" drop"

重新载入 两条命令都可以的;

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@www-jfedu-net ~]# firewall-cmd --reload
success

以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@www-jfedu-net ~]# firewall-cmd --complete-reload
success

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

4. 添加自定义服务 举例,添加8080端口为新的Service
4.1 添加新文件 8080.xml

cat /etc/firewalld/services/8080.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>8080 Test</short>
<description>此处为文字说明</description>
<port protocol="tcp" port="8080"/>
</service>

4.2 编辑public.xml 文件,加入相应的Server

cat /etc/firewalld/zones/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"/>
<service name="8080"/> # 这行是后加的,要匹配 /etc/firewalld/services/8080.xml 文件名
</zone>

4.3 重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@www-jfedu-net ~]# firewall-cmd --reload
success

以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@www-jfedu-net ~]# firewall-cmd --complete-reload
success

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

5. 基于Firewall实现网络伪装及端口转发

1)如果想通过firewalld实现网络伪装,将内网主机局域网代理上网,可以使用IP伪装,伪装指令如下:

此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。

firewall-cmd --permanent --zone=<ZONE> --add-masquerade

firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 masquerade"

2)访问本地端口映射至本机其他端口

将访问192.168.0.141主机8888端口的请求转发至22端口

firewall-cmd --permanent --zone=public --add-forward-port=port=8888:proto=tcp:toport=22:toaddr=192.168.0.141

3)访问本地端口映射至远程主机端口

将访问192.168.0.141主机8080端口的请求转发至192.168.0.142的80端口

firewall-cmd --permanent --zone=public --add-forward-port=port=8080:proto=tcp:toaddr=192.168.0.142:toport=80

 

 

 

posted @ 2019-01-20 20:15  流年晕开时光  阅读(192)  评论(0编辑  收藏  举报