防火墙是通过制定一些有顺序的规则,用来管理进入到特定网络范围内数据封包的一种机制。
防火墙从实现方法可以分为硬件防火墙
和软件防火墙
。硬件防火墙
是由厂商设计好的硬件设备,能够在硬件层面上实现解包封包,但离不开软件的辅助。而软件防火墙
由纯软件逻辑实现。
本文所论述的防火墙是由内核空间的 netfilter
来读取,并实现让防火墙工作,而放进的地方必须要是特定的位置,必须是tcp/ip协议栈的地方,而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的功能称之为netfilter(网络过滤器)
.iptables是工作在用户空间,用以编写规则的一个工具,所编写的规则最终写入到内核空间中,写入netfilter
传统意义上的iptables由四表,五链来进行报文流的控制。
五链(钩子函数,hook function):
1. PREROUTING 在对数据包作路由选择之前,应用此链中的规则,如DNA
2. INPUT` 当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则
3. FORWARD 当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则
4. OUTPUT 当防火墙本机向发送数据包(出站时),应用此链中规则。
5. POSTROUTING 在对数据包作路由选择之后,应用此链中的规则,如SNAT
四表(功能):
raw 控制链接追踪功能的开启关闭,和nat表相关,开启链接追踪会消耗系统性能。该表包含两条链
PREROUTING
OUTPUT
- iptables 包含4种跟踪链接的状态
1. NEW:该包想要开始一个新连接
2. RELATED:该报是属于某个已经建立连接触发的新连接,例如FTP的数据连接是由信道链接所触发的,所以数据连接就叫做RELATED。
3. ESTABLISHED:只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接后续数据包。
4. INVALID:数据包不能被识别属于哪个连接或者没有任何状态比如内存溢出、收到不知属于哪个连接的ICMP错误信息,一般应该DROP(丢弃)这个状态的任何数据
mangle 对报文进行拆解,修改,并重新封装(不修改ip或端口),该表包含五个链,PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
nat 用于NAT,报文的源地址或者目的地址,需要注意的是,只有第一个包会被匹配,其后的包会做相同的处理。该表包含三个规则链,PREROUTING
OUTPUT
POSTROUTING
filter 用来过滤报文,对报文进行相应的操作,如拒绝通过(REJECT),丢弃(DROP),通过(ACCEPT)等等。该表包含三个规则链:INPUT
OUTPUT
FORWARD
四张表的优先级顺序:raw–mangle–nat–filter
相关的四表五链
之前已经介绍过了,上图就是报文流经防火墙主机的过程中各表和链之间的关系。
简要来说,报文流向经过的链如下几类:
1. 流入:PREROUTING–>INPUT
2. 流出:OUTPUT–>POSTROUTING
3. 转发:PREROUTING–>FORWARD–>POSTROUTING
iptables链的分类:
- 内置链:每个链对应一个钩子函数(hook),即之前所述的五链
- 用户自定义链:对于内置链的扩展和补充,实现更灵活的规则管理,必须由内置链调用才会生效。(后续会详细说明)
添加iptables时需要考量的因素:
- 实现什么样的功能:用于判定将规则添加至哪个表;
- 报文的流经位置:用于判断将规则添加至哪个链;
- 报文的流向:判定规则中何为”源“,何为”目标“;
- 匹配条件:用于编写正确的匹配规则;
1. 专用于某种应用的同类规则,匹配范围小的放前面
2. 专用于某些应用的不同类规则,匹配到的可能性较多的放前面;同一类别的规则可使用自定义链单独存放;
3. 用于通用目的的规则放前面;
iptables规则的匹配法则:规则自上而下依次匹配,如果匹配到了相关规则,则应用之并不检查后续规则,当所有规则都未匹配到,则应用默认策略。
NAT的全名是Network Address Translation(网络地址转换)。在论述NAT的种类前,先简单的说,假如局域网内部有任何一台主机想要向外部发送报文,那么该如通过iptables主机传送呢?
1. 先经过 NAT table的PREROUTING链;
2. 经过路由判定它是否要进入iptables本机,若不进入本机,则下一步;
3. 再通过filter
tables的FORWARD链
4. 再通过NAT table 的 POSTROUTING链,最后离开iptables本机传送出去。
NAT服务的重点就在上述的1、4步骤, 也就是NAT table的两条重要的链 PREROUTING,POSTROUTING。PREROUTING重点在于修改目的IP(Destination NAT,DNAT),POSTROUTING重点在于修改源IP(Source NAT,SNAT)。
DNAT:目的地址转换,可用于保护局域网内部对外提供服务的服务器。
如上图所示。外部网络有一台主机想要访问内部www服务器(假设:10网段为公网ip,172为内部私有ip。太懒了,各位看官注意下^_^),他的ip报文的源地址和目标地址有何变化:
1. 客户端访问www.服务,发出的报文,源地址为10.1.14.2,目标地址为10.1.14.1
2. iptables 收到请求,一看,是访问的80端口,就把目标地址替换为172.18.14.2,通过172.18.14.1网卡发送出去。
3. 内部www服务器收到请求,响应结果,回传给iptables主机。
4. iptables主机收到回传的数据,根据步骤2记录下来的信息,再将报文源ip由172.18.14.2改为公网ip10.1.14.1回传给外部用户。
上述步骤,外部主机请求www资源就是一个DNAT,而www服务器返回资源的过程就是SNAT(这里的SNAT是由于iptables记录了相关信息 而自动做出的动作)
SNAT:为了内部主机访问外部网络而做的一种安全措施。
SNAT的大概流程:
1. 内部主机发起web资源请求 源ip 172.18.14.2 目标ip 10.1.14.2
2. iptables收到请求,记录地址信息,将源ip改为10.1.14.1 目标ip不变
3. web服务器返回资源,源ip 10.1.14.2,目标ip 10.1.14.1
4. iptables主机根据2保存的地址信息,将 资源反馈给内部用户,此时,源地址不变,10.1.14.2,目标ip转为172.18.14.2
man iptables,man iptables-extensions
# man iptables-extensions
查阅iptables帮助
命令通用格式
iptables [-t tables] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
选项详解
链管理
-N :new 自定义一条新的规则链
-X : delete删除自定义的规则链
规则管理
规则显示
匹配条件
扩展匹配
显示扩展,必须使用-m指明要调用的扩展模块的扩展机制
multiport:以离散或连续的 方式定义多端口匹配条件,最多15个;
# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT`
iprange以连续地址块的方式来指明多IP地址匹配条件;
# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j REJECT
time,以时间范围来控制匹配
#iptables -A INPUT -s 172.16.0.0/16 -d 172.168.100.67 -p tcp --dport 80 -m time -
-timestart 14:30 --time-stop 18:30 --weekdays sat,sun -j DROP
每周的星期几可以使用数据表示方法: 1,2,3,4,5,6,7 可以使用离散取值方法
string ,以字符串 控制匹配条件
–algo {bm|kmp}:字符串匹配检测算法
# iptables -A OUTPUT -s 172.18 -p tcp --sport 80 -m string --algo bm --
string "gay" -j REJECT
connlimit :限制链接数量
# iptables -I INPUT -d 172.18.14.66 -p tcp -m comp --tcp-flags SYN,ACK,FIN,RST SYN --dport 22 -m connlimit --connlimit-above 2 -j REJECT
state :根据链接状态来进行控制
根据连接追踪机制,查检连接的状态, 跟TCP没有关系,是内核中netfilter实现, 能实现tcp,udp,icmp的连接追踪,内核会记录每一个连接(放置在内存中),谁,通过什么协议, 访问什么服务, 访问的时间,这种机制被称之为conntrack机制.也正是有了state扩展,iptables成为了有连接追踪的防火墙,安全性是更高. 是由state扩展提供,库文件为ibxt_conntrack.so. 追踪连接功能在内核的内存空间中,把出去和进来的连接通过模板建立关联关系. 追踪本机的请求和响应之间的关系,状态如下几种:
#iptables -A INPUT -d 172.18.14.168 -p tcp -m multiport --dport 22,80 -m state --
state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -s 172.18.14.168 -p tcp -m multiport --sport 22,80 -m state --
state ESTABLISHED -j ACCEPT
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP
启动被动模式的ftp服务
#iptables -A INPUT -d 172.18.14.168 -m state --state ESTABLISHED -j ACCEPT
#iptables -A INPUT -d 172.18.14.168 -p tcp -m multiport 22,21,80 -m state --state NEW -j ACCEPT
# iptables -A INPUT -d 172.18.14.168 -p tcp -m state --state RELATED -j ACCEPT
#iptables -A OUTPUT -s 172.18.14.168 -m state --state ESTABLISHED -j ACCEPT
target的分类
LOG 记录日志
iptables -A INPUT -d 172.18.14.168 -p tcp --dport 21 -j LOG --log-prefix "badmanlog"
MASQUERADE:地址伪装
#iptables -t nat -A POSTROUTING -s 172.18.14.66 -o eth1 -j MASQUERADE
[root@bnpanda ~]#iptables -t filter -A INPUT -s 172.18.0.0/16 -d 172.18.14.168 -p tcp -m tcp --dport 22 -j ACCEPT
-t 指定表
-A 指定规则链
-s 源地址
-d 目标地址
-p 指定协议
--dport 指定端口
[root@bnpanda ~]#iptables -t filter -L
查看指定表的规则清单
[root@bnpanda ~]#iptables -t filter -L -n
以数字形式查看指定表的规则清单
[root@bnpanda ~]#iptables -t filter -p INPUT DROP
设定 filter表的默认规则:丢弃所有对本机的访问。T
[root@bnpanda ~]#iptables -t filter -P OUTPUT DROP
所有从本机发出的连接,访问都丢弃
[root@bnpanda ~]#iptables -t filter -P FORWARD DROP
设定filter表中默认规则,丢弃所有转发包
[root@bnpanda ~]#iptables -t filter -P INPUT ACCEPT
设定默认规则:访问本机的链接都被允许
[root@bnpanda ~]#iptables -t filter -P OUTPUT ACCEPT
设定默认规则,从本机发出的链接都被允许
[root@bnpanda ~]#iptables -D OUTPUT 1
删除OUTPUT链上第一条规则
[root@bnpanda ~]#iptables -L -n --line-number
显示规则的序号
[root@bnpanda ~]#iptables -N samba_input_rules
-N :自定义规则链
[root@bnpanda ~]#iptables -A samba_input_rules -d 172.18.14.168 -p udp --dport 137:138 -j ACCEPT
在自定义规则链里添加规则,目前无效,必须被默认链调用
[root@bnpanda ~]#iptables -I INPUT 2 -d 172.18.14.168 -j samba_input_rules
***-j samba_input_rules调用自定义规则链
[root@bnpanda ~]#iptables -X samba_input_rules
iptables: Too many links.
-X 删除自定义规则链
删除自定义规则链必须要引用计数为0才可以,匹配到的包总数和匹配到的包大小都为0才行
可以先用-F清楚指定的链的设定清单,再删除
系统默认规则链不能删除
[root@bnpanda ~]#iptables -F samba_input_rules、
清空指定规则链的规则清单
限制本地主机的web服务器在周三不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP
#iptables -A INPUT -d 172.18.14.168 -p tcp --dport 80 -m time --weekdays 1,2,4,5,6,7 -m limit --limit 100/second -j ACCEPT
#iptables -A OUTPUT -s 172.18.14.168 -p tcp --sport 80 -m string --algo bm --string "admin" -j DROP
#iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
开放本机的ssh服务给172.18.14.1-172.18.14.100中的主机,到本机的连接数不得超过2个;仅允许响应报文通过其服务端口离开本机;
#iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP
#iptables -A INPUT -d 172.18.14.168 -p tcp --dport 22 -m iprange --src-range 172.18.14.20-172.18.14.100 -m connlimit --connlimit-upto 3 -j accept
#iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
拒绝TCP标志位全部为1及全部为0的报文访问本机;
[root@bnpanda ~]#iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
[root@bnpanda ~]#iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DRO
允许本机ping别的主机;但不开放别的主机ping本机;
[root@bnpanda ~]#iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
[root@bnpanda ~]#iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
(注意,此题建立在前两题操作的基础上)