Difference between revisions of "Iptables (简体中文)"

From ArchWiki
Jump to: navigation, search
m (安装)
Line 2: Line 2:
 
[[Category:Security (简体中文)]]
 
[[Category:Security (简体中文)]]
 
[[Category:Networking (简体中文)]]
 
[[Category:Networking (简体中文)]]
{{i18n|Iptables}}
+
[[en:Iptables]]
 
+
[[es:Iptables]]
 +
[[it:Iptables]]
 +
[[ru:Iptables]]
 +
[[sr:Iptables]]
 +
{{Temporary i18n}}
 
{{Article summary start}}
 
{{Article summary start}}
 
{{Article summary text|建立和配置 iptables 的信息。}}
 
{{Article summary text|建立和配置 iptables 的信息。}}

Revision as of 13:36, 13 June 2012

Template:Temporary i18n

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

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

安装

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

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

然后将 iptables 添加到 /etc/rc.conf 中的 DAEMONS 数组 以使其自动启动:

/etc/rc.conf
...

DAEMONS=(... iptables network ...)

基本概念

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

装入规则的命令:

# rc.d restart iptables

保存计数

同时还可以保存过滤的数据大小和数据包个数。编辑 /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