2019独角兽企业重金招聘Python工程师标准>>>
1、Netfilter/iptables框架简介
Netfilter/iptables可以对流入和流出的信息进行细化控制,且可以在一台低配置机器上很好地运行,被认为是Linux中实现包过滤功能的第四代应用程序。Netfilter/iptables包含在Linux 2.4以后的内核中,可以实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。
netfilter工作在内核内部,而iptables则是让用户定义规则集的表结构。Netfilter/iptables从ipchains和ipwadfm(IP防火墙管理)演化而来,功能更加强大。
这里所说的iptables是ipchains的后继工具,但具有更强的可扩展性。内核模块可以注册一个新的规则表(table),并要求数据包流经指定的规则表。这种数据包选择用于实现数据报过滤(filter表),网络地址转换(NAT表)及数据报处理(mangle表)。Linux 2.4内核及其以上版本提供的这三种数据报处理功能都基于netfilter的钩子函数和IP表,都是相互间独立的模块,完美地集成到了由netfilter提供的框架中,如图1所示。netfilter主要提供了如下三项功能:
- 包过滤:filter表格不会对数据报进行修改,而只对数据报进行过滤。iptables优于ipchains的一个方面就是它更为小巧和快速。它是通过钩子函数NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架的。
- NAT:NAT表格监听三个netfilter钩子函数:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。NF_IP_PRE_ROUTING实现对需要转发数据报的源地址进行地址转换,而NF_IP_POST_ROUTING则对需要转发的数据报目的地址进行地址转换。对于本地数据报目的地址的转换,则由NF_IP_LOCAL_OUT来实现。
- 数据报处理:mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT钩子中进行注册。使用mangle表,可以实现对数据报的修改或给数据报附上一些外带数据。当前mangle表支持修改TOS位及设置skb的nfmard字段。
图1 Netfilter/Iptables框架结构示意图
根据实际情况,灵活运用Netfilter/iptables框架,生成相应的防火墙规则可以方便、高效地阻断部分网络攻击以及非法数据报(参见图2所示的工作原理)。然而,由于配置了防火墙,可能引起诸如FTP、QQ、MSN等协议和软件无法使用或者某些功能无法正常使用,也有可能引起RPC(远程过程调用)无法执行,这需要用户根据实际情况来配置相应的服务代理程序来开启这些服务。
需要特别提醒注意的是,防火墙也可能被内部攻击,其并不是万能的,还需要综合使用其他防护手段。内部人员由于无法通过Telnet浏览邮件或使用FTP向外发送信息,个别人会对防火墙不满进而可能对其进行攻击和破坏。而且,攻击的目标常常是防火墙或防火墙运行的操作系统,这极大地危害了防火墙系统甚至是关键信息系统的安全。
图2 Netfilter/Iptables框架工作原理示意
2、iptables基本原理
通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用Netfilter/iptables系统提供的特殊命令iptables,建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加/除去/编辑规则的命令的一般语法如下:
iptables [-t table] command [match] [target]
不难看出,一条iptables规则包含如下4个基本元素:
- 表
- 命令
- 匹配
- 目标
1) 表(table)
[-t table]选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。
有三种可用的表选项:filter、nat和mangle。该选项不是必需的,如果未指定,则filter用作默认表。
filter表用于一般的信息包过滤,包含INPUT、OUTPUT和FORWAR链。
nat表用于要转发的信息包,它包含PREROUTING、OUTPUT和POSTROUTING链。
如果信息包及其头内进行了任何更改,则使用mangle表。该表包含一些规则来标记用于高级路由的信息包以及PREROUTING和OUTPUT链。
. [-t table] 指定规则表;内建的规则表有三个,分别是:nat、mangle 和filter,当未指定规则表时,则一律视为是filter。三个规则表的功能如下:nat: 此规则表拥有PREROUTING 和POSTROUTING 两个规则链,主要功能为进行一对一、一对多、多对多等网址转换工作(SNAT、DNAT),这个规则表除了作网址转换外,请不要做其它用途。mangle:此规则表拥有PREROUTING、FORWARD 和POSTROUTING 三个规则链。除了进行网址转换工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在mangle 规则表中;由于使用率不高,我们不打算在这里讨论mangle 的用法。filter: 这个规则表是默认规则表,拥有INPUT、FORWARD 和OUTPUT 三个规则链,这个规则表顾名思义是用来进行封包过滤的处理动作(例如:DROP、LOG、ACCEPT 或REJECT),我们会将基本规则都建立在此规则表中。
2) 命令(command)
command部分是iptables命令的最重要部分,它告诉iptables命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。常用命令如下:
命令: -A, --append
范例: iptables -A INPUT ...
说明: 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。命令: -D, --delete
范例: iptables -D INPUT --dport 80 -j DROPiptables -D INPUT 1
说明: 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。命令: -R, --replace
范例: iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明: 取代现行规则,规则被取代后并不会改变顺序。命令: -I, --insert
范例: iptables -I INPUT 1 --dport 80 -j ACCEPT
说明: 插入一条规则,原本该位置上的规则将会往后移动一个顺位。命令: -L, --list
范例1: iptables -L INPUT
说明: 列出某规则链中的所有规则。
范例2: iptables -t nat -L
说明: 列出nat 表所有链中的所有规则。命令: -F, --flush
范例: iptables -F INPUT
说明: 删除filter 表中INPUT 链的所有规则。命令: -Z, --zero
范例: iptables -Z INPUT
说明: 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。命令: -N, --new-chain
范例: iptables -N allowed
说明: 定义新的规则链。命令: -X, --delete-chain
范例: iptables -X allowed
说明: 删除某个规则链。命令: -P, --policy
范例: iptables -P INPUT DROP
说明: 定义过滤政策。也就是未符合过滤条件之封包, 默认的处理方式。命令: -E, --rename-chain
范例: iptables -E allowed disallowed
说明: 修改某自定义规则链的名称。
3) 匹配(match)
iptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类:通用匹配和特定于协议的匹配。这里,将研究可用于采用任何协议的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其说明:
参数: -p, --protocol
范例: iptables -A INPUT -p tcp
说明: 匹配通讯协议类型是否相符,可以使用! 运算符进行反向匹配,例如:-p !tcp意思是指除tcp 以外的其它类型,如udp、icmp ...等。如果要匹配所有类型,则可以使用all 关键词,例如:-p all参数: -s, --src, --source
范例: iptables -A INPUT -s 192.168.1.1
说明: 用来匹配封包的来源IP,可以匹配单机或网络,匹配网络时请用数字来表示子网掩码,
例如:-s 192.168.0.0/24匹配IP 时可以使用! 运算符进行反向匹配,例如:-s! 192.168.0.0/24。参数: -d, --dst, --destination
范例: iptables -A INPUT -d 192.168.1.1
说明: 用来匹配封包的目的地IP,设定方式同上。参数: -i, --in-interface
范例: iptables -A INPUT -i eth0
说明: 用来匹配封包是从哪块网卡进入,可以使用通配字符+ 来做大范围匹配,例如:-i eth+表示所有的ethernet 网卡也可以使用! 运算符进行反向匹配,例如:-i !eth0参数: -o, --out-interface
范例: iptables -A FORWARD -o eth0
说明: 用来匹配封包要从哪块网卡送出,设定方式同上。参数: --sport, --source-port
范例: iptables -A INPUT -p tcp --sport 22
说明: 用来匹配封包的源端口,可以匹配单一端口,或是一个范围,例如:--sport 22:80表示从22 到80 端口之间都算是符合条件,如果要匹配不连续的多个端口,则必须使用--multiport 参数,详见后文。匹配端口号时,可以使用! 运算符进行反向匹配。参数: --dport, --destination-port
范例: iptables -A INPUT -p tcp --dport 22
说明: 用来匹配封包的目的地端口号,设定方式同上参数: --tcp-flags
范例: iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
说明: 匹配TCP 封包的状态标志;参数分为两个部分,第一个部分列举出想匹配的标志,第二部分则列举前述标志中哪些有被设置,未被列举的标志必须是空的。TCP 状态标志包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急) 、PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词ALL 和NONE 进行匹配。匹配标志时,可以使用! 运算符行反向匹配。参数: --syn
范例: iptables -p tcp --syn
说明: 用来表示TCP 通信协议中,SYN 位被打开,而ACK 与FIN 位关闭的分组,即TCP 的初始连接,与iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用!运算符,可用来匹配非要求连接封包。参数: -m multiport --source-port
范例: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
说明: 用来匹配不连续的多个源端口,一次最多可以匹配15 个端口,可以使用! 运算符进行反向匹配。参数: -m multiport --destination-port
范例: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
说明: 用来匹配不连续的多个目的地端口号,设定方式同上参数: -m multiport --port
范例: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
说明: 这个参数比较特殊,用来匹配源端口和目的端口号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为80目的地端口号为110,这种封包并不算符合条件。参数: --icmp-type
范例: iptables -A INPUT -p icmp --icmp-type 8
说明: 用来匹配ICMP 的类型编号,可以使用代码或数字编号来进行匹配。请打iptables -p icmp--help 来查看有哪些代码可用。参数: -m limit --limit
范例: iptables -A INPUT -m limit --limit 3/hour
说明: 用来匹配某段时间内封包的平均流量,上面的例子是用来匹配:每小时平均流量是否超过一次3 个封包。除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后:/second、/minute、/day除了进行封包数量的匹配外,设定这个参数也会在条件达成时,暂停封包的匹配动作,以避免因骇客使用洪水攻击法,导致服务被阻断。参数: --limit-burst
范例: iptables -A INPUT -m limit --limit-burst 5
说明: 用来匹配瞬间大量封包的数量,上面的例子是用来匹配一次同时涌入的封包是否超过5个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上。参数: -m mac --mac-source
范例: iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
说明: 用来匹配封包来源网络接口的硬件地址,这个参数不能用在OUTPUT 和POSTROUTING 规则链上,这是因为封包要送到网卡后,才能由网卡驱动程序透过ARP 通讯协议查出目的地的MAC 地址,所以iptables 在进行封包匹配时,并不知道封包会送到哪个网络接口去。参数: --mark
范例: iptables -t mangle -A INPUT -m mark --mark 1
说明: 用来匹配封包是否被表示某个号码,当封包被匹配成功时,我们可以透过MARK 处理动作,将该封包标示一个号码,号码最大不可以超过4294967296。参数: -m owner --uid-owner
范例: iptables -A OUTPUT -m owner --uid-owner 500
说明: 用来匹配来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用root或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法匹配出来自其它主机的封包。参数: -m owner --gid-owner
范例: iptables -A OUTPUT -m owner --gid-owner 0
说明: 用来匹配来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。参数: -m owner --pid-owner
范例: iptables -A OUTPUT -m owner --pid-owner 78
说明: 用来匹配来自本机的封包,是否为某特定进程所产生的,使用时机同上。参数: -m owner --sid-owner
范例: iptables -A OUTPUT -m owner --sid-owner 100
说明: 用来匹配来自本机的封包,是否为某特定连接(Session ID)的响应封包,使用时机同上。参数: -m state --state
范例: iptables -A INPUT -m state --state RELATED,ESTABLISHED
说明: 用来匹配连接状态, 连接状态共有四种:INVALID、ESTABLISHED、NEW 和RELATED。INVALID 表示该封包的连接编号(Session ID)无法辨识或编号不正确。ESTABLISHED 表示该封包属于某个已经建立的连接。NEW 表示该封包想要起始一个连接(重设连接或将连接重导向)。RELATED 表示该封包是属于某个已经建立的连接,所建立的新连接。例如:FTP-DATA 连接必定是源自某个FTP 连接。
4) 目标(target)
前面已经讲过,目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。下面是常用的一些目标及其示例和说明:
-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:
动作: ACCEPT
说明: 将封包放行,进行完此处理动作后,将不再匹配其它规则,直接跳往下一个规则链(natostrouting)。动作: REJECT
说明: 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个封包会要求对方关闭连接),进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。
范例: iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset动作: DROP
说明: 丢弃封包不予处理,进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。动作: REDIRECT
说明: 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹配其它规则。这个功能可以用来实现透明代理或用来保护web 服务器。
范例: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080动作: MASQUERADE
说明: 改写封包来源IP 为防火墙NIC IP,可以指定port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(manglepostrouting)。这个功能与SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个IP,IP 会从网卡直接读取,当使用拨号接连时,IP通常是由ISP 公司的DHCP 服务器指派的,这个时候MASQUERADE 特别有用。
范例: iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000动作: LOG
说明: 将封包相关讯息纪录在/var/log 中,详细位置请查阅/etc/syslog.conf 配置文件,进行完此处理动作后,将会继续匹配其规则。
范例: iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"动作: SNAT
说明: 改写封包来源IP 为某特定IP 或IP 范围,可以指定port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。
范例: iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source?194.236.50.155-194.236.50.160:1024-32000动作: DNAT
说明: 改写封包目的地IP 为某特定IP 或IP 范围,可以指定port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或filter:forward)。
范例: iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100动作: MIRROR
说明: 镜射封包,也就是将来源IP 与目的地IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。动作: QUEUE
说明: 中断过滤程序,将封包放入队列,交给其它程序处理。通过自行开发的处理程序,可以进行其它应用,例如:计算连接费用等。动作: RETURN
说明: 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。动作: MARK
说明: 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续匹配其它规则。
范例: iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
3、IP 规则的保存与恢复
1. 规则保存
"iptables-save"命令 把规则保存到文件中
再由目录"/etc/rc.d"下的脚本(/etc/rc.d/init.d/iptables)自动装载.
使用命令iptables-save 来保存规则,
# iptables-save > /etc/sysconfig/iptables
生成保存规则的文件为: /etc/sysconfig/iptables;
也可以用命令:
# service iptables save
它能把规则自动保存在/etc/sysconfig/iptables 中。
2. 规则恢复
当计算机启动时,rc.d 下的脚本将用命令iptables-restore 调用这个文件,从而就自动恢复了规则。
3. iptables服务操作
启动:
# service iptables start
Applying iptables firewall rules: [ OK ]
Loading additional iptables modules: ip_conntrack_netbios_n[ OK ]
停止:
# service iptables stop
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
重启:
# service iptables restart
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
Applying iptables firewall rules: [ OK ]
Loading additional iptables modules: ip_conntrack_netbios_n[ OK ]
4. 彻底清空规则
# iptables -F
# iptables-save > /etc/sysconfig/iptables