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

From ArchWiki
Jump to: navigation, search
m (安装)
(update translation)
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
[[Category:简体中文]]
+
[[Category:Firewalls (简体中文)]]
[[Category:Security (简体中文)]]
+
[[en:Iptables]]
[[Category:Networking (简体中文)]]
+
[[es:Iptables]]
{{i18n|Iptables}}
+
[[it:Iptables]]
 
+
[[ru:Iptables]]
 +
[[sr:Iptables]]
 
{{Article summary start}}
 
{{Article summary start}}
 
{{Article summary text|建立和配置 iptables 的信息。}}
 
{{Article summary text|建立和配置 iptables 的信息。}}
Line 10: Line 11:
 
{{Article summary wiki|Sysctl#TCP/IP stack hardening}}
 
{{Article summary wiki|Sysctl#TCP/IP stack hardening}}
 
{{Article summary end}}
 
{{Article summary end}}
 
+
{{TranslationStatus (简体中文)|Iptables|2013-07-19|266924}}
iptables 是一个 Linux 内核中的强大 [[firewall (简体中文)|防火墙]],是 [[Wikipedia:Netfilter|netfilter]] 项目的一部分。可以直接配置,也可以通过许多 [[Firewalls#iptables_front-ends|前端]] 和 [[Firewall#iptables_GUIs|图形]]界面配置。iptables 用于 [[Wikipedia:Ipv4|ipv4]] ip6tables 用于 [[Wikipedia:Ipv6|ipv6]]。
+
iptables 是一个 Linux 内核中的强大 [[firewall|防火墙]],是 [[Wikipedia:Netfilter|netfilter]] 项目的一部分。可以直接配置,也可以通过许多 [[Firewalls#iptables_front-ends|前端]] 和 [[Firewall#iptables_GUIs|图形]]界面配置。iptables 用于 [[Wikipedia:Ipv4|ipv4]] ip6tables 用于 [[Wikipedia:Ipv6|ipv6]]。
  
 
== 安装 ==
 
== 安装 ==
  
{{注意|内核需要编译进去 iptables 支持,所有 Arch Linux 官方内核都有此功能。}}
+
Arch Linux 官方内核已经编译进了 iptables 支持,只需要安装 [[pacman (简体中文)|安装]] [[Official Repositories (简体中文)|官方软件源]] 中的 {{Pkg|iptables}} 用户空间工具。
 
+
首先,[[pacman (简体中文)|安装]] [[Official Repositories (简体中文)|官方软件源]] 中的 {{Pkg|iptables}} 用户工具。
+
 
+
然后将 {{ic|iptables}} 添加到 {{ic|/etc/[[rc.conf]]}} 中的 [[daemon|DAEMONS 数组]] 以使其自动启动:
+
 
+
{{hc|/etc/rc.conf|2=
+
...
+
 
+
DAEMONS=(... '''iptables''' network ...)
+
}}
+
  
 
== 基本概念 ==
 
== 基本概念 ==
Line 71: Line 62:
 
=== 配置文件 ===
 
=== 配置文件 ===
  
{{ic|/etc/conf.d/iptables}} 指向了具体规则集配置文件。守护进程启动时会装入规则集。
+
Iptables 配置规则位于 {{ic|/etc/iptables/iptables.rules}}, {{ic|iptables.service}}服务会使用这个规则:
  
{{hc|/etc/conf.d/iptables|2=# Configuration for iptables rules
+
启动服务:
IPTABLES_CONF=/etc/iptables/iptables.rules
+
# systemctl enable iptables.service
IP6TABLES_CONF=/etc/iptables/ip6tables.rules
+
# systemctl start iptables.service
  
# Enable IP forwarding (both IPv4 and IPv6)
+
ipv6 规则默认保存在{{ic|/etc/iptables/ip6tables.rules}},{{ic|ip6tables.service}}服务会使用这个规则,可以用类似的方式启动服务。
# 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}}
+
  
保存当前规则的命令:
+
用命令行,修改规则后,可以通过如下命令行保存规则:
 +
# iptables-save > /etc/iptables/iptables.rules
  
  # rc.d save iptables
+
修改配置文件后,需要重新加载服务:
 +
  # systemctl reload iptables
  
装入规则的命令:
+
察看运行状态:
 
+
  $ systemctl status iptables
  # rc.d restart iptables
+
 
+
=== 保存计数 ===
+
 
+
同时还可以保存过滤的数据大小和数据包个数。编辑 {{ic|/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
+
然后保存文件
+
  
 
=== 指南 ===
 
=== 指南 ===
Line 119: Line 86:
 
== 日志 ==
 
== 日志 ==
  
LOG 目标可以用来记录匹配某个规则的数据包。和 ACCEPT 或 DROP 规则不同,进入 LOG 目标之后数据包会继续沿着链向下走。所以要记录所有丢弃的数据包,只需要在 DROP 规则前加上相应的 LOG 规则。但是这样会比较复杂,影响效率,所以应该创建一个 LOGDROP 链。
+
LOG 目标可以用来记录匹配某个规则的数据包。和 ACCEPT 或 DROP 规则不同,进入 LOG 目标之后数据包会继续沿着链向下走。所以要记录所有丢弃的数据包,只需要在 DROP 规则前加上相应的 LOG 规则。但是这样会比较复杂,影响效率,所以应该创建一个{{ic|logdrop}}链。
 +
 
 +
创建 logdrop 链:
 +
# iptables -N logdrop
  
 +
定义规则:
 
  ## /etc/iptables/iptables.rules
 
  ## /etc/iptables/iptables.rules
 
   
 
   
Line 130: Line 101:
 
  ... 其它链 ..
 
  ... 其它链 ..
 
   
 
   
  ## LOGDROP chain
+
  ## logdrop chain
  :LOGDROP - [0:0]
+
  :logdrop - [0:0]
 
   
 
   
  -A LOGDROP -m limit --limit 5/m --limit-burst 10 -j LOG
+
  -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG
  -A LOGDROP -j DROP
+
  -A logdrop -j DROP
 
   
 
   
 
  ... 规则 ...
 
  ... 规则 ...
 
   
 
   
 
  ## log AND drop packets that hit this rule:
 
  ## log AND drop packets that hit this rule:
  -A INPUT -m state --state INVALID -j LOGDROP
+
  -A INPUT -m state --state INVALID -j logdrop
 
   
 
   
 
  ... 更多规则 ...
 
  ... 更多规则 ...
Line 149: Line 120:
 
'''-m limit''' 可以调用 limit 模块,然后使用 --limit 设置平均速率,--limit-burst 设置初始迸发速率。例如:
 
'''-m limit''' 可以调用 limit 模块,然后使用 --limit 设置平均速率,--limit-burst 设置初始迸发速率。例如:
  
  -A LOGDROP -m limit --limit 5/m --limit-burst 10 -j LOG
+
  -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG
  
这将在 LOGDROP 链上加上规则,记录最开始的十个包,然后每分钟仅记录 5 个包。只要没有突破"limit rate","limit burst" 将会重置为 1。
+
这将在 logdrop 链上加上规则,记录最开始的十个包,然后每分钟仅记录 5 个包。只要没有突破"limit rate","limit burst" 将会重置为 1。
  
 
=== syslog-ng ===
 
=== syslog-ng ===
Line 171: Line 142:
 
== 参见 ==
 
== 参见 ==
 
{{Wikipedia|iptables}}
 
{{Wikipedia|iptables}}
 +
* [[Simple Stateful Firewall]]
 
* [http://www.netfilter.org/projects/iptables/index.html 官方网站]
 
* [http://www.netfilter.org/projects/iptables/index.html 官方网站]
 
* [http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html Iptables 教程 1.2.2]
 
* [http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html Iptables 教程 1.2.2]

Revision as of 10:17, 19 July 2013

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-07-19,点击这里可以查看翻译后英文页面的改动。

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

安装

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

基本概念

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

配置文件

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

指南

日志

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] 源。

参见

Template:Wikipedia