防火墙和iptables
防火墙
在计算中,防火墙是基于预定安全规则来监视和控制传入和传出网络流量的网络安全系统。该计算机流入流出的所有网络通信均要经过此防火墙。
其实说白了讲,防火墙就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。
防火墙分为软件防火墙和硬件防火墙,他们的优缺点:
硬件防火墙 :拥有经过特别设计的硬件及芯片,性能高、成本高(当然硬件防火墙也是有软件的,只不过有部分功能由硬件实现,所以硬件防火墙其实是硬件+软件的方式);软件防火墙 :应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能比硬件防火墙低、成本低。
iptables
iptables是实现软件防火墙功能的工具。
iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
iptables原理 Netfilter Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
网络地址转换(Network Address Translate)
数据包内容修改
以及数据包过滤的防火墙功能
Netfilter平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTING
、INPUT
、OUTPUT
、FORWARD
、POST_ROUTING
。
Netfilter所设置的规则是存放在内核空间中的,而iptables是一个应用层的应用程序,它通过Netfilter放出的接口来对存放在内核空间中的 XXtables(Netfilter的配置表)进行修改 。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件,类似的应用程序还有firewalld(CentOS7默认防火墙)。
所以Linux中真正的防火墙是Netfilter,但由于都是通过应用层程序如iptables或firewalld进行操作,所以我们一般把iptables或firewalld叫做Linux的防火墙。
注意 :以上说的iptables都是针对IPv4的,如果IPv6,则要用ip6tables
,至于用法应该是跟iptables
是一样的。
链的概念 iptables开启后,数据报文从进入服务器到出来会经过5道关卡,分别为Prerouting(路由前)、Input(输入)、Outpu(输出)、Forward(转发)、Postrouting(路由后):
每一道关卡中有多个规则,数据报文必须按顺序一个一个匹配这些规则,这些规则串起来就像一条链,所以我们把这些关卡都叫“链” :
INPUT链 :当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则;
OUTPUT链 :当防火墙本机向外发送数据包(出站)时,应用此链中的规则;
FORWARD链 :当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则;
PREROUTING链 :在对数据包作路由选择之前,应用此链中的规则,如DNAT;
POSTROUTING链 :在对数据包作路由选择之后,应用此链中的规则,如SNAT。
其中中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。
表的概念 虽然每一条链上有多条规则,但有些规则的作用(功能)很相似,多条具有相同功能的规则合在一起就组成了一个“表”,iptables提供了四种“表”:
filter表 :主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG),所谓的防火墙其实基本上是指这张表上的过滤规则,对应内核模块iptables_filter;
nat表 :network address translation,网络地址转换功能,主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次,如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。对应内核模块iptables_nat;
mangle表 :拆解报文,做出修改,并重新封装,主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。对应内核模块iptables_mangle;
raw表 :是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,在匹配数据包时,raw表的规则要优先于其他表,对应内核模块iptables_raw。 我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中。
表链关系 5条链(即5个关卡)中,并不是每条链都能应用所有类型的表,事实上除了Ouptput链能同时有四种表,其他链都只有两种或三种表: 实际上由上图我们可以看出,无论在哪条链上,raw表永远在mangle表上边,而mangle表永远在nat表上边,nat表又永远在filter表上边,这表明各表之间是有匹配顺序的。
前面说过,数据报文必须按顺序匹配每条链上的一个一个的规则,但其实同一类(即属于同一种表)的规则是放在一起的,不同类的规则不会交叉着放,按上边的规律,每条链上各个表被匹配的顺序为:raw→mangle→nat→filter 。
前面说过,我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中,所以我们实际操作是对“表”进行操作的,所以我们反过来说一下,每种表都能用于哪些链:
表名
能应用的链
raw
prerouting
output
mangle
prerouting
input
forward
output
postrouting
nat
prerouting
input(仅centos7)
output
postrouting
filter
input
forward
output
综上,数据包通过防火墙的流程可总结为下图:
规则的概念 iptables规则主要包含“条件&动作”,即匹配出符合什么条件(规则)后,对它采取怎样的动作。
匹配条件
S_IP :source ip,源ip
S_PORT :source port,源端口
D_IP: destination ip,目标ip
D_PORT: destination port,目标端口
TCP/UDP :第四层(传输层)协议
处理的动作
ACCEPT :允许数据包通过;
DROP :直接丢弃数据包,不回应任何信息,客户端只有当该链接超时后才会有反应;
REJECT :拒绝数据包,会给客户端发送一个数据包被丢弃的响应的信息;
SNAT :S指Source,源NAT(源地址转换)。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决私网用户用同一个公网IP上网的问题;
MASQUERADE :是SNAT的一种特殊形式,由iptables和系统来决定要把源ip转换成什么ip,适用于动态的、临时会变的IP上;
DNAT :D指Destination,目的NAT,解决私网服务端,接收公网请求的问题。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址;
REDIRECT :在本机做端口映射;
LOG :在/var/log/messages
文件中记录日志信息,然后将数据包传递给下一条规则。 除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。
其中REJECT和DROP有点类似,REJECT动作会对客户端的请求显示Unreachable,而DROP动作则是显示超时无应答。
iptables规则 另一篇单独讲解,见
实战部署:主机防火墙案例 安装iptables CentOS 6及其之前的CentOS系统都默认使用iptables防火墙,但CentOS 7默认已经没有iptables防火墙了,取而代之的是firewalld,不过还是可以自己安装iptables。
1 2 3 systemctl stop firewalld systemctl disable firewalld sudo yum -y install iptables iptables-services
设置规则 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 iptables -F iptables -X iptables -Z iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT iptables -A INPUT -s 203.81.18.0/24 --dport 22 -j ACCEPT iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT iptables -A INPUT -p icmp -s 10.0.0.0/24 -m icmp --icmp-type any -j ACCEPT iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -nL nmap IP地址 -p 1-10000
保存规则 1 iptables-save >/etc/sysconfig/iptables
维护规则
永久生效
1 2 3 4 5 6 vim /etc/sysconfig/iptables -A INPUT -p tcp -m tcp --dport 3306 -j DROP systemctl reload iptables
临时生效
1 2 iptables -I INPUT -s 203.71.78.10 -j DROP
把防火墙规则写成脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #!/bin/bash IPT=/sbin/iptables $IPT -F$IPT -X$IPT -Z$IPT --policy OUTPUT ACCEPT$IPT --policy FORWARD DROP$IPT -P INPUT DROP$IPT -A INPUT -i lo -j ACCEPT$IPT -A INPUT -s 202.81.17.0/24 -p all -j ACCEPT$IPT -A INPUT -s 202.81.18.0/24 -p all -j ACCEPT$IPT -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT$IPT -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT$IPT -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT$IPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
实战部署:局域网共享上网案例
开启内核转发功能
1 2 echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf sysctl -p
链的默认配置为黑名单模式
1 2 3 4 5 6 iptables -P FORWARD ACCEPT iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P PREROUTING ACCEPT
两种设置模式
1 2 3 4 5 6 7 8 9 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.8 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
实战部署:端口映射案例和IP映射案例 1 2 3 4 5 6 7 8 sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 内部服务器IP:8080sudo iptables -t nat -A POSTROUTING -d 内部服务器IP -p tcp --dport 8080 -j SNAT --to-source 外部公网IPsudo iptables -t nat -A PREROUTING -d 外部公网IP -j DNAT --to-destination 内部服务器IPsudo iptables -t nat -A POSTROUTING -s 内部服务器IP -j SNAT --to-source 外部公网IP