Firewalld
Firewalld概述
- 动态防火墙后台程序 firewalld 提供了一个动态管理的防火墙,用以支持网络 “ zones” ,以分配对一个网络及其相关链接和界面一定程度的信任。它具备对 IP v4 和 IP v6 防火墙设置的支持。它支持以太网桥,并有分离运行时间和永久性配置选择。它还具备一个通向服务或者应用程序以直接增加防火墙规则的接口
系统提供了图像化的配置工具firewall-config、system-config-firewall,提供命令行客户端firewall-cmd,用于配置firewalld永久性或非永久性运行时间的改变:它依次用 iptables工具与执行数据包筛选的内核中的 Netfilter通信
firewalld和iptables service 之间最本质的不同是:
1、iptables service 在 /etc/sysconfig/iptables 中储存配置,而 firewalld将配置储存在/usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种XML文件里
2、使用 iptables service每一个单独更改意味着清除所有旧有的规则和从/etc/sysconfig/iptables里读取所有新的规则,然而使用 firewalld却不会再创建任何新的规则;仅仅运行规则中的不同之处。因此,firewalld可以在运行时间内,改变设置而不丢失现行连接
基于用户对网络中设备和交通所给与的信任程度,防火墙可以用来将网络分割成不同的区域NetworkManager通知firewalld一个接口归属某个区域,新加入的接口被分配到默认区域。
网络区名称 |
默认配置 |
trusted(信任) |
可接受所有的网络连接 |
home(家庭) |
用于家庭网络,仅接受ssh、mdns、ipp-client、samba-client、或dhcpv6-client服务连接 |
internal(内部) |
用于内部网络,仅接受ssh、mdns、ipp-client、samba-client、dhcpv6-client服务连接 |
work(工作) |
用于工作区,仅接受ssh、ipp-client或dhcpv6-client服务连接 |
public(公共) |
在公共区域内使用,仅接受ssh或dhcpv6-client服务连接,为firewalld的默认区域 |
external(外部) |
出去的ipv4网络连接通过此区域伪装和转发,仅接受ssh服务连接 |
dmz(非军事区) |
仅接受ssh服务接连 |
block(限制) |
拒绝所有网络连接 |
drop(丢弃) |
任何接收的网络数据包都被丢弃,没有任何回复
|
管理防火墙
1、安装防火墙软件
yum install firewalld firewalld-config -y
-
[root@client Desktop]# firewalld-config &
firewalld的图形化管理
2、启动和禁止防火墙
systemctl start firewalld
systemctl enable firewalld
systemctl stop firewalld
systemctl disable firewalld
3、使用命令行接口配置防火墙
[root@client Desktop]# firewall-cmd --state
running
查看当前活动的区域,并附带一个目前分配给它们的接口列表
[root@client Desktop]# firewall-cmd --get-active-zones
ROL
sources: 172.25.0.252/32
public ##网络区为公共
interfaces: eth0
[root@client Desktop]# firewall-cmd --get-default-zone
public
[root@client Desktop]# firewall-cmd --get-zones
ROL block dmz drop external home internal public trusted work
[root@client Desktop]# firewall-cmd --zone=public --list-all
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
[root@client Desktop]# firewall-cmd --zone=block --list-all
block
interfaces:
sources:
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
[root@client Desktop]# firewall-cmd --get-services
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@client Desktop]# firewall-cmd --set-default-zone=trusted
success
[root@client Desktop]# firewall-cmd --get-default-zone
trusted
[root@client Desktop]# firewall-cmd --get-active-zones
ROL
sources: 172.25.0.252/32
trusted ##网络区为信任
interfaces: eth0
设置网络地址到指定的区域
firewall-cmd -permanent --add-source=172.25.254.27 --zone=trusted
-
firewall-cmd -permanent --add-source=172.25.254.27/24 --zone=trusted
–permanent参数表示永久生效设置
如果没有指定–zone参数,那么会加入默认区域
172.25.254.27(IP指定)、172.25.254.27/24(网络位相同即可)
删除指定区域中的网络地址
firewall-cmd -permanent --remove-source=172.25.254.27 --zone=trusted
添加、改变、删除网络接口
查看指定级别的接口
[root@client Desktop]# firewall-cmd --list-interfaces
eth0
查看指定接口的 Zone 信息
[root@client Desktop]# firewall-cmd --get-zone-of-interface=eth0
trusted
添加网络接口
[root@client Desktop]# firewall-cmd --add-interface=eth1 --zone=public
success
[root@client Desktop]# firewall-cmd --get-zone-of-interface=eth1
public
改变某接口至某信任等级,譬如改变 eth0 至 public
[root@client Desktop]# firewall-cmd --change-interface=eth0 --zone=public
success
[root@client Desktop]# firewall-cmd --get-zone-of-interface=eth0
public
[root@client Desktop]# firewall-cmd --get-zone-of-interface=eth1
public
删除指定接口eth1
[root@client Desktop]# firewall-cmd --remove-interface=eth1 --zone=trusted
success
[root@client Desktop]# firewall-cmd --get-zone-of-interface=eth1
no zone
添加
[root@client ~]# firewall-cmd --zone=public -add-service=http
success
[root@client ~]# firewall-cmd --list-all
public (default, active)
interfaces: eth0 eth1
sources:
services: dhcpv6-client http ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
删除
[root@client ~]# firewall-cmd --remove-service=http
success
[root@client ~]# firewall-cmd --reload ##不完全刷新
success
[root@client ~]# firewall-cmd --list-all
[root@client ~]# firewall-cmd --list-all
public (default, active)
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
列出、添加、删除端口
-
firewall-cmd --zone=public -list-ports
firewall-cmd --add-port=8080/tcp --zone=public
firewall-cmd --remove-port=8080/tcp --zone=public
-
重新加载防火墙
注意:这并不会中断已经建立的连接,如果打算中断,可以使用 –complete-reload选项)firewalld的规则被保存在/etc/firewalld目录下的文件中,你也可以直接编辑这些文件达到配置防火墙的目的。/usr/lib/firewalld目录下的内容是不可以被编辑的,但可以用做默认模板
4、Direct Rules
通过 firewall-wall-cmd 工具,可以使用 --direct 选项在运行时间里增加或者移除链。
如果不熟悉 iptables ,使用直接接口非常危险,因为可能会无意间导致防火墙被入侵。
直接端口模式适用于服务或者程序,以便在运行时间内增加特定的防火墙规则。
直接端口模式添加的规则优先应用
firewall-cmd –-direct –get-all-rules ##列出规则
firewall-cmd –-direct –add-rule ipv4 filter INPUT 1 -p tcp –dport 80 -s 172.25.254.50 -j ACCEPT ##添加规则
firewall-cmd –-direct –remove-rule ipv4 filter INPUT 1 -p tcp –dport 80 -s 172.25.254.50 -j ACCEPT ##删除规则
例如:不让50主机访问80端口的请求响应:
![这里写图片描述](https://img-blog.csdn.net/20180613191526744?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hoNTgyMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
5、端口转发与地址伪装
在防火墙服务器上将伪装打开:
当50从端口登陆主机时,将50伪装
当访问本机22端口时,将其转到227这个主机上
刷新
![这里写图片描述](https://img-blog.csdn.net/20180613205620680?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hoNTgyMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
IP为172.25.254.50的主机连接主机172.25.254.127时,将其转到主机172.25.254.227
测试
用50主机ssh连接136主机:
登陆的是227主机:
查看登陆者,登陆者是127。50主机被伪装起来了
![这里写图片描述](https://img-blog.csdn.net/20180613210137133?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hoNTgyMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
Iptables
首先得保持一个纯净的环境,将firewalld关闭。安装iptables,并启动
-
yum install iptables-services -y
安装iptables
[root@client Desktop]# iptables -nL ##查看策略
略,此时显示出的是 firewalld 的策略
[root@client Desktop]# systemctl stop firewalld.service
[root@client Desktop]# systemctl disable firewalld.service
[root@client Desktop]# systemctl start iptables.service
[root@client Desktop]# systemctl enable iptables.service
[root@client Desktop]# iptables -F ##刷新策略
[root@client Desktop]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@client Desktop]#
(1)理论基础:当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。
(2)iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。
iptables中定义有表,分别表示提供的功能,有filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪),这些表具有一定的优先级:raw–>mangle–>nat–>filter
下面是数据包流向图:
数据包先经过PREOUTING,由该链确定数据包的走向:
(3)iptables的规则书写:
基本语法:iptables [-t 表] [操作命令] [链][规则匹配器][-j 目标动作]
iptables
[-t filter]
[-AI INPUT,OUTPUT,FORWARD]
[-io interface]
[-p tcp,udp.icmp,all]
[-s ip/nerwork]
[--sport ports]
[-d ip/network]
[--dport ports]
[-j ACCEPT DROP REJECT REDIRECT MASQUERADE LOG
DNAT SNAT MIRROR QUEUE RETURN MARK]
常用操作命令:
-A 在指定链尾部添加规则
-D 删除匹配的规则
-R 替换匹配的规则
-I 在指定位置插入规则
其他操作命令:
-L/S 列出指定链或所有链的规则
-F 删除指定链或所有链的规则
-N 创建用户自定义链
-X 删除指定的用户自定义链
-P 为指定链设置默认规则策略,对自定义链不起作用
-Z 将指定链或所有链的计数器清零
-E 更改自定义链的名称
-n ip地址和端口号以数字方式显示
常见规则匹配器说明:
-p tcp|udp|icmp|all 匹配协议,all会匹配所有协议
-s addr[/mask] 匹配源地址
-d addr[/mask] 匹配目标地址
–sport port1[:port2] 匹配源端口(可指定连续的端口)
–dport port1[:port2] 匹配目的端口(可指定连续的端口)
-o interface
匹配出口网卡,只适用FORWARD、POSTROUTING、OUTPUT。
匹配入口网卡,只使用PREROUTING、INPUT、FORWARD。
目标动作说明:
ACCEPT 允许数据包通过
DROP 丢弃数据包
REJECT 丢弃数据包,并且将拒绝信息发送给发送方
实验
-
显示filter表所有链的规则,默认为filter表
如上,可以看到filter三条链
-
查看nat表的
- 注意一点:火墙设置的策略好坏会影响到传输速率的快慢,因为火墙规则读取是有先后顺序的。
- NAT (Net Address Trancelate:网络地址转换)
- SNAT(源地址转换)是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机
- DNAT(目标地址转换),就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B
下面我们来模拟以下两个转换:
SNAT
实验准备:
双网卡主机:
单网卡主机:
IP:
网关:
注意:这里双网卡主机类似于路由器的功能。所以单网卡主机的网关必须是和本机ip处于同一网段而且是和双网卡主机上的一块网卡IP相同。
接下来在单网卡主机上ping网关,检查实验环境(结果如下图,说明双网卡主机网卡良好。):
在进行SNAT之前,单网卡主机是不能连接不同网段的172.25.254.50这台主机的 。
我们要用单网卡主机来连不同网段的主机,必须要做SNAT。在双网卡主机上做防火墙规则书写:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.127
查看火墙规则:
这时查看 net 表的ip转发功能,0代表未开启,则需要将其开启;1代表已开启:
注:开启方法
[root@client Desktop]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
[root@client Desktop]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 ##添加
[root@client Desktop]# sysctl -p
net.ipv4.ip_forward = 1
[root@client Desktop]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
此时在单网卡主机ping不同网段的主机,发现可以:
SNAT:局域网共享一个公网IP接入lnternel
好处如下:
保护内网用户安全,因为公网地址总有一些人恶意扫描,而内网地址在公网没有路由所以无法被扫描,能被扫描的只有防火墙这一台,这样就减少了被攻击的可能。
Ipv4地址匮乏,很多公司只有一个ipv4地址,但是却有几百个用户需要上网,这个时候就需要使用SNAT。
省钱,公网地址付费,使用SNAT只需要一个公网ip就可以满足几百人同时上网。
DNAT
在双网卡主机上书写规则:
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-dest 172.25.20.227
从eth0接口进来的数据包我们将其目标地址转为172.25.20.227这台主机上
在172.25.254.50主机上测试——用ssh连接172.25.254.127:
但是却是登陆的172.25.20.227这台主机:
实现了目的地转换。
DNAT的用途(DNAT:向internel发布内网服务器 )
在内网中有服务器,如果想让公网用户访问有有两种方法: