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

From ArchWiki
Jump to: navigation, search
(update translation)
(update translation)
Line 11: 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-05-07|255802}}
+
{{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}} systemd 服务,然后启动服务:
+
# systemctl enable iptables
+
# systemctl start iptables
+
 
+
要启用 IPv6 防火墙,需要另外启用{{ic|ip6tables}}:
+
# systemctl enable ip6tables
+
# systemctl start ip6tables
+
  
 
== 基本概念 ==
 
== 基本概念 ==
Line 72: 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
 
  # iptables-save > /etc/iptables/iptables.rules
  
最后重启服务:
+
修改配置文件后,需要重新加载服务:
  # systemctl restart iptables
+
  # systemctl reload iptables
  
 
察看运行状态:
 
察看运行状态:
Line 103: 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 114: 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 133: 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 155: 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

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。

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