IPTABLES入门
防火墙是什么?
防火墙是通过制定一些有顺序的规则,用来管理进入到特定网络范围内数据封包的一种机制。
防火墙从实现方法可以分为硬件防火墙
和软件防火墙
。硬件防火墙
是由厂商设计好的硬件设备,能够在硬件层面上实现解包封包,但离不开软件的辅助。而软件防火墙
由纯软件逻辑实现。
本文所论述的防火墙是由内核空间的 netfilter
来读取,并实现让防火墙工作,而放进的地方必须要是特定的位置,必须是tcp/ip协议栈的地方,而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的功能称之为netfilter(网络过滤器)
.iptables是工作在用户空间,用以编写规则的一个工具,所编写的规则最终写入到内核空间中,写入netfilter
iptables的工作机制和简要概念
传统意义上的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
iptables命令概述
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 自定义一条新的规则链
- # iptables -N in_icmp
-X : delete删除自定义的规则链
- # iptables -X in_icmp
- -P :设置默认策略,指明是黑名单还是白名单.对于filter表而言,默认策略有: ACCEPT:(接受),DROP(丢弃),REJECT(拒绝)
- ~]# iptables -P FORWARD ACCEPT
- ~]# iptables -P FORWARD DROP
- -E :重命名自定义链,引用计数不为0的自定义链接,不能被删除和重命名
- -F:flush,清空指定的规则链
- 指明链,即清空指定链上的规则
- 不指明链,即清空所有链上的规则
- -Z zero,置零计数器
- packets:匹配到的报文个数
- bytes:被本规则所匹配到的所有报文大小之和
规则管理
- -A :append,追加新规则
- -I:insert,插入规则,需要指明位置,省略时表示第一条
- -D:delete,删除规则,指明替换号,指明替换规则本身
- -R, –replace chain rulenum rule-specification:替换指定的规则为新的规则;
- -D, –delete chain rulenum:根据规则编号删除规则;
- -D, –delete chain rule-specification:根据规则本身删除规则;
规则显示
- -L
- -v , –verbose:详细信息;
- -vv,更详细的信息
- -n, –numeric:数字格式显示主机地址和端口号;
- -x, –exact:显示计数器的精确值,而非圆整后的数据
- –line-numbers:列出规则时,显示其在链上的相应的编号;
- -S, –list-rules [chain]:显示指定链的所有规则;
- -L
-
匹配条件
- 通用匹配
- [!] -s, –source address[/mask][,…]:检查报文的源IP地址是否符合此处指定的范围,或是否等于此处给定的地址;
- [!] -d, –destination address[/mask][,…]:检查报文的目标IP地址是否符合此处指定的范围,或是否等于此处给定的地址;
- [!] -p, –protocol protocol:匹配报文中的协议,可用值tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh 或者 “all”, 亦可以数字格式指明协议;
- -m, –match match:调用指定的扩展匹配模块来扩展匹配条件检查机制;
- [!] -i, –in-interface name:限定报文仅能够从指定的接口流入
- [!] -o, –out-interface name:限定报文仅能够从指定的接口流出
扩展匹配
- 隐式扩展
- 不需要手动加载扩展模块,因为它们是对协议的扩展,所以但凡使用-p 指明了协议,就表示已经指明了要扩展的模块
- p tcp
- [!]–source-port, –sport port[:port]
- 匹配报文的源端口,可以是端口范围
- [!]–destination-port, –dport port[:port
- 匹配报文的目标端口,可以是端口范围
- [!]–tcp-flags mask comp
- 匹配报文中的tcp协议的标志位;Flags are: SYN ACK FIN RST URG PSH ALL NONE;
- mask:要检查的FLAGS list,以逗号分隔;
- comp:在mask给定的诸多的FLAGS中,其值必须为1的FLAGS列表,余下的其值必须为0;
- –tcp-flags SYN,ACK,FIN,RST SYN
- –tcp-flags ALL ALL
- –tcp-flags ALL NONE
- [!]–source-port, –sport port[:port]
- -p udp:可直接使用udp协议扩展模块的专用选项
- [!] –source-port,–sport port[:port]
- [!] –destination-port,–dport port[:port]
- p icmp
- –icmp-type {type[/code]|typename}
- 0/0: echo reply (请求)
- 8/0:echo request (响应)
- –icmp-type {type[/code]|typename}
显示扩展,必须使用-m指明要调用的扩展模块的扩展机制
multiport:以离散或连续的 方式定义多端口匹配条件,最多15个;
- [!] –source-ports,–sports port[,port|,port:port]…:指定多个源端口;
- [!] –destination-ports,–dports port[,port|,port:port]…:指定多个目标端口;
# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT`
iprange以连续地址块的方式来指明多IP地址匹配条件;
- –src-range from[-to] :指明源ip地址范围
- –dst-range from[-to]:指明目的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,以时间范围来控制匹配
- –timestart hh:mm[:ss] :时间其实范围
- –timestop hh:mm[:ss] :时间结束范围
- –weekdays day[,day…]:一周的某几天,星期一…星期二…
- –monthdays day[,day…]: 每个月的几号
- –datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:完整日期起始点
- –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:完整日期终结点
- –kerneltz:使用内核配置的时区而非默认的UTC;
#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}:字符串匹配检测算法
- –string pattern
- –hex-string pattern:十六进制字符串
# iptables -A OUTPUT -s 172.18 -p tcp --sport 80 -m string --algo bm -- string "gay" -j REJECT
connlimit :限制链接数量
- –connlimit-upto n:小于等于n个链接
- –connlimit-above n:大于等于n个链接
# 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
- limit 限制链接速度
- –limit rate[/second|/minute|/hour|/day]: 多少个连接数[每秒/每分钟……]
- –limit-burst number:最大连接池数。
state :根据链接状态来进行控制
根据连接追踪机制,查检连接的状态, 跟TCP没有关系,是内核中netfilter实现, 能实现tcp,udp,icmp的连接追踪,内核会记录每一个连接(放置在内存中),谁,通过什么协议, 访问什么服务, 访问的时间,这种机制被称之为conntrack机制.也正是有了state扩展,iptables成为了有连接追踪的防火墙,安全性是更高. 是由state扩展提供,库文件为ibxt_conntrack.so. 追踪连接功能在内核的内存空间中,把出去和进来的连接通过模板建立关联关系. 追踪本机的请求和响应之间的关系,状态如下几种:
- NEW:新发起的请求
- ESTABLISHED:new状态之后,链接追踪模版中为其建立的条目失效之前期间所有的通信状态
- 相关的连接,如FTP协议中命令连接触发数据连接
- INVALID ,无效的连接,如tcp状态全1或全0的连接
- UNTRACKED:未进行追踪的连接
- 调整追踪连接功能所容纳的最大连接数量:
- /proc/sys/net/nf_conntrack_max
- 已经追踪到的并记录下来的连接
- /proc/net/nf_conntrack
- 不同协议的连接追踪状态时长
- /proc/sys/net/netfilter/*
- [!] –state STATE : 多个state可以使用,号分隔
#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服务
- 手动加载nf_conntrack_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的分类
- ACCEPT 接受
- DROP 丢弃
- REJECT 拒绝
- 拒绝和丢弃的区别:拒绝反馈快,可能返回一些信息,和丢弃什么都不反馈,返回信息较慢。
- RETURN 返回调用链
- REDIRECT 端口重定向
LOG 记录日志
- –log-level LEVEL 日志等级
- –log-prefix FREFIX 日志提示信息
iptables -A INPUT -d 172.18.14.168 -p tcp --dport 21 -j LOG --log-prefix "badmanlog"
- DNAT 目标地址转换
- SNAT 源地址转换
MASQUERADE:地址伪装
#iptables -t nat -A POSTROUTING -s 172.18.14.66 -o eth1 -j MASQUERADE
- MASQUERADE 的意思如上所示,内部主机地址172.16.14.66 的报文流,只要可以从iptables主机网卡eth1出去,就自动把源地址替换为eth1网卡的ip地址。
实操小例子
[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
(注意,此题建立在前两题操作的基础上)