防火墙
firewalld是rhel7引入netfilter子系统交互程序,将网络划分为多个区域来进行管理。
官网地址
http://www.firewalld.org/
开始试验:准备干净的虚拟机
# yum install firewalld firewall-config -y
# systemctl restart firewalld --启动服务
# systemctl status firewalld --确认状态
# systemctl enable firewalld --设为开机自动启动(可选)
概念一 ZONE:
Zone 简单来说就是防火墙方案,就是一套规则集,你可以切换使用哪一个zone
# firewall-cmd --get-zones --查看现在有哪些zone
work drop internal external trusted home dmz public block
drop:拒绝所有外部连接请求。
block:拒绝所有外部连接(with an icmp-host-prohibited message for IPv4 and icmp6-adm-prohibited for IPv6),允许内部发起的连接
public:适用公共环境,拒绝所有外部连接请求,但指定外部连接可以进入
external:特别适用路由器启用了伪装功能的外部网。拒绝所有外部连接请求,只能接收经过选择的连接。
dmz:用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。(受限制的公共连接可以进入)
work:适用于工作网络环境,概念和workgroup一样,也是指定的外部连接允许用于工作区。
home:类似家庭组,用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接
internal:用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接
trusted:可接受所有的网络连接。(最不安全)
# firewall-cmd --get-default-zone --查看当前使用的zone
public
# firewall-cmd --set-default-zone=work
# firewall-cmd --set-default-zone=public --修改当前使用的zone
# firewall-cmd --list-all --查看当前使用的zone的规则集
# firewall-cmd --zone=work --list-all --指定查看work这个zone的规则集
# vim /etc/firewalld/zones/public.xml" firewall的默认模式"public"的配置文件,可以看到添加的服务都在里面,如果在其中按照格式添加"ftp",重新加载后就添加了这个服务了。
# cd /usr/lib/firewalld/services/
进入这个目录后,输入"ls",就可以看到可以添加哪些服务,并且可以看到这些服务的名称了。
概念二:网卡接口
# firewall-cmd --zone=public --add-interface=ens33 --指定网卡加入到哪个zone
# firewall-cmd --get-zone-of-interface=ens33 --查看网卡加入到哪个zone
-------------------
常用命令:
firewall‐cmd ‐‐reload //重新载入防火墙策略,未设置为永久策略的规则会丢失。
firewall‐cmd ‐‐permanent //永久策略属性
firewall‐cmd ‐‐add‐ //添加一条策略
--add-source=source[/mask]
--add-service=http
firewall-cmd --remove 删除一条策略
firewall-cmd --list-all 查询已有防火墙规则
概念三:服务于端口
port,service 分别表示端口和服务
# firewall-cmd --add-port=80/tcp --允许tcp的80端口进来的通迅(类似iptables的INPUT)
# firewall-cmd --remove-port=80/tcp --删除上面的规则
# firewall-cmd --add-service=http --允许http服务进来的通迅(不用管它是什么端口,只记住服务就好了)
# firewall-cmd --remove-service=http
# firewall-cmd --add-service=ftp --允许ftp服务进来的通迅(无论主动还是被动都可以,这样就把iptables的写法简单化了)
# firewall-cmd --remove-service=ftp
概念四:富规则
rich-rule复杂规则(富规则)
富规则中可以包含很多网络元素,比如:IP地址、端口、以及处理动作、记录日志等操作。我们可以使用富规则来精确控制我们的访问流量,而不是粗狂的。
# firewall-cmd --add-rich-rule="rule family="ipv4" source address=192.168.224.11 service name="ssh" accept"
下面两条合起来实现允许所有人访问我的http,但drop掉192.168.224.11的访问我的http的包
# firewall-cmd --add-service=http
# firewall-cmd --add-rich-rule="rule family="ipv4" source address=192.168.224.11 service name="http" drop"
# firewall-cmd --list-rich-rule (查询现有的富规则)
概念五:关于立即生效与永久生效
立即生效:上面的练习都是立刻生效,但是无法永久保存,重启防火墙服务,重启机器,以及执行--realod参数都会导致规则被覆盖。
永久生效: 在命令行中加入参数 --permanent 为永久保存,但是运行时不会立即生效,需要执行 firewall --reload命令才会让规则立刻生效。
# firewall-cmd --permanent --add-service=ftp --加了一个--permanent参数后,立即不生效,需要reload后才能生效
实际写规则时,建议直接写(不加--permanent参数),所有规则写完,测试完成后,再使用
# firewall-cmd --runtime-to-permanent 全部转成permanent规则
概念六:
panic模式,在遭受攻击的时候进入紧急模式,以保护服务器。
# firewall-cmd --panic-on
# firewall-cmd --panic-off
概念七:
图形配置
# firewall-config
iptable自身只能编写IPV4规则,IPV6则需要其他程序实例来帮助完成。
iptables 参数
-A 增加一条规则,后接链名,默认是加到规则的最后面
-D 删除
-L 列出规则
-n 以数值显示
-I 在最前面插入规则
-v 显示统计数据,与-L一起用,看到的信息更多
-F 清空规则
-z 清空计数器
-x 清空自定义链
-t 后接表名
-P policy,默认策略
-p protocol,后接协议名
--dport 目标端口
--sport 源端口
-d destination,目标地址
-s source,源地址
-i 接网卡接口, 进入的网卡接口
-o 接网卡接口, 出去的网卡接口
-j 后接动作
规则储存表:
filter 表 用来进行包过滤: INPUT(输入) 、OUTPUT(输出) 、 FORWARD(正向地)
nat表 用来网络地址转换: network address translation ,允许一个内网地址块,通过NAT转换成公网IP,实现对公网的访问,解决IP地址不足
PREROUTING(预路由) 、 INPUT 、POSTROUTING(后路由) 、OUTPUT
mangle 表 用来对数据包标记 :PREROUTING 、INPUT 、OUTPUT 、 FORWARD 、 POSTROUTING
raw表 对原始数据包的处理:PREROUTING 、 OUTPUT
处理动作:
ACCEPT 接收数据包
DROP 丢弃数据包
REJECT 拒绝数据包,和DROP的区别就是REJECT会返回错误信息,DROP不会
MASQUEREAD IP地址伪装,使用NAT转换成外网IP,可以PPP拔号(外网IP不固定情况)
SNAT 源地址转换,它与MASQUEREAD的区别是SNAT是接一个固定IP
DNAT 目标地址转换
LOG 记录日志
例1,查看规则
iptables -L #默认看的就是 filter 表
iptables -L -t nat #查看的就是 nat 表
iptables -L -t mangle #查看的就是 mangle 表
iptables -L -t raw #查看的就是 raw 表
例2,控制ping
192.168.224.0/24 ------》 192.168.224.10
客户端 服务器
《------
192.168.224.0/24网段ping本机,会被拒绝(客户端会收到拒绝信息)
# iptables -t filter -A INPUT -p icmp -s 192.168.224.0/24 -j REJECT --拒绝该网段的包进来
# iptables -t filter -D INPUT -p icmp -s 192.168.224.0/24 -j REJECT --删除上一条规则
# iptables -t filter -A INPUT -p icmp -s 192.168.224.0/24 -j DROP --丢弃该网段进来的包
# iptables -t filter -A OUTPUT -p icmp -d 192.168.224.0/24 -j REJECT --拒绝出去该网段的包
# iptables -t filter -A OUTPUT -p icmp -d 192.168.224.0/24 -j DROP --丢弃出去该网段的包
--上面四种方法都可以控制拒绝192.168.224.0/24网段ping本机
# iptables -t filter -A INPUT -p icmp -j REJECT --如果不写-s或-d,默认代表所有人
扩展
我想实现所有人都ping不通我,但是192.168.224.11这个IP能ping通我
--提示:iptables的匹配规则:读取的顺序是从上往下一条一条匹配,匹配一条就不继续往下匹配,都没有匹配,则最后匹配 -P 默认策略(所以越详细的规则应放到越前面)
# iptables -t filter -A INPUT -p icmp -j REJECT
# iptables -t filter -A INPUT -p icmp -s 192.168.224.11 -j ACCEPT
--此写法错误的
# iptables -t filter -A INPUT -p icmp -j REJECT
# iptables -t filter -I INPUT -p icmp -s 192.168.224.11 -j ACCEPT
--正确写法,把第二条加到第一条前面。试用I参数加入到第一条规则之前。
# iptables -t filter -I INPUT 2 -p icmp -s 192.168.224.12 -j ACCEPT
--链后面接数字2,表示插入到原来第二条的上面,成为新的第2条
删除的方法:
方法一:
# iptables -t filter -D INPUT -s 192.168.224.11 -p icmp -j ACCEPT
--加的时候怎么写,删除时就要怎么写 A 参数换成 D就可以
方法二:
# iptables -L -n --line 在规则输出的格式上加入行号。
# iptables -D INPUT 2 在INPUT组中,删除第二条规则。
--在规则比较多或者不好写规则的情况下,可以先用 --line 或者 --line-number 列出行号,再用行号删除
方法三(清空):
# iptables -F --直接清空filter表的所有规则
#iptables -t mangle -F #清除 mangle 表规则
修改操作:
# iptables -t filter -R INPUT 3 -p icmp -s 192.168.224.10 -j ACCEPT
--把filter表INPUT链第三行,修改成上面的命令的内容
例3,规则的保存与还原
# iptables-save > /etc/sysconfig/iptables #将当前规则保存到这个文件,文件可以自定义
# iptables-restore < /etc/sysconfig/iptables #把保存的规则还原回去
/etc/sysconfig/iptables文件为默认保存文件,重启iptables服务会默认把此文件里的规则还原。当然也可以手工保存到另一个文件,就需要iptables-restore手工还原了。
如果要永久保留此规则,则先iptables-save > /etc/sysconfig/iptables保存,再# systemctl enable iptables.service做成开机自动启动就可以了
如果你想做成开机自动空规则(没有任何iptables策略),你可以把/etc/sysconfig/iptables保存为空规则,然后systemctl enable iptables.service
例4,实现允许ssh过来(代表本机为服务器身份),ssh出去(代表本机为客户端身份),别的任何访问都拒绝 (要求,INPUT和OUTPUT双链默认策略都为DROP)
解答:
服务器端防火墙
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
客户端防火墙
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -A INPUT -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
执行上面的语句后,本地就无法连接自己了。执行下面的命令,可以实现本地访问(开放其它端口必须做一下两步)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
练习:
只允许特定的IP访问本地的80端口,其他的主机发来的请求忽略。
答案:和上面做法一样,把22换成80就ok了
==============================================================================
连续端口或多端口写法
iptables -A INPUT -p tcp --dport 1:1000 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 25,:110 -j ACCEPT
按照MAC硬件地址进行访问控制
iptables -A INPUT -m mac --mac-source 00:23:CD:95:DA:0B -p all -j ACCEPT
--------------------------------------------
例子:
ftp实现双链拒绝的情况下,客户端通过主动和被动都能访问进来
准备 (在服务器端和客户端都要清空防火墙规则,最好使用新的规则):
清空iptables规则
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -F -t raw
# yum install vsftpd -y
# vim /etc/vsftpd/vsftpd.conf --直接在配置文件最后加上这两句就可以
pasv_min_port=3000
pasv_max_port=3005
systemctl restart vsftpd
iptables -P INPUT DROP
iptables -P OUTPUT DROP
设置双链拒绝后,客户端无法访问FTP
客户端测试方法:
1,命令连接测试,能成功连接上就表示命令端口连接没问题
# ftp 192.168.224.10 (服务器的ip,账号密码就是服务器端已有的用户的)
2,数据传输测试,用上面的命令登录成功后,在客户端使用passive指令转换你的主动和被动模式,
(服务器端不用转换,因为服务器端默认就是主动和被动都支持的)
然后使用ls指令能看到目录就表示数据传输OK了(因为默认是登录到服务器的用户HOME目录)
ftp有主动和被动的连接两种
1,为什么有主动和被动两种连接方式呢?
因为这是一种比较古老的设计方式,它是假设客户端用户有防火墙并且还不会配置防火墙的情况下,才设计出两种模式。
防火墙默认只会拒绝进来的包,而不会拒绝出去或出去回来的包。
2,一般用主动好还是被动好?
用被动比较常见,(原因参考问题一)
3,主动和被动在使用时的区别?
没有防火墙,那么使用起来没什么区别,只是底层传输包的方式不一样
有防火墙,那么防火墙的规则写法也不一样
例子一:FTP主动模式
在服务器端执行:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
在客户端执行:
ftp 192.168.224.10
ftp> ls (无法正常运行)
ftp> passive (切换为主动模式)
ftp> ls (正常访问)
ftp> passive on --此命令用来切换主动模式。然后执行ls就可以了。但是被动模式不行。
例子二:FTP被动模式
被动:
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -F -t raw
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 3000:3005 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000:3005 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
合到一起,两条直接搞定
iptables -A INPUT -p tcp -m multiport --dport 20,21,3000:3005 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sport 20,21,3000:3005 -j ACCEPT
===============================================================================
基于状态的iptables(就是一个包过滤的条件)
包过滤的条件,如:
-p 协议
-sport/dport xxx
-s/-d xxxx
-m state --state 状态
如果按照tcp/ip来划分连接状态,有11种之多(课后可以自己去读一下相关知识),但iptables里只有4种状态;ESTABLISHED、NEW、RELATED及INVALID。
这两个分类是两个不相干的定义。例如在TCP/IP标准描述下UDP及ICMP数据包是没有连接状态的,但在state模块的描述下,任何数据包都有连接状态。
1、ESTABLISHED(建立)
(1)与TCP数据包的关系:首先在防火墙主机上执行SSH Client,并且对网络上的SSH服务器提出服务请求,而这时送出的第一个数据包就是服务请求的数据包,如果这个数据包能够成功的穿越防火墙,那么接下来SSH Server与SSH Client之间的所有SSH数据包的状态都会是ESTABLISHED。
(2)与UDP数据包的关系:假设我们在防火墙主机上用firefox应用程序来浏览网页(通过域名方式),而浏览网页的动作需要DNS服务器的帮助才能完成,因此firefox会送出一个UDP数据包给DNS Server,以请求名称解析服务,如果这个数据包能够成功的穿越防火墙,那么接下来DNS Server与firefox之间的所有数据包的状态都会是ESTABLISHED。
(3)与ICMP数据包的关系:假设我们在防火墙主机ping指令来检测网络上的其他主机时,ping指令所送出的第一个ICMP数据包如果能够成功的穿越防火墙,那么接下来刚才ping的那个主机与防火墙主机之间的所有ICMP数据包的状态都会是ESTABLISHED。
由以上的解释可知,只要第一个数据包能够成功的穿越防火墙,那么之后的所有数据包(包含反向的所有数据包)状态都会是ESTABLISHED。
2、NEW(新的)
首先我们知道,NEW与协议无关,其所指的是每一条连接中的第一个数据包,假如我们使用SSH client连接SSH server时,这条连接中的第一个数据包的状态就是NEW。
3、RELATED(相关的)
RELATED状态的数据包是指被动产生的数据包。而且这个连接是不属于现在任何连接的。RELATED状态的数据包与协议无关,只要回应回来的数据包是因为本机送出一个数据包导致另一个连接的产生,而这一条新连接上的所有数据包都是属于RELATED状态的数据包。
4、INVALID(无效的)
INVALID状态是指状态不明的数据包,也就是不属于以上三种状态的封包。凡是属于INVALID状态的数据包都视为恶意的数据包,因此所有INVALID状态的数据包都应丢弃掉,匹配INVALID状态的数据包的方法如下:
iptables -A INPUT -p all -m state INVALID -j DROP
我们应将INVALID状态的数据包放在第一条。
随机 | 80 web
--------- -》
client | server
《-----------
随机 | 80
client访问server过去
第一个数据包(new状态),如果拒绝,那么后续包都会被拒绝(因为后面来的都会是第一个,都为new状态)
第一个数据包如果允许过去,那么后续包的状态为established
server返回给client,返回的所有包都为established
例1:
有下面两台机
192.168.224.11 192.168.224.10
client server
192.168.224.11是可以ssh访问192.168.224.10,也可以elinks访问192.168.224.10
1,在192.168.224.10上
iptables -P INPUT DROP
iptables -P OUTPUT DROP
这里就把双链都关掉,192.168.224.11任何访问都过不来了
2,
按以前的做法
在192.168.224.10上允许别人ssh进来
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
在192.168.224.10上允许别人elinks进来
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
或者把上面四条合下面两条
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sport 22,80 -j ACCEPT
下面两段等同于,上面所有语句的效果。
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state established -j ACCEPT
(后面一句可以翻译成tcp协议的连接只要你进得来,你就回得去)
(无论他是用哪个随机端口访问进来的;因为只要能进来,那么后续的包都属于ESTABLISHED状态)
====================================================
例2:
有些服务器,可能希望客户端ping不通此服务器,但是此服务器可以ping通客户端(前提是客户端没有防火墙限制)
方法一:修改系统配置
在服务器上把/proc/sys/net/ipv4/icmp_echo_ignore_all的值改为1
临时修改两种方式:
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
or
# sysctl -w net.ipv4.icmp_echo_ignore_all=1
永久修改
# vim /etc/sysctl.conf --加上下面一句
net.ipv4.icmp_echo_ignore_all = 1
# sysctl -p --使用此命令让其生效
方法二:
通过iptables的状态来实现
有下面两台机
192.168.224.11 192.168.224.10
实现192.168.224.10这个IP能ping通所有人.但所有人不能ping通192.168.224.10
--------------》 | ------->
client | server
192.168.224.11 | 192.168.224.10
<------------ | <--------
192.168.224.10 端规则:
NEW ESTABLISHED
INPUT 拒绝 允许
OUTPUT 允许 允许
1,在192.168.224.10上
iptables -P INPUT DROP
iptables -P OUTPUT DROP
这里就把双链都关掉,192.168.224.11任何访问都过不来了
2,在192.168.224.10上
iptables -A INPUT -p icmp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED -j ACCEPT
--重点是INPUT那条不能允许NEW状态的;
--注意第二步的第二条(也就是output这条),如果只写了NEW状态,那么192.168.224.10 ping所有人,都只能通第一个包;加上ESTABLISHED状态,所有包都能通
==== ========================================
systemctl restart iptables
systemctl stop iptables
systemctl disable iptables