# Iptables入门教程

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2014-04-21T07:14:00Z
Canonical: https://wepostx.com/topics/440

> 乌云历史资料归档
>
> **原始作者：** zhangsan
> **原始编号：** superkieran-wooyundrops:226
> **原始发布时间：** 2014-04-21 15:14
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

## 0x00 iptables介绍

linux的包过滤功能，即linux防火墙，它由netfilter 和 iptables 两个组件组成。
netfilter 组件也称为内核空间，是内核的一部分，由一些信息包过滤表组成，这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具，也称为用户空间，它使插入、修改和除去信息包过滤表中的规则变得容易。

![原文图片](/media/2016/06/35d85c462fbbacd54c630861d16f0cf8)

## 0x01 iptables的结构

iptables的结构：

```text
iptables -> Tables -> Chains -> Rules
```
简单地讲，tables由chains组成，而chains又由rules组成。iptables 默认有四个表Filter, NAT, Mangle, Raw，其对于的链如下图。

![原文图片](/media/2016/06/49328969e6a7bf72883ea71323ceb1bf)

## 0x02 iptables工作流程

![原文图片](/media/2016/06/e87438ba48f4b2123648b1684f09c63f)

## 0x03 filter表详解

### 1. 在iptables中，filter表起过滤数据包的功能，它具有以下三种内建链：

```text
INPUT链 – 处理来自外部的数据。 OUTPUT链 – 处理向外发送的数据。 FORWARD链 – 将数据转发到本机的其他网卡设备上。
```

### 2. 数据流向场景
访问本机：在INPUT链上做过滤
本机访问外部：在OUTPUT链上做过滤
通过本机访问其他主机:在FORWARD链上做过滤

### 3. Iptables基本操作
启动iptables：service iptables start
关闭iptables：service iptables stop
重启iptables：service iptables restart
查看iptables状态：service iptables status
保存iptables配置：service iptables save
Iptables服务配置文件：/etc/sysconfig/iptables-config
Iptables规则保存文件：/etc/sysconfig/iptables
打开iptables转发：echo "1"> /proc/sys/net/ipv4/ip_forward

## 0x04 iptables命令参考

命令：

```text
iptables [ -t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
```

### 1. 表名
表名：Filter, NAT, Mangle, Raw
起包过滤功能的为表Filter，可以不填，不填默认为Filter

### 2. 命令选项
选项名功能及特点
-A在指定链的末尾添加（--append）一条新的规则
-D删除（--delete）指定链中的某一条规则，按规则序号或内容确定要删除的规则
-I在指定链中插入（--insert）一条新的规则，默认在链的开头插入
-R修改、替换（--replace）指定链中的一条规则，按规则序号或内容确定
-L列出（--list）指定链中的所有的规则进行查看，默认列出表中所有链的内容
-F清空（--flush）指定链中的所有规则，默认清空表中所有链的内容
-N新建（--new-chain）一条用户自己定义的规则链
-X删除指定表中用户自定义的规则链（--delete-chain）
-P设置指定链的默认策略（--policy）
-n用数字形式（--numeric）显示输出结果，若显示主机的 IP地址而不是主机名
-P设置指定链的默认策略（--policy）
-v查看规则列表时显示详细（--verbose）的信息
-V查看iptables命令工具的版本（--Version）信息
-h查看命令帮助信息（--help）
--line-number查看规则列表时，同时显示规则在链中的顺序号

### 3. 链名
可以根据数据流向来确定具体使用哪个链，在Filter中的使用情况如下：

```text
INPUT链 – 处理来自外部的数据。 OUTPUT链 – 处理向外发送的数据。 FORWARD链 – 将数据转发到本机的其他网卡设备上。
```

### 4. 条件匹配
条件匹配分为基本匹配和扩展匹配，拓展匹配又分为隐式扩展和显示扩展。
a)基本匹配包括：
匹配参数说明
-p指定规则协议，如tcp, udp,icmp等，可以使用all来指定所有协议
-s指定数据包的源地址参数，可以使IP地址、网络地址、主机名
-d指定目的地址
-i输入接口
-o输出接口
b)隐式扩展包括：

![原文图片](/media/2016/06/89fb2748a203216088ec7f359b78a26f)

c)常用显式扩展

![原文图片](/media/2016/06/fffd608a39a573b9a3626723e8c3a309)

### 5. 目标值
数据包控制方式包括四种为：

```text
ACCEPT：允许数据包通过。 DROP：直接丢弃数据包，不给出任何回应信息。 REJECT：拒绝数据包通过，必须时会给数据发送端一个响应信息。 LOG：在/var/log/messages 文件中记录日志信息，然后将数据包传递给下一条规则。 QUEUE：防火墙将数据包移交到用户空间 RETURN：防火墙停止执行当前链中的后续Rules，并返回到调用链(the calling chain)
```

## 0x05 Iptables常见命令

a) 1. 删除iptables现有规则

```text
iptables –F
```
b) 2. 查看iptables规则

```text
iptables –L（iptables –L –v -n）
```
c) 3. 增加一条规则到最后

```text
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
```
d) 4.添加一条规则到指定位置

```text
iptables -I INPUT 2 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
```
e) 5.  删除一条规则

```text
iptabels -D INPUT 2
```
f) 6.修改一条规则

```text
iptables -R INPUT 3 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
```
g) 7. 设置默认策略

```text
iptables -P INPUT DROP
```
h) 8.允许远程主机进行SSH连接

```text
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
```
i) 9.允许本地主机进行SSH连接

```text
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INTPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
```
j) 10.允许HTTP请求

```text
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
```
k) 11.限制ping 192.168.146.3主机的数据包数，平均2/s个，最多不能超过3个

```text
iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT
```
l) 12.限制SSH连接速率(默认策略是DROP)

```text
iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT
```

## 0x06 如何正确配置iptables

a) 1. 删除现有规则
iptables -F
b) 2.  配置默认链策略

```text
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP
```
c) 3. 允许远程主机进行SSH连接

```text
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
```
d) 4. 允许本地主机进行SSH连接

```text
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
```
e) 5. 允许HTTP请求

```text
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
```

## 0x07 使用iptables抵抗常见攻击

### 1.防止syn攻击
思路一：限制syn的请求速度（这个方式需要调节一个合理的速度值，不然会影响正常用户的请求）

```text
iptables -N syn-flood iptables -A INPUT -p tcp --syn -j syn-flood iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN iptables -A syn-flood -j DROP
```
思路二：限制单个ip的最大syn连接数

```text
iptables –A INPUT –i eth0 –p tcp --syn -m connlimit --connlimit-above 15 -j DROP
```

### 2. 防止DOS攻击
利用recent模块抵御DOS攻击

```text
iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP
```
单个IP最多连接3个会话

```text
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
```
只要是新的连接请求，就把它加入到SSH列表中

```text
Iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
```
5分钟内你的尝试次数达到3次，就拒绝提供SSH列表中的这个IP服务。被限制5分钟后即可恢复访问。

### 3. 防止单个ip访问量过大

```text
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP
```

### 4. 木马反弹

```text
iptables –A OUTPUT –m state --state NEW –j DROP
```

### 5. 防止ping攻击

```text
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m -j ACCEPT
```
个人见解，不足之处求指正。

## Replies
