Iptables 电脑版发表于:2022/5/31 21:37  >#Iptables [TOC] Iptables简介 ------------ tn2>iptables它是一个通过netfilter网络安全框架对内核空间的网络操作的一个用户空间下的一个软件。 它们的关系如下图所示:  tn2>它就相当于防火墙的一个应用可以通过一些表在内核空间下实现: 黑名单。 内核转发。 ip有规则的过滤。<br/> PREROUTING一般来讲用来转发端口的,比如你在主机的一个端口对应docker容器里面的一个端口。 ForWard就是做转发的,如果不是本机的包将会做转发,但需要开启本地的forward为1. INPUT和OUTPUT一个是进口规则,一个是出口规则。 从OUTPUT出去的PREROUTING一般是做地址转换的功能。 >### 表规则过滤 tn2>我们把具有相同功能的规则的集合叫做“表”,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而 iptables已经为我们定义了4种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4种功能的范围。其 中包含:<br/> **filter**表:负责过滤功能,防火墙;内核模块:iptables_filter。 **nat**表:network address translation,网络地址转换功能;内核模块:iptable_nat。 **mangle**:拆解报文,做出修改,并重新封装的功能;iptable_mangle。 **raw**表:关闭nat表上启用的连接追踪机制;iptable_raw。 >### target处理动作 tn2>处理动作在iptables中被称为target,动作也可以分为基本动作和扩展动作。 此处列出一些常用的动作,之后的文章会对它们进行详细的示例与总结: <br/> 1.**ACCEPT**:允许数据包通过。 2.**DROP**:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会 有反应。 3.**REJECT**:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。 4.**SNAT**:源地址转换,解决内网用户用同一个公网地址上网的问题。 5.**MASQUERADE**:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。 6.**DNAT**:目标地址转换。 7.**REDIRECT**:在本机做端口映射。 8.**LOG**:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对 数据包做任何其他操作,仍然让下一条规则去匹配。 iptables 规则之命令讲解 ------------ ```bash iptables -[ACD] chain rule-specification [options] iptables -I chain [rulenum] rule-specification [options] iptables -R chain rulenum rule-specification [options] iptables -D chain rulenum [options] iptables -[LS] [chain [rulenum]] [options] iptables -[FZ] [chain] [options] iptables -[NX] chain iptables -E old-chain-name new-chain-name iptables -P chain target [options] iptables -h (print this help information) ``` tn2>iptables的概念中已经提到过,在实际操作iptables的过程中,是以“表”作为操作入口的。iptables为我们预定义了4张 表,它们分别是raw表、mangle表、nat表、filter表,不同的表拥有不同的功能。 ```bash # 列出filter表的所有规则。 iptables -t filter -L ``` | 参数 | 描述 | | ------------ | ------------ | | `-t` | 指定要操作的表.(省略-t选项时,默认操作filter表) | | `-L` | 查看`-t`选项对应的表的规则, 列出规则。 | | `-v`(verbose) | 表示详细的,冗长的,当使用-v选项时,会显示出"计数器"的信息。 | | `-n` | 不解析IP地址。 | | `--line-numbers`(简写:`--line`) | 显示规则的序号。 | | `-x` | 显示计数器的精确值。 | | `-A` | 在对应链的末尾添加规则。 | | `-I` | 在对应链的开头添加规则。 | | `-j` | 动作。 | | `-D` | 删除对应链中的规则。 | | `-F` | 清空对应链中的规则。 | | `-s` | 指定的ip。匹配条件。(忽略默认为:`0.0.0.0/0`) | | `-R` | 修改规则中的动作。 | >### 查询 ```bash # 查看指定表的指定链中的规则。 iptables [-t table] -L chain # 查看指定表的所有规则,并且显示更详细的信息(更多字段)。(简写:-vL) iptables [-t table] -v -L # 表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解。 iptables [-t table] -n -L # 表示查看表的所有规则,并且显示规则的序号 iptables --line-numbers -t 表名 -L # 表示查看表中的所有规则,并且显示更详细的信息,不过,计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值 iptables -t 表名 -v -x -L # 实际使用中,为了方便,往往会将短选项进行合并,所以,如果将上述选项都糅合在一起,可以写成如下命令,此处以filter表为例。 iptables --line -t filter -nvxL # 也可以只查看某张表中的某条链,此处以filter表的INPUT链为例 iptables --line -t filter -nvxL INPUT # 查看帮助 iptables -h | man iptables ```  >### 添加 ```bash # 在指定表的指定链的首部添加一条规则 iptables -t 表名 -A 链名 匹配条件 -j 动作 iptables -t filter -A INPUT -s 192.168.1.1 -j DROP # 在指定表的指定链的指定位置添加一条规则 iptables -t 表名 -I 链名 匹配条件 -j 动作 iptables -t filter -I INPUT -s 192.168.1.1 -j ACCEPT # 设置指定表的指定链的默认策略(默认动作),并非添加规则。 iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作 iptables -t filter -I INPUT 5 -s 192.168.1.1 -j REJECT ``` >### 删除 tn2>按照规则序号删除规则,删除指定表的指定链的指定规则。如果没有保存规则,删除规则时请慎重。 ```bash # 表示删除filter表中INPUT链中序号为3的规则。按照具体匹配条件与动作删除规则,删除指定表的指定链指定规则。 iptables -t 表名 -D 链名 规则序号 iptables -t filter -D INPUT 3 # 表示删除filter表中INPUT链中源地址为192.168.1.146并且动作为DROP的规则,删除指定表的指定链中的所有规则. iptables -t 表名 -D 链名 匹配条件 -j 动作 iptables -t filter -D INPUT -s 192.168.1.146 -j DROP # 删除指定表中的所有规则,执行时需三思。 iptables -t 表名 -F 链名 iptables -t filter -F INPUT ``` >### 修改 tn2>如果使用-R选项修改规则中的动作,那么必须指明原规则中的原匹配条件,例如源IP,目标IP等。修改指定表中指 定链的指定规则,-R选项表示修改对应链中的规则,使用-R选项时要同时指定对应的链以及规则对应的序号,并且 规则中原本的匹配条件不可省略。 ```bash # 表示修改filter表中INPUT链的第3条规则,将这条规则的动作修改为ACCEPT iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT # 表示将filter表中FORWARD链的默认策略修改为ACCEPT。 iptables -t filter -P FORWARD ACCEPT ``` Demo ------------ tn2>准备2台可以通信的机器,我这里是:`10.0.0.7`和`10.0.0.6`,我们在`10.0.0.6`上操作操作如下: ```bash # 清理iptables中的规则(切勿在生产中使用) iptables -t filter -F INPUT # 从filter末尾添加一条进来的规则,设置ip来自10.0.0.7的请求不可访问 iptables -t filter -A INPUT -s 10.0.0.7 -j DROP # 查看filter表中的相关项 iptables --line -t filter -nvxL INPUT # 接着我们来到客户端(10.0.0.6)ping主机,发现ping不通了 ping 10.0.0.6 ```  tn2>接着我们从filter头部添加一条进来的规则,设置ip来自`10.0.0.7`的请求可访问,我们可以从表中看到有两条记录了,一般进来的请求按顺序进行匹配,匹配到合适的便不会向下去找其他规则了。 添加好后,我们发现又可以进行请求了。 ```bash iptables -t filter -I INPUT -s 10.0.0.7 -j ACCEPT ```  tn2>删除我们添加的允许来自`10.0.0.7`数据包通过那项。再次尝试我们发现它又ping不通了。 tn>当有多个规则匹配允许来自`10.0.0.7`数据包通过时,需要一条一条删除。 ```bash iptables -t filter -D INPUT -s 10.0.0.7 -j ACCEPT ```  tn2>修改我们DROP为ACCEPT。我们发现又可以ping通了。 ```bash iptables -t filter -R INPUT 1 -s 10.0.0.7 -j ACCEPT ``` 