iptables是Linux防火墙系统的重要组成部分,主要功能是实现对网络数据包进出设备及转发的控制。它能够添加、删除具体的过滤规则,并可对数据包所做的操作进行控制,例如允许或禁止数据包通过特定的端口或地址。iptables默认维护着4个表和5个链来控制网络数据包的流动,可以使用命令行工具进行配置和管理。
4表
表 | 说明 |
---|---|
Filter | Filter是iptables的默认表,也是最常用的表之一。它可以进行基于源IP地址、目标IP地址、端口号等多种条件的过滤,以允许或禁止数据包通过特定的端口或地址。 |
NAT | NAT表用于网络地址转换(Network Address Translation),可以实现对源IP地址、目标IP地址、端口号等网络协议字段进行转换。NAT表包含3个内建链:PREROUTING链、POSTROUTING链和OUTPUT链。 |
Mangle | Mangle表可以修改数据包的TTL(Time To Live)值,以及数据包的QoS(Quality of Service)信息。 |
Raw | Raw表用于处理异常情况,例如某些不需要被过滤的包,或者需要使用ICMP错误报告的数据包。Raw表包含3个内建链:PREROUTING链、OUTPUT链和POSTROUTING链。 |
5链
链 | 阶段 | 说明 |
---|---|---|
INPUT | 到达本地主机 | 该链用于对进入本机的数据包进行过滤,可以设置允许或拒绝不同来源的数据包进入本机,例如,可以阻止某些IP地址或端口号的连接请求。 |
OUTPUT | 从本地主机发送出去 | 该链用于对本机发出的数据包进行过滤,可以设置只允许通过特定端口或协议发送数据包,或者禁止向特定IP地址或端口号发送数据包等。 |
FORWARD | 转发到另一个接口 | 该链用于对经过本机的数据包进行过滤,例如,可以设置将某些流量重定向到另一台服务器上,或者拒绝不符合条件的数据包从本机转发。 |
PREROUTING | 在路由决策之前 | 该链是在数据包路由之前执行的,可以对进入本机的数据包进行修改或重定向,例如,可以设置端口映射规则将外部的请求转发至内网服务器。 |
POSTROUTING | 在路由决策之后 | 该链是在数据包路由之后执行的,可以对经过本机的数据包进行修改或重定向,例如,可以设置NAT规则,将私有IP地址转换为公共IP地址以便访问互联网。 |
防火墙的数据流图如下表,不同的链处于不同的阶段。
堵通策略
iptables 的堵通策略可分为以下几种情况
分类 | 说明 |
---|---|
基于IP地址 | iptables可以根据源IP地址或目标IP地址来过滤流量。通过设置规则,可以允许或者拒绝特定IP地址或者IP地址段的数据流,从而实现基于IP地址的堵通策略。 |
基于端口号 | iptables还可以根据源端口号或目标端口号来过滤数据流。通过设置规则,可以允许或者拒绝特定端口号或者端口号范围的数据流,从而实现基于端口号的堵通策略。 |
基于协议类型 | iptables还可以根据传输层协议类型(如TCP、UDP等)来过滤数据流。通过设置规则,可以允许或者拒绝特定协议类型的数据流,从而实现基于协议类型的堵通策略。 |
基于数据包状态 | iptables还可以根据数据包的状态(如已建立连接、未建立连接等)来过滤数据流。通过设置规则,可以允许或者拒绝特定状态的数据流,从而实现基于数据包状态的堵通策略。 |
基于应用程序 | iptables还可以根据应用程序来过滤数据流。通过设置规则,可以允许或者拒绝特定应用程序的数据流,从而实现基于应用程序的堵通策略。 |
示例
拒绝所有传入和传出的数据包:这个策略可以通过设置默认策略为DROP来实现。这意味着除非有专门的规则来允许某些数据包通过,否则所有传入和传出的数据包都将被阻止。
允许某些IP地址或端口通过:可以使用iptables的规则来明确允许特定的IP地址或端口通过。例如,下面的命令将允许来自IP地址192.168.0.100的所有流量通过:
iptables -A INPUT -s 192.168.0.100 -j ACCEPT
屏蔽指定的IP地址或端口:可以使用iptables的规则来屏蔽特定的IP地址或端口。例如,下面的命令将拒绝来自IP地址192.168.0.100的所有流量:iptables -A INPUT -s 192.168.0.100 -j DROP
过滤协议类型:可以使用iptables的规则来过滤不同的协议类型。例如,下面的命令将只允许HTTP和HTTPS流量通过:iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -p udp -j DROP
防止DDoS攻击:可以使用iptables的规则来防止DDoS攻击。例如,下面的命令将限制每个IP地址在60秒内只能发送100个包:iptables -A INPUT -p tcp -m limit --limit 100/s --limit-burst 150 -j ACCEPT
iptables -A INPUT -j DROP
语法格式
iptables命令的基本语法格式为:
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
表名和链名: 用于指定iptables命令所操作的表和链。
命令选项: 用于指定管理iptables规则的方式,比如插入、增加、删除、查看等。
条件匹配: 用于指定对符合什么样条件的数据包进行处理。
目标动作或跳转: 用于决定经过这条规则后应该执行的动作。
iptables的规则执行顺序是从上至下依次匹配,如果匹配成功,则根据该规则的动作(如accept、reject、log等)来决定后续的处理方式。一般而言,iptables命令需要root权限才能操作。
表明
-t:指定操作的表名,可选值包括filter、nat、mangle、raw等。
命令选项
-A(append):在指定链的末尾添加一条规则。
-I(insert):在指定链的开头插入一条规则。
-D(delete):删除指定链中匹配条件的规则。
-L(list):列出指定链中的所有规则。
-P(policy):设置指定链的默认策略。
-s(source):指定源IP地址或网段。
-d(destination):指定目标IP地址或网段。
-p(protocol):指定要匹配的协议类型,比如TCP、UDP、ICMP等。
–sport(source port):指定源端口号。
–dport(destination port):指定目标端口号。
-j(jump):指定目标动作或跳转。常用的跳转目标包括ACCEPT、REJECT、DROP、LOG等。
-m(match):指定扩展模块,比如限速模块、状态模块等。
-i(in-interface):指定数据包进入的网络接口。
-o(out-interface):指定数据包输出的网络接口。
匹配参数
–source(或 -s):指定源IP地址或网段。
–destination(或 -d):指定目标IP地址或网段。
–protocol(或 -p):指定要匹配的协议类型,比如TCP、UDP、ICMP等。
–sport:指定源端口号。
–dport:指定目标端口号。
–state:指定连接状态,比如NEW、ESTABLISHED、RELATED等。
–icmp-type:指定ICMP报文类型。
–mac-source:指定源MAC地址。
–mac-destination:指定目标MAC地址。
触发动作
ACCEPT:接受数据包,允许其通过防火墙并到达目标主机。
DROP:丢弃数据包,不允许其通过防火墙并到达目标主机。
REJECT:拒绝数据包,向发送方发送一个错误信息,告知其无法到达目标主机。与DROP不同之处在于,DROP不向发送方发送任何信息。
LOG:记录日志信息,将匹配条件的数据包进行记录。
SNAT(Source Network Address Translation):源地址转换,将数据包的源IP地址更改为指定的地址。常用于实现负载均衡和高可用性等功能。
DNAT(Destination Network Address Translation):目标地址转换,将数据包的目标IP地址更改为指定的地址。常用于实现端口映射和虚拟主机等功能。
MASQUERADE:伪装,将数据包的源IP地址更改为防火墙的IP地址,常用于实现局域网访问外网等功能。
REDIRECT:将数据包重定向到本地主机上的另一个端口或者IP地址,常用于实现端口映射、网络转发等功能。
常用命令
- iptables -L:列出当前所有规则,包括INPUT、FORWARD和OUTPUT三个表的规则。
- iptables -A:向指定链(如INPUT、FORWARD或OUTPUT)添加新规则,-A表示追加到链的末尾。
- iptables -I:向指定链插入新规则,-I后面跟的数字表示插入规则的位置,例如-I INPUT 4表示在INPUT链的第4个位置插入新规则。
- iptables -D:删除指定链中的规则,-D后面接要删除的规则编号。
- iptables -P:设置指定链的默认策略,例如iptables -P FORWARD DROP表示将FORWARD链的默认策略设置为DROP。
- iptables -s:指定源IP地址或网段,例如iptables -A INPUT -s 192.168.0.0/24表示从192.168.0.0/24网段发来的数据包都要进入INPUT链进行处理。
- iptables -d:指定目标IP地址或网段,例如iptables -A OUTPUT -d 8.8.8.8表示将发送到8.8.8.8的数据包都从OUTPUT链出去。
- iptables -p:指定协议类型,例如iptables -A INPUT -p tcp表示只对TCP数据包进行处理。
- iptables -m:指定匹配模块,例如iptables -A INPUT -m state –state ESTABLISHED,RELATED表示对与已经建立的连接或者是由已建立连接所产生的包进行匹配。
- iptables -j:指定动作,例如iptables -A INPUT -s 192.168.0.0/24 -j DROP表示将来自192.168.0.0/24网段的数据包都丢弃掉。常用的动作有ACCEPT、DROP、REJECT等。