Iptables使用总结
1、Iptables是什么
netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
Iptables其实不是真正的防火墙,可以理解为客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的安全框架中,这个安全框架才是真正的防火墙,这个框架就是netfilter,它位于内核空间中。
2、Iptables基础
2.1、防火墙原理
iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数或者叫做链,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。如下图。
2.2、表的概念
上文中我们说到可以在PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING五个链中写规则,我们把链中具有相同功能规则的集合叫做表。Iptables中定义了4种表,每种表对应了不同的功能。
Filter:这是默认表,过滤规则表,根据预定义的规则过滤符合条件的数据包。
Nat:负责网络地址转换。
Mangle:这个表专门用于改变数据包的结构,拆解报文,做出修改,并重新封装(一般改变数据包首部格式)。
Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度。
2.3、表与链之间的关系
我们在操作规则时,都是通过表为操作入口,对规则进行定义。
以下为表与链之间的关系:
raw 表中的规则可被哪些链使用: PEROUTING、OUTPUT
mangle表中的规则可被哪些链使用: PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat 表中的规则可被哪些链使用:PREROUTING、OUTPUT、POSTROUTING、INPUT(rhel7中才有)
filter表中的规则可被哪些链使用: INPUT、FORWARD、OUTPUT
如果多个表的规则出现在同一链上,生效次序:
raw > mangle > nat > filter
在同一链上可定义多条同一表的规则(比如filter表),这些规则是自上而下依次匹配,如果找到匹配到的规则,则按此规则处理,后续规则不再匹配。
上述提到的5个链,PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING,称为内置链。
还可根据需要自定义链,自定义链上的规则无法直接生效,要被某个内置链引用才可以。
创建自定义链:iptables -N CHAIN_NAME
调用格式(以INPUT链调用为例):iptables …… -j CHAIN_NAME
这样做的目的,就是可以把某一类规则定义于一个自定义链中,从而可以一并引用或一并删除,而不用逐条规则处理。
2.4、数据包经过防火墙的流程
3、Iptables 使用
3.1、参数说明
参数 | 参数说明 | |
保存配置 | ||
方法一:/etc/init.d/iptables save 或 service iptables save 方法二:iptables-save > /etc/sysconfig/iptables | ||
载入配置文件 | ||
方法一:iptables-restore < /etc/sysconfig/iptables 方法二:service iptables reload 或 service iptables restart -n:不清除原有规则 | ||
显示相关参数 | ||
-n | 以数字的方式显示地址或端口信息 | |
-L | 列出一个链或所有链中的规则信息 | |
-S | 以iptables-save 命令格式显示链上规则 | |
--line-number | 显示规则的序号 | |
-v 或 -vv | 显示详细信息 | |
-x | 显示计数器结果的精确值,而非单位转换后的易读值 | |
链管理相关参数 | ||
iptables -X | 删除自定义的空的规则链 | |
iptables -Z | 链的计数器清零(数据包计数器与数据包字节计数器) | |
iptables -N | 创建新的用户定义链 | |
iptables -P | 设置默认策略;对filter表中的链而言,其默认策略有: ACCEPT:接受 DROP:丢弃 | |
iptables -E | 重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除 | |
规则管理常用参数(在前面加感叹号,表示是取反) | ||
-t 表名称 | 指定配置哪个表(4表),指定配置表名称。 | |
-A 链名称 | 追加到指定链(链名称必须大写),默认将配置的规则插入到当前规则最后一条。 | |
-I 链名称 | 插入相应规则策略,到指定链上,默认将配置的规则插入到第一条 (可以根据规则序号插入到指定位置) | |
-D 链名称 | 删除指定的规则(可以根据以下方法删除 (1) 指明规则序号 (2) 指明规则本身) | |
-R 链名称 规则编号 | 替换指定链上的指定规则编号 例:iptables -R INPUT 2 | |
-C | 检查规则是否存在 | |
-F | 清除所有规则,不会处理默认的规则 | |
-Z | 置零计数器 iptables的每条规则都有两个计数器 (1) 匹配到的报文的个数 (2) 匹配到的所有报文的大小之和 | |
[!] -p 协议名称 | 指定规则的协议名称,可以使用协议代表的数字表示 常见值为all ,tcp, udp, icmp, 参看:/etc/protocols | |
-j 动作 | 匹配数据包后的动作 | |
ACCEPT | 允许 | |
DROP | 丢弃(没有响应)推荐使用 | |
REJECT | 拒绝(回应请求者明确的拒绝) | |
MASQUERADE | 伪装上网时使用 | |
SNAT | 共享地址上网 | |
DNAT | 目的地址改写 | |
RETURN | 返回调用链,继续判断其他规则 | |
REDIRECT | 端口重定向 | |
MARK | 做防火墙标记 | |
LOG | 记录日志,dmesg | |
[!] -i | 报文流入的接口;只能应用于数据报文流入环节, 只应用于INPUT、FORWARD、PREROUTING链 | |
[!] -o | 报文流出的接口;只能应用于数据报文流出的环节, 只应用于FORWARD、OUTPUT、POSTROUTING链 | |
[!] -s | 指定源IP地址或源网段信息 address[/mask][,...] | |
[!] -d | 指定目标IP地址或目标网段信息 address[/mask][,...] | |
扩展参数 需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效 查看帮助 man iptables-extensions | ||
隐式扩展 在使用 -p 选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制, 不需要手动加载扩展模块 | ||
TCP/UDP协议的扩展选项 | ||
--dport | 匹配报文目标端口,可为端口范围 | |
--sport | 匹配报文源端口,可为端口范围 | |
显式扩展 必须使用-m选项指明要调用的扩展模块的扩展机制 要手动加载扩展模块 | ||
-m 模块 | 表示加载扩展功能的参数(可以加载扩展参数) | |
multiport | 以离散方式定义多端口匹配, 最多指定15个端口 | |
iprange | 指明连续的ip地址范围 (但一般不是整个网络) | |
icmp | 使用icmp的扩展 | |
mac | 指明源MAC地址 | |
time | 根据将报文到达的时间与指定的时间范围 进行匹配 | |
string | 对报文中的应用层数据做字符串模式匹配检测 | |
connlimit | 根据每客户端IP做并发连接数数量匹配 可防止CC(Challenge Collapsar挑战黑洞)攻击 | |
limit | 基于收发报文的速率做匹配 | |
state | 根据”连接追踪机制“去检查连接的状态, 较耗资源 |
3.2、使用案例
1. 删除已有规则
在开始创建iptables规则之前,你也许需要删除已有规则。命令如下:
iptables -F
(or)
iptables –flush
查看已有规则
iptables -n -L
2.设置链的默认策略
链的默认政策设置为”ACCEPT”(接受),若要将INPUT,FORWARD,OUTPUT链设置成”DROP”(拒绝),命令如下:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
当INPUT链和OUTPUT链都设置成DROP时,对于每一个防火墙规则,我们都应该定义两个规则。例如:一个传入另一个传出。在下面所有的例子中,由于我们已将DROP设置成INPUT链和OUTPUT链的默认策略,每种情况我们都将制定两条规则。
当然,如果你相信你的内部用户,则可以省略上面的最后一行。例如:默认不丢弃所有出站的数据包。在这种情况下,对于每一个防火墙规则要求,你只需要制定一个规则——只对进站的数据包制定规则。
3、设置常见端口访问
首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链
为了能采用远程SSH登陆,我们要开启22端口.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一步,好多人都是望了写这一步规则导致,始终无法SSH.在远程一下,是不是好了.
其他的端口也一样,如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其他同理.)
如果做了WEB服务器,开启80端口.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
如果做了邮件服务器,开启25,110端口.
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
如果做了FTP服务器,开启21端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
如果做了DNS服务器,开启53端口
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
如果你还做了其他的服务器,需要开启哪个端口,照写就行了.
上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP
4、允许ping
允许icmp包通过,也就是允许ping,
iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话)
5、仅允许来自指定网络的SSH连接请求
例:仅允许来自于192.168.100.0/24域的用户的ssh连接请求
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
6、使用multiport 将多个规则结合在一起
允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一条规则。如下所示:
例:允许所有ssh,http,https的流量访问
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
7、端口转发 例:将来自422端口的流量全部转到22端口。
这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
除此之外,还需要允许连接到422端口的请求
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
8、记录丢弃的数据表 第一步:新建名为LOGGING的链
iptables -N LOGGING
第二步:将所有来自INPUT链中的数据包跳转到LOGGING链中
iptables -A INPUT -j LOGGING
第三步:为这些包自定义个前缀,命名为”IPTables Packet Dropped”
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
第四步:丢弃这些数据包
iptables -A LOGGING -j DROP
9、如何删除自定义LOGGING链
执行删除空链
iptables -X LOGGING
iptables: Too many links.
查看哪个链默认引用该LOGGING链
Iptables -nvL INPUT
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2850 217K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT icmp -- * * 2.0.1.4 0.0.0.0/0
0 0 ACCEPT icmp -- * * 192.168.0.0/24 0.0.0.0/0
1885 113K ACCEPT icmp -- * * 10.100.53.0/24 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:422
65 5572 LOGGING all -- * * 0.0.0.0/0 0.0.0.0/0
清除引用LOGGING链的规则
iptables -D INPUT 7
情况LOGGING链上的规则
iptables -F LOGGING
删除LOGGING空链
iptables -X LOGGING
更多推荐
Iptables使用总结
发布评论