1. 基本概念
1.1 防火墙
在计算机中,防火墙是基于预定安全规则来监视和控制传入和传出网络流量的网络安全系统,计算机流入流出的所有网络通信均要经过此防火墙。
防火墙分为硬件防火墙和软件防火墙:
- 硬件防火墙:是一种可以购买的独立产品,通常用于宽带路由器,通常比软件防火墙可以给用户提供更好的安全性,同时价格也更加贵。
- 软件防火墙:也叫作个人防火墙,是最常用的防火墙,常作为计算机系统上的程序运行,可定制,允许用户控制其功能,软件防火墙单独使用软件系统来完成防火墙功能,将软件部署在系统主机上,其安全性较硬件防火墙差,同时占用系统资源,在一定程度上影响系统性能。
1.2 netfilter和iptables概念
Netfilter 是 unix/linux 自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制,比如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(NAT)等。
Netfilter 是 Linux 操作系统内核中的一个数据包处理模块,它所设置的规则是放在内核空间中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 提供的接口来对存放在内核空间中 Netfilter配置表进行修改,跟 iptables 类似的应用程序是 firewalld。
在 Centos7 后,iptables 服务的启动脚本已被忽略,管理 Netfilter 的应用程序替换成了 firewalld服务。尽管替换成了 firewalld ,但是 firewalld 服务底层调用的依旧是 iptables。
1.3 iptables 与 firewalld 的区别
- firewalld 可以动态修改单条规则,动态管理规则集,允许更新规则而不破坏现有会话和连接。而 iptables,在修改了规则后必须得全部刷新才可以生效;
- firewalld 使用区域和服务而不是链式规则;
- firewalld 默认是拒绝的,需要设置以后才能放行。而 iptables 默认是允许的,需要拒绝的才去限制;
- firewalld 自身并不具备防火墙的功能,而是和 iptables 一样需要通过内核的 netfilter 来实现。也就是说,firewalld 和 iptables 一样,它们的作用都用于维护规则,而真正使用规则干活的是内核的 netfilter。只不过 firewalld 和 iptables 的结果以及使用方法不一样。
2. iptables防火墙
iptables 是 linux2.4 及 2.6 内核中集成的服务,主要工作在 0SI 七层的二、三、四层。如果重新编译内核,iptables也可以支持7层控制(squid代理 + iptables)。
2.1 iptables 相关概念
- 容器:容器就是用来装东西的物品,水缸,包包、箱子等,在iptables里用来描述包含的关系,装的是各种各样的规则;
- 表(Table):表示链的容器,所有的链Chart都在对应的表上
- 链(Chains): 链是规则的容器
- 规则(Policy): 表示允许或者拒绝的规则
2.2 iptables 执行流程
如图,iptables具体的工作流程如下:
- 防火墙是层层过滤的,实际是按照配置的规则从上到下,从前到后进行过滤的
- 如果匹配上规则,即明确表明是阻止还是通过,数据包就不再向下匹配新的规则
- 如果规则中没有明确表明是阻止还是通过,也就是没有匹配规则,向下进行匹配,直到匹配规则得到明确的阻止还是通过
- 防火墙默认的规则是所有规则执行完之后才执行,默认是允许
2.3 iptables 链的概念
上面介绍了链是存放规则的容器,当 iptables 开启后,数据包从进入服务器到从服务器出去会经过五条链,分别是 PREROUTING、INPUT、OUTPUT、FORWAED、POSTROUTING,分别表示路由前,输入、输出、转发和路由后。
每条链中都有规则,一个数据包发起后,从这些规则里一个一个从上到下进行匹配,串起来就像是一条链(chain),如图:
- INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则
- OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则
- FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则
- PREROUTING链:在对数据包做出路由选择之前(NAT),应用此链中的规则
- POSTROUTING链:在对数据包做出路由选择之后(SNAT),应用此链中的规则
其中中 INPUT、OUTPUT 链更多的应用在 主机防火墙 中,即主要针对服务器本机进出数据的安全控制;而 FORWARD、PREROUTING、POSTROUTING 链更多的应用在 网络防火墙 中,特别是防火墙服务器作为网关使用时的情况。
2.4 iptables 表的概念
由于每条链上都有规则,而有些规则都很类似,把具有相同功能的规则集合叫做表,iptables 为我们定义了4个表,每个表对应着不用的功能。4个表如下:
filter、nat、mangle、raw。其中,最常用的两个表是 filter表 和 nat表。
上面介绍的5链中,不是都存在于每个表中,每个表都有各自对应的链,表链关系如下:
从上表可以看出,并不是每张表都有所有链,也就是不是每条链的规则都适用于每个表。
上面也说到,数据包进入防火墙后,匹配的规则是有顺序之分的,是一条一条进行匹配的。而表是一些功能相似的规则的集合,那么这个时候,哪个表的规则在链上的执行顺序就需要注意了。参考下图:
从上图可见,无论在哪条链,raw的优先级都是最高的。当4个表在同一条链上时,规则匹配的优先级从高到低依次是:raw>mangle>nat>filter。
小结,iptables的工作流程:
2.5 iptables 规则的概念
iptabls 规则包含 条件 和 动作。根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理。
匹配条件
S_IP
:source ip,根据源IP进行匹配S_PORT
:source port,根据源端口进行匹配D_IP
:destination ip,目标IPD_PROT
:destination port,目标端口TCP/UDP
:匹配TCP或者UDP协议
处理动作
ACCEPT
:允许数据包通过DROP
:丢弃数据包,不回应任何信息给客户端,客户端在改请求超时后才有反应REJECT
:拒绝数据包,会给客户端发送一个数据包被丢弃的响应信息SNAT
:S指Source,源NAT(源地址转换)。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决私网用户用同一个公网IP上网的问题;DNAT
:D指Destination,目的NAT,解决私网服务端,接收公网请求的问题。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址;
3. iptables 实践
Centos7默认没有iptables防火墙,被firewalld替换了。不过可以自己进行安装:
$ yum install -y iptables # 安装iptables
$ yum install -y iptables-services # 安装iptables服务管理
iptables是使用netfilter内核模块来实现防火墙功能,所以需要开启相应的模块:
# 临时加载内核模块
$ modprobe ip_tables && \
modprobe iptable_filter && \
modprobe iptable_nat && \
modprobe ip_conntrack && \
modprobe ip_conntrack_ftp && \
modprobe ip_nat_ftp && \
modprobe ipt_state
# 永久加载
$ cat >> /etc/rc.local <<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF
3.2 iptables命令参数
语法:iptables [-t table] command [链名] [条件匹配] [-j 处理动作]
- -t table:用来指明要操作的表是哪个,不指定时默认为filter表。
- command参数:增删改查规则的操作,针对规则有以下参数:
- -A:追加一条规则,默认放到该链的最后;
- -I:在指定的位置插入规则,不指定位置默认在链的最上面插入。比如
iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT
,在INPU链的第二个位置插入规则 - -L:查看规则列表,常与 **nvx **搭配使用:
- n:只显示 IP 地址和端口号码,不显示域名和服务名称
- v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
- x:在 v 的基础上,禁止自动单位换算(K、M)
- --line-number:可以查看到规则序列号,在结合 -D 删除具体第几条规则时很有用
- -D:从规则列表中删除规则
- -P:设置某条链的默认规则
- -F:清空规则
- -Z:将指定链的所有计数器归零
- 条件匹配参数
- -i:匹配数据进入的网络接口,主要应用于nat表,如:
-i eth0
,匹配从网卡eth0流入的数据包 - -o:匹配数据流出的网络接口,如:
-o eth0
匹配从网卡eth0流出的数据包 - -s:匹配源地址,可以是IP、网段、域名、也可以为空表示任何地址
- -d:匹配目标地址
- -p:匹配协议类型,如TCP、UDP、ICMP等
- --sport:匹配源端口;可以是单个端口,也可以是端口范围,当指定端口时,需要使用-p指定协议,否则会出错
- --dport:匹配目的端口
- -i:匹配数据进入的网络接口,主要应用于nat表,如:
- 处理动作
- -j ACCEPT:允许数据包通过本链而不拦截它
- -j DROP:丢弃数据包;阻止数据包通过改链,并且没有消息返回给客户端
- -j DNAT:目的地址转换,支持转换为单IP,也支持转换到IP地址池
- -j REJECT:拒绝数据包,会给客户端发送一个数据包被丢弃的响应信息
- ......
iptables 还有个 -m
选择,用于指定附加模块。如:
# -m multiport:多端口匹配,如,允许访问本机TCP/22,53,80,443端口
iptables -A INPUT -p tcp -m multiport --dports 22,53,80,443 -j ACCEPT
# -m limit:按速率进行匹配,如
iptables -A FORWARD -d 192.168.1.1 -m limit --limit 50/s -j ACCEPT
# -m mac:按来源mac地址匹配,如
iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
3.3 iptables filter表示例
3.3.1 禁止/允许访问端口或者网段
# 禁止访问本机的22端口
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
# 禁止访问本机的22,80,443端口
iptables -I INPUT -p tcp -m multiport --dport 22,80,443 -j DROP
# 禁止访问本地的1000到2000范围内的端口
iptables -I INPUT -p tcp -m multiport --dport 1000:2000 -j DROP
# 禁止某个IP访问,如禁止192.168.5.30访问本机
iptables -I INPUT -s 192.168.5.30 -j DROP
# 禁止192.168.5.0网段的IP访问本机的8080端口
iptables -I INPUT -s 192.168.5.0/24 -p tcp --dport 8080 -j DROP
3.3.2 禁ping
Linux默认是允许Ping响应的,系统是否允许Ping由2个因素决定的,分别是内核参数和防火墙,需要2个因素同时允许才能允许Ping,2个因素有任意一个禁Ping就无法Ping。
内核参数设置
- 临时允许Ping,
echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all
- 永久允许Ping:
echo "net.ipv4.icmp_echo_ignore_all=0" >> /etc/sysctl.conf && sysctl -p
net.ipv4.icmp_echo_ignore_all
等号后面的参数为0表示允许,为1表示禁止
防火墙设置
防火墙设置的前提是需要内核参数开启允许Ping。通过iptables禁止Ping
iptables -A INPUT -p icmp --icmp-type8 -s 0/0 -j DROP
3.3.3 匹配TCP/IP状态
-m state --state
-
NEW:已经或者将启动新的连接
-
ESTABLISHED:已建立连接
-
RELATED:正在启动新连接
-
INVALID:非法或无法识别的连接
一般都是允许的规则:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
3.3.4 限制并发与速率
iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT
-
-m limit
: 指定使用 limit 模块 -
--limit number/{hour/minute/second}
:指定时间内的请求速率,number为速率,后面单位可选择时分秒 -
--limit-burst number
:在同一时间内允许通过的请求数,不指定默认为5
3.3.5 iptables规则的保存和恢复
# 保存
$ iptables-save > /etc/sysconfig/iptables
# 恢复
$ iptables-restore < /etc/sysconfig/iptables
3.3.6 filter表生产环境常用配置
$ cat iptables-init.sh
# 清空规则
iptables -F
# 删除用户自定义的链
iptables -X
# 链的计数器清零(数据包计数器与数据包字节计数器)
iptables -Z
# 允许访问本地SSH的22默认端口
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
# 允许本机lo网卡的数据流入和流出
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 修改INPUT和FORWARD链的默认规则为拒绝
iptables -P INPUT DROP
iptables -P FORWARD DROP
# 允许访问80和443端口
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
# 允许来源IP是内网IP的访问,网段根据自己需要进行修改
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
# 保存规则,保存的文件可以自定义
iptables-save > /etc/sysconfig/iptables