iptables防火墙指南
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables防火墙指南相关的知识,希望对你有一定的参考价值。
防火墙概念
-
从逻辑上将,防火墙大体可以分为主机防火墙和网络防火墙。
主机防火墙:针对于单个主机进行防护
网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网 - 从物理上讲,防火墙可以分为硬件防火墙和软件防火墙
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高
软件防火墙:应用软件处理逻辑运行与通用硬件平台上的防火墙,性能低,成本低
iptables
iptables并不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,而这个框架的名字叫做netfilter。
netfilter才是防火墙真正的安全框架,它位于内核空间。
然而,iptables只是一个命令行工具,位于用户空间,我们借助这个工具操作真正的框架。
iptables基础
我们知道iptables是按照规则来办事的,而规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
防火墙存在着“四表五链”,下面我们来谈谈表和链的概念
链
- 当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听的套接字(IP:port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标重点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点。所以,如果我们想要防火墙能够达到“防火”的目的,则需要在内核中设置关卡,所有进出的报文都要通过这个关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止。于是,就出现了INPUT关卡和OUTPUT关卡,而这些关卡在iptables中被称之为“链”。
- 另一种情况,客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文给其他服务器,所以这个时候,我们就会提到iptables中的其他“关卡”,也就是其他“链”,他们就是“路由前”、“转发”、“路由后”,他们的英文名称为:PREROUTING、FORWARD、POSTROUTING。
总结:当我们启用了防火墙功能时,报文需要经过关卡,也就是说,根据实际情况的不同,报文经过“链”可能不同。如果报文需要转发,那么报文则不会经过INPUT链发往用户空间,而是直接在内核空间经过FORWARD链和POSTROUTING链转发出去。
由此我们可以总结出报文的流向
- 到本机某进程的报文:PREROUTING --> INPUT
- 由本级转发的报文:PREROUTING --> FORWARD --> POSTROUTING
- 有本机的某进程发出的报文(通常为响应报文):OUTPUT --> POSTROUTING
表
当我们对每个“链”上都放置了一串规则,但是这些规则是有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们就需要把实现相同功能的规则放在一起。
我们把具有相同功能的规则的集合叫做“表”。所以说,不同功能的规则,我们可以放置在不同的表中进行管理。而iptables已经为我们定义了4中表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4中功能的范围,也就是说,所有的规则都存在于这4张“表”中。
iptables为我们提供的表的分类,如下:
- filter表:负责过滤功能,烦恼歌×××;内核模块;iptables_filter
- nat表:网络地址转换功能;内核模块;iptables_nat
- mangle表:拆解报文,做出修改,并重新封装的功能;iptables_mangle
- raw表:关闭nat表上启用的连接追踪机制;iptables_raw
表链关系
链的规则存放于哪些表中(从链到表的对应关系)
PREROUTING 的规则可以存在于:raw表、mangle表、nat表。
INPUT 的规则可以存在于:mangle表、filter表 (centos7中还有nat表,centos6中没有)。
FORWARD 的规则可以存在于:mangle表、filter表。
OUTPUT 的规则可以存在于:raw表、mangle表、nat表、filter表。
POSTROUTING 的规则可以存在于:mangle表、nat表。
表中的规则可以被哪些链使用(从表到链的对应关系)
raw 表中的规则可以被哪些链使用:PREROUTING、OUTPUT
mangle 表中的规则可以被哪些链使用:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat 表中的规则可以被哪些链使用:PREROUTING、OUTPUT、POSTROUTING(centos7中还有INPUT,centos6中没有)
filter 表中的规则可以被哪些链使用:INPUT、FORWARD、OUTPUT
注意:当数据包经过一个“链”的时候,会将当前链的所有规则都匹配一遍,但是匹配时要按照顺序,一条一条的去匹配。
处理动作
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求石沉大海了,过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会给数据发送端一个相应的信息,客户端刚请求就会收到拒绝的信息。
SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条数据,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
iptables命令参数
-n:以数字格式显示地址和端口号
-v:显示详细信息
-vv:更详细
-L:查看规则
[[email protected] ~]#iptables -vnL
Chain INPUT (policy ACCEPT 14412 packets, 1265K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 22 packets, 1848 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1154 packets, 139K bytes)
pkts bytes target prot opt in out source destination
-t:指定表
[[email protected] ~]#iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 154 packets, 21417 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 139 packets, 20247 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
-A:添加规则
-p:指定协议、--dport:指定目标端口、--sport:指定源端口
[[email protected] ~]#iptables -A INPUT -s 192.168.36.104 -p icmp -j REJECT
[[email protected] ~]#iptables -A INPUT -s 192.168.36.1 -j ACCEPT
--line-numbers:查看规则序列号
[[email protected] ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable
120 8148 ACCEPT all -- * * 192.168.36.1
....
-R:替换指定链上的指定规则编号
[[email protected] ~]#iptables -R INPUT 1 -s 192.168.36.100 -p icmp -j REJECT
[[email protected] ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 56 packets, 5013 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable
....
-Z:置零,将计数器清零
[[email protected] ~]#iptables -Z INPUT
[[email protected] ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 9 packets, 662 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable
....
-S:以命令格式显示
[[email protected] ~]#iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N TEST
-A INPUT -s 192.168.36.100/32 -p icmp -j REJECT --reject-with icmp-port-unreachable
-I:插入,要指明插入至的规则编号
[[email protected] ~]#iptables -I INPUT 3 -j REJECT
-D:删除规则,要指明规则编号
规则删除,后面的规则编号自动进行排序
[[email protected] ~]#iptables -D INPUT 1
[[email protected] ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 193 13252 ACCEPT all -- * * 192.168.36.1 0.0.0.0/0
2 679 62517 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
-N:new, 自定义一条新的规则链
[[email protected] ~]#iptables -N TEST
[[email protected] ~]#iptables -vnL
...
Chain TEST (0 references)
pkts bytes target prot opt in out source destination
-X:delete,删除自定义的空的规则链
[[email protected] ~]#iptables -X TEST-M
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受、DROP:丢弃
[[email protected] ~]#iptables -P INPUT DROP
[[email protected] ~]#iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes)
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
[[email protected] ~]#iptables -E TEST TEST-M
[[email protected] ~]#iptables -vnL
....
Chain TEST-M (0 references)
pkts bytes target prot opt in out source destination
-F:清空指定的规则链,不指定链则清空当前表
[[email protected] ~]#iptables -F -t filter
iptables的显示扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块
multiport扩展
以离散方式定义多端口匹配,最多指定15个端口
- --source-ports,--sports port[,port|,port:port]... 指定多个源端口
- --destination-ports,--dports port[,port|,port:port]... 指定多个目标端口
- --ports port[,port|,port:port]... 多个源或目标端口
例题:拒绝192.1688.36.100主机访问192.168.36.104(本机)的20,21,22,80端口
[[email protected] ~]#iptables -A INPUT -s 192.168.36.100 -d 192.168.36.104 -p tcp -m multiport --dport 20:22,80 -j REJECT
iprange扩展
指明连续的(但一般不是整个网络)ip地址范围
- --src-range from[-to] 源IP地址范围
- --dst-range from[-to] 目标IP地址范围
例题:禁止192.168.36.90-192.168.36.101主机访问192.168.36.104主机的80端口
[[email protected] ~]#iptables -A INPUT -d 192.168.36.104 -p tcp --dport 80 -m iprange --src-range 192.168.36.90-192.168.36.101 -j REJECT
mac扩展
指明源MAC地址
适用于:PREROUTING, FORWARD,INPUT链
- --mac-source XX:XX:XX:XX:XX:XX
例题:指明源MAC地址,可以通过icmp协议访问本机
[[email protected] ~]#iptables -A INPUT -s 192.168.36.100 -p icmp -m mac --mac-source 00:0C:29:5A:43:B7 -j ACCEPT
[[email protected] ~]#iptables -A INPUT -s 192.168.36.100 -j REJECT
string扩展
对报文中的应用层数据做字符串模式匹配检测
- --algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris - --from offset 开始偏移
- --to offset 结束偏移
- --string pattern 要检测的字符串模式
- --hex-string pattern要检测字符串模式,16进制格式
例题1:对访问的地址进行限制
[[email protected] ~]#iptables -A INPUT -s 192.168.36.100 -p tcp --dport 80 -m string --algo bm --string "mage" -j REJECT
例题2:对web站点页面中任何包含magedu的字符串的页面进行规则限制
请求报文中不会包含mage,一半来讲只包含访问某个页面,那么请求内容无非包含了请求某个链接而已。
响应报文中会封装页面的内容信息,因此网页内容会出现在响应报文中,而不是请求报文。
所以,对web页面内容进行规则限制需要在OUTPUT链进行规则设定
[[email protected] ~]#iptables -A OUTPUT -d 192.168.36.100 -p tcp --sport 80 -m string --algo bm --string "magedu" -j REJECT
例题3:拒绝含有“OOXX”字样的报文进入主机
[[email protected] ~]#iptables -A INPUT -m string --algo bm --string "OOXX" -j REJECT
time扩展
根据将报文到达的时间与指定的时间范围进行匹配
- --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
- --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
- --timestart hh:mm[:ss] 时间
- --timestop hh:mm[:ss]
4.1 [!] --monthdays day[,day...] 每个月的几号
4.2 [!] --weekdays day[,day...] 星期几,1 – 7 分别表示星期一到星期日
4.3 [!] --kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
例题1:禁止192.168.36.0/24网段主机在08:00~18:00时间段内访问主机80端口
[[email protected] ~]#iptables -A INPUT -s 192.168.36.0/24 -d 192.168.36.104 -p tcp --dport 80 -m time --timestart 08:00 --timestop 18:00 --kerneltz -j DROP
例题2:周六日不能访问80端口
[[email protected] ~]#iptables -A OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j DROP
connlimit扩展模块
使用connlimit扩展模块,可以限制每个IP地址同时链接到server端的连接数量,注意:不需要指定IP,此模块默认就是针对“每个客户端IP”,即对单IP的并发连接数限制。
- --connlimit-upto #:连接的数量小于等于#时匹配
- --connlimit-above #:连接的数量大于#时匹配
- --connlimit-mask #:某网段范围内的IP匹配
例题1:每个IP地址最多只能占用两个ssh链接远程到本机
[[email protected] ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j
REJECT
例题2:24网段的IP地址限制server端ssh最多连接10个
[[email protected] ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j REJECT
limit扩展模块
限制单位时间内流入的包的数量,基于收发报文的速率做匹配
- --limit #[/second|/minute|/hour|/day]
- --limit-burst number :指出“空闲时可放行的包的数量”,默认值为5
例题:每分钟生成放行10个icmp包
[[email protected] ~]#iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
[[email protected] ~]#iptables -t filter -A INPUT -p icmp -j REJECT
state扩展
conntrack机制:追踪本机上的请求和响应之间的关系
状态有如下几种:
- NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
- ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
- RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
- INVALID:无效的连接,如flag标记不正确
- UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
例题1:让已经建立的连接允许通过
[[email protected] ~]# iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
例题2:开启连接追踪放行响应的报文
[[email protected] ~]# iptables -I CLASS -m state --state ESTABLISHED,RELATED -j ACCEPT
以上是关于iptables防火墙指南的主要内容,如果未能解决你的问题,请参考以下文章