# Iptables (简体中文)

Summary help replacing me
建立和配置 iptables 的信息。
相关
Firewalls
Sysctl#TCP/IP stack hardening

翻译状态： 本文是英文页面 Iptables 的翻译，最后翻译时间：2013-07-19，点击这里可以查看翻译后英文页面的改动。

iptables 是一个 Linux 内核中的强大 防火墙，是 netfilter 项目的一部分。可以直接配置，也可以通过许多 前端 和 图形界面配置。iptables 用于 ipv4 ip6tables 用于 ipv6。

## 安装

Arch Linux 官方内核已经编译进了 iptables 支持，只需要安装 安装 官方软件源 中的 iptables 用户空间工具。

## 基本概念

### 表

iptables 包含四个表: raw, filter, nat 和 mangle。

### 链

链用来指定规则，一个数据包从链的顶端开始，向下移动直到匹配某个规则。 有三个内建规则 `INPUT`、`OUTPUT` 和 `FORWARD`。所有本地外发包会通过 `OUTPUT` 链，所有从外部进入的数据会通过 `INPUT` 链，所有不进入本地的路由数据会通过 `FORWARD` 链。三个内建链都有没有规则匹配时的默认目标，用户可以定义更加有效的链。

### 目标

"目标" 是数据包匹配某个规则后的结果。目标通过 "jump" (-j) 定义。最常用的目标是 ACCEPT, DROP, REJECT 和 LOG。

### 模块

有许多模块可以用来扩展 iptables，例如 connlimit, conntrack, limit 和 recent。这些模块增添了功能，可以进行更复杂的过滤。

## 配置

### 从命令行

检查当前规则和匹配数：

    # iptables -nvL

    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination

    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination

    Chain OUTPUT (policy ACCEPT 0K packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination

上面的结果表明还没有配置规则。

可以通过下面命令将 iptables 规则重置：

    # iptables -P INPUT ACCEPT
    # iptables -P FORWARD ACCEPT
    # iptables -P OUTPUT ACCEPT
    # iptables -F
    # iptables -X

### 配置文件

Iptables 配置规则位于 `/etc/iptables/iptables.rules`, `iptables.service`服务会使用这个规则:

启动服务：

    # systemctl enable iptables.service
    # systemctl start iptables.service

ipv6 规则默认保存在`/etc/iptables/ip6tables.rules`,`ip6tables.service`服务会使用这个规则，可以用类似的方式启动服务。

用命令行，修改规则后，可以通过如下命令行保存规则：

    # iptables-save > /etc/iptables/iptables.rules

修改配置文件后，需要重新加载服务：

    # systemctl reload iptables

察看运行状态：

    $ systemctl status iptables

### 指南

- Simple stateful firewall
- Router

## 日志

LOG 目标可以用来记录匹配某个规则的数据包。和 ACCEPT 或 DROP 规则不同，进入 LOG 目标之后数据包会继续沿着链向下走。所以要记录所有丢弃的数据包，只需要在 DROP 规则前加上相应的 LOG 规则。但是这样会比较复杂，影响效率，所以应该创建一个`logdrop`链。

创建 logdrop 链：

    # iptables -N logdrop

定义规则：

    ## /etc/iptables/iptables.rules

    *filter
    :INPUT DROP [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]

    ... 其它链 ..

    ## logdrop chain
    :logdrop - [0:0]

    -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG
    -A logdrop -j DROP

    ... 规则 ...

    ## log AND drop packets that hit this rule:
    -A INPUT -m state --state INVALID -j logdrop

    ... 更多规则 ...

### 限制日志级别

limit 模块可以用来防止 iptable 的日志过大，产生无用的硬盘写操作。如果不进行限制，攻击者可以通过不停写 iptables 日志填满磁盘(或至少是 `/var` 分区)。

-m limit 可以调用 limit 模块，然后使用 --limit 设置平均速率，--limit-burst 设置初始迸发速率。例如:

    -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG

这将在 logdrop 链上加上规则，记录最开始的十个包，然后每分钟仅记录 5 个包。只要没有突破"limit rate"，"limit burst" 将会重置为 1。

### syslog-ng

使用 Arch 默认的 syslog-ng 可以控制 iptables 日志的输出文件：

    filter f_everything { level(debug..emerg) and not facility(auth, authpriv); };

修改为

    filter f_everything { level(debug..emerg) and not facility(auth, authpriv) and not filter(f_iptables); };

iptables 的日志就不会输出到 `/var/log/everything.log`。

iptables 也可以不输出到 `/var/log/iptables.log`，只需设置`syslog-ng.conf` 中的 d_iptables 为需要的日志文件。

    destination d_iptables { file("/var/log/iptables.log"); };

### ulogd

ulogd 是专门用于 netfilter 的日志工具，可以代替默认的 LOG 目标。软件包 ulogd 位于 `[community]` 源。

## 参见

- Simple stateful firewall
- 官方网站
- Iptables 教程 1.2.2

Category:

- Firewalls (简体中文)