iptables简介
iptables
实际上就是一种包过滤型防火墙。iptables
是Linux系统下最常见的防火墙命令,但实际上它只是一个命令行工具,真正的内核防火墙是位于操作系统内核空间的netfilter
。通过iptables
命令制定规则并执行,即可使得netfilter
在内核层对数据包作出相应的处理。
四表五链
iptables中的表是存放链的容器,而链是存放规则的容器。在数据包进入系统的时候,防火墙会对其报文作规则匹配,并执行相应的动作
。
四表:
- filter表:用于过滤数据包
- nat表:网络地址转换功能(IP 端口)
- mangle表:拆封且修改数据报文并重新封装
- raw表:关闭nat表上启用的链接追踪机制,为了提高效率使用的,raw本身的含义是指“原生的”、“未经过加工的”,符合raw表所对应规则的数据包将会跳过一些检查,这样就可以提高效率
优先级为 : raw > mangle > nat > filter
五链:
- PREROUTING链:用于目标地址转换(DNAT) 数据包进入路由之前
- INPUT链:用于处理进入本机的数据包
- OUTPUT链:用于处理由本机出去的数据包
- FORWARD链:用于处理转发数据包
- POSTROUTING链:用于源地址转换(SNAT) 发送到网卡之前
Ⅰ.【链】
链是规则的容器。在链上有一系列的规则处理动作。报文进入主机的整个链路如下图。
① 进入主机的报文(通常为请求报文),进入路由选择前,进行判断其目标是否为本机IP,如果是则进入INPUT链执行该链上设定的规则,将请求送至应用层处理;若不是本机IP,则会执行FORWARD链上的规则,将请求报文转发到目标主机,并通过POSTROUTING链送出。
② 本机发起的报文(通常为响应报文),则会执行OUTPUT链上的规则,再由POSTROUTING链送出。
由此可见,任何报文进出都必须PREROUTING和POSTROUTING两条链的。
Ⅱ. 【表】
表是链的容器。前面有说到,规则分为很多种,比如说过滤端口、修改报文、转发数据包等等。具有相同功能的规则的集合就叫做表。iptables默认有4张表,分别是负责过滤的filter表(默认缺省操作即针对该表)、负载转换网络地址的nat表、负责修改报文的mangle表以及负责数据跟踪处理的raw表。那表和链是什么关系呢?表的功能不同,决定了链上的规则所能处于的表也是不同的。也就是说,不同的链所能具有表对应的功能是不同的;反过来说,不同的表上能存在的链是固定的。其对应关系如下图所示:
表是有优先级的,其优先顺序如上图所示,从左往右,优先级由高到低。
Ⅲ. 【规则】
前面一直在说规则。规则是由匹配条件和指定动作组成的集合。设定好匹配条件和指定处理动作以后,报文进入链路,会根据匹配条件去匹配报文,匹配成功以后就会按设定的动作去处理,比如接受包、拒绝包、转发包等。
- 匹配条件
iptables可以根据报文的源地址、目的地址、传输协议、服务类型等信息进行匹配。这些条件通常用命令参数来设定。常见的命令参数如下表:
参数 | 说明 |
---|---|
-P | 设置默认策略 |
-F | 清空规则链 |
-L | 查看规则链 |
-I num | num缺省为0,即在规则链的顶部加入新规则;num可设定加入的位置 |
-A | 在规则链的末尾加入新规则 |
-D num | 删除指定位置的规则 |
-s | 匹配报文来源地址 |
-d | 匹配报文目标地址 |
-i | 匹配指定网卡流入的数据 |
-o | 匹配指定网卡流出的数据 |
-p | 匹配协议,可选项TCP、UDP、ICMP |
-m | 使用扩展模块来匹配报文 |
—dport | 匹配目标端口号 |
—sport | 匹配来源端口号 |
- 指定动作
动作 | 说明 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 直接丢弃数据包,不给出响应 |
REJECT | 拒绝数据包通过,给出拒绝响应 |
REDIRECT | 本机端口重定向、映射、透明代理 |
SNAT | 源地址转换 |
DNAT | 目标地址转换 |
MASQUERADE | IP伪装(NAT),用于ADSL |
LOG | 日志记录 |
举例说明
下面举例说明iptables的用法。
① 举例:仅允许远程主机访问本机的80端口,本机地址10.0.0.254
代码语言:javascript复制iptables -F
iptables -A INPUT -p tcp -d 10.0.0.254 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -j DROP
② 举例:将本地的80端口的请求转发到8080端口,本机地址10.0.0.254
代码语言:javascript复制# 方式1:redirect
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
# 方式2:DNAT
iptables -t nat -A PREROUTING -p tcp -d 10.0.0.254 --dport 80 -j DNAT --to-destination 10.0.0.254:8080
这里列了两种方式,第一种redirect方式实际上是端口重定向,只对本机IP有效,效率比DNAT高。第二种则是DNAT转发模式,它既可以转发到本机IP,也可以转发到外部其他主机。
③ 举例:只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对192.168.137.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口。
代码语言:javascript复制iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -s 192.168.137.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
小结
- 使用
-t
参数来指定对哪个表进行操作,缺省状态下默认是对filter
表。 - 要重视规则的顺序,默认是由上到下进行匹配,前面若匹配成功并执行相应的动作以后,后面再有规则可以匹配到之前的报文,也无法执行相应的动作。这里举例说明下:
举例:仅允许远端IP为192.168.0.1的主机访问本机的22端口。
先来看常见的错误写法:
代码语言:javascript复制iptables -P INPUT ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT
上例中的规则想要实现仅允许远端192.168.0.1的IP访问本机的22端口。本机INPUT规则链预设为ACCEPT允许所有包流入,第一条规则匹配到对本机的22端口的所有请求报文并执行丢弃动作,第二条规则匹配到来源于192.168.0.1对本机22端口的访问,这时候允许执行动作是没有任何效果的;因为第一条规则直接拒绝了所有的包。所以这种写法有误。正确的写法应该是:
代码语言:javascript复制iptables -P INPUT ACCEPT
iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
或者:
代码语言:javascript复制iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT
iptables的基本概念以及常见参数先总结到这里。关于iptables更多常用的命令,之后再抽时间总结整理吧。
The End.