Iptables (简体中文)

From ArchWiki
Revision as of 12:28, 22 January 2013 by Fengchao (Talk | contribs) (Update translation.)

Jump to: navigation, search

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary end

翻译状态: 本文是英文页面 Iptables翻译,最后翻译时间:2013-01-22,点击这里可以查看翻译后英文页面的改动。

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

安装

注意: 内核需要编译进去 iptables 支持,所有 Arch Linux 官方内核都有此功能。

首先,安装 官方软件源 中的 iptables 用户空间工具。

设置开机启动 iptables systemd 服务,然后启动服务:

# systemctl enable iptables
# systemctl start iptables

要启用 IPv6 防火墙,需要另外启用ip6tables:

# systemctl enable ip6tables
# systemctl start ip6tables

基本概念

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

链用来指定规则,一个数据包从链的顶端开始,向下移动直到匹配某个规则。 有三个内建规则 INPUTOUTPUTFORWARD。所有本地外发包会通过 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

配置文件

/etc/conf.d/iptables 指向了具体规则集配置文件。守护进程启动时会装入规则集。

/etc/conf.d/iptables
# Configuration for iptables rules
IPTABLES_CONF=/etc/iptables/iptables.rules
IP6TABLES_CONF=/etc/iptables/ip6tables.rules

# Enable IP forwarding (both IPv4 and IPv6)
# NOTE: this is not the recommended way to do this, and is supported only for
# backward compatibility. Instead, use /etc/sysctl.conf and set the following
# options:
# * net.ipv4.ip_forward=1
# * net.ipv6.conf.default.forwarding=1
# * net.ipv6.conf.all.forwarding=1
#IPTABLES_FORWARD=0

保存当前规则的命令:

# rc.d save iptables

Systemd 用户,通过如下命令行添加规则:

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

最后重启服务:

# systemctl restart iptables

察看运行状态:

$ systemctl status iptables

保存计数

注意: systemd用户无法使用此方法,需要编辑 systemd 服务文件。

同时还可以保存过滤的数据大小和数据包个数。编辑 /etc/rc.d/iptables

save) 部分,将:

/usr/sbin/iptables-save > $IPTABLES_CONF

改成

/usr/sbin/iptables-save -c > $IPTABLES_CONF

stop) 部分,加入如下内容:

stop)
     $0 save
     sleep 2

start) 部分,将:

/usr/sbin/iptables-restore < $IPTABLES_CONF

改成

/usr/sbin/iptables-restore -c < $IPTABLES_CONF

然后保存文件

指南

日志

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

参见

Template:Wikipedia