特殊:Badtitle/NS100:IptablesHowTo/zh:修订间差异

来自Ubuntu中文
跳到导航跳到搜索
Delphis留言 | 贡献
无编辑摘要
Delphis留言 | 贡献
 
(未显示同一用户的13个中间版本)
第1行: 第1行:
1.简介
*1 Iptables基础  如何在Ubuntu Server版上实施iptables
**1.1 基本命令
**1.2 允许建立会话
**1.3 在指定端口上允许入站流量
**1.4 阻断流量
**1.5 编辑iptables
**1.6 日志记录
**1.7 保存iptables
**1.8 配置启动时自动加载规则
**1.9 提示
***1.9.1 如果你在一个已有规则上手动编辑iptables
***1.9.2 使用iptables-save/restore来测试规则
***1.9.3 更详细的日志记录
***1.9.4 禁用防火墙
**1.10 通过GUI界面程序简单配置
**1.11 更多信息
**1.12 致谢


2.什么是iptables?


3.下载和安装iptables包


4.怎样启动iptables
==Iptables基础  如何在Ubuntu Server版上实施iptables==


5.检查iptables的状态
iptables 是一个安装在Ubuntu Server上的默认防火墙。在正常的ubuntu安装过程中,iptables是被安装上了的,但是它默认允许所有的流量(不管防火墙是否是无效的)。


6.iptables中数据包的处理状态
关于iptables有价值的信息很多,但是大多都描述的很复杂。如果你想做些基本的配置,下面的 How To 很适合你。
  6.1 表14-1 防火墙处理被路由的数据包
  6.2 图14-1 iptables 中数据包的流程图


7.目标与跳转
===基本命令===
  7.1 表14-2 最常用的目标的描述


8.重要的iptables命令转换操作
键入:
  8.1 表14-2 概述iptables状态标准
<pre><nowiki>
  8.2 表14-4 普通 TCP 和 UDP 状态标准
# iptables -L
  8.3 表14-5 普通 ICMP(ping) 状态标准
</nowiki></pre>
  8.4 表14-6 普通扩展状态标准
列出您当前iptables中在规则。如果您是刚刚建立您的服务器,那么可能此时还没有任何规则,而且您应该看到如下:
<pre><nowiki>
Chain INPUT (policy ACCEPT)
target    prot opt source              destination


9.使用用户自定义链
Chain FORWARD (policy ACCEPT)
  9.1 表14.7 自定义队列例子列表
target    prot opt source              destination


10. 保存您的iptables脚本
Chain OUTPUT (policy ACCEPT)
target    prot opt source              destination
</nowiki></pre>


11.Fedora 的iptables规则生成器
===允许建立会话===
我们可以允许建立会话来接受流量:
<pre><nowiki>
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
</nowiki></pre>


12.恢复一个丢失的iptables脚本


13.加载iptables所需要的内核模块
===在指定端口上允许入站流量===
阻断所有流量您也可以启动系统,但是您可能正在通过SSH工作,所有在您阻断其他流量前有必要允许SSH流量。


14.iptables脚本例子
为了在22端口号(默认的SSH端口)上的允许流量入站,您可以告诉iptables允许您的网卡接受所有的目的端口为22的TCP流量。
  14.1 基本的的操作系统防御
<pre><nowiki>
  14.2 高级iptables初始化
# iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT
  14.3 允许DNS解析通过您的防火墙
</nowiki></pre>
  14.4 允许WWW和SSH服务通过您的防火墙
特别的,这将向表中追加(-A)INPUT规则,允许目的端口号为SSH的所有流量进入接口(-i) eth0,以便iptables完成跳转(-j)或动作:ACCEPT
  14.5 允许您通过防火墙访问Internet
  14.6 允许您的家庭网络通过防火墙
  14.7 伪装(多对一的NAT)
  14.8 端口转发型的NAT(DHCP DSL)
  14.9 静态NAT


15.iptables排错
让我们核对下这些规则:(这里仅显示了少数行,您应该看到更多)
  15.1 检查防火墙日志
<pre><nowiki>
  15.2 iptables停止工作
# iptables -L
Chain INPUT (policy ACCEPT)
target    prot opt source              destination
ACCEPT    all  --  anywhere            anywhere            state RELATED,ESTABLISHED
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ssh
</nowiki></pre>


16.总结
现在,让我们允许所有的web流量
<pre><nowiki>
# iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT
</nowiki></pre>


检查我们现有的规则
<pre><nowiki>
# iptables -L
Chain INPUT (policy ACCEPT)
target    prot opt source              destination
ACCEPT    all  --  anywhere            anywhere            state RELATED,ESTABLISHED
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ssh
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:www
</nowiki></pre>


我们已经指定SSH和web端口为允许通过的TCP流量,但是因为我们还没阻断任何流量,所以到目前为止所有的流量仍然可以进入。




==简介==
=== 阻断流量 ===
一旦一条规则对一个包进行了匹配,其他规则不再对这个包有效。因为我们的规则首先允许SSH和WEB流量,所以只要我们阻断所有流量的规则紧跟其后,我们依然能接受我们感兴趣的流量。我们要做的仅仅是把阻断所有流量的规则放在最后,所以我们需要再次用到它。


网络安全是个首先要考虑的问题,尤其是在网站威胁越来越普遍化的今天。一种提供额外波户的手段是购置防火墙。尽管防火墙价格一直在下降,但在某些情况下,你可以花很少甚至不需要花费额外的开销通过在一台linux服务器上配置iptables来创建一个可与之媲美的防火墙。
<pre><nowiki>
# iptables -A INPUT -j DROP
# iptables -L
Chain INPUT (policy ACCEPT)
target    prot opt source              destination
ACCEPT    all  --  anywhere            anywhere            state RELATED,ESTABLISHED
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ssh
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:www
DROP      all  --  anywhere            anywhere
</nowiki></pre>


本章节将向你展示如何将一台linux服务器配置成:
因为我们刚才没有指定一个接口或一个协议,所以除了web和ssh流量外其他任何流量都会被阻断。
 
*一台防火墙,同时是你的本地web站点的mail、web、dns服务器
*一台路由器,并且利用NAT和端口转发同时保护您的本地网络和使得你的另外一个网络共享您防火墙上的公有IP地址。




=什么是iptables?=
=== 编辑 iptables ===


起初,linux上最流行的防火墙/NAT 软件包是ipchains,但它有太多缺点。为了校正这些缺点,Netfilter机构决定创建一个叫做iptables的产品,并对它做了如下改进:
到目前为止我们设置过程中唯一的问题是回环端口(loopbakc)也被阻断了。我们本可以通过指定 -i eth0 来仅仅丢弃eth0上的数据包,但我们也可以为回环端口(loopback)添加一条规则。如果我们追加这条规则,这将太晚了----因为所有的流量已经被丢弃。我们必须插入这条跪着到第4行。


*更好地整合了linux内核加载iptables特殊模块的能力,提高了速度和可靠性.
<pre><nowiki>
*所有状态包的检查。这就意味这防火墙能保持跟踪通过它的每个数据包,而且在某些情况下可以查看数据流内容来预测某些协议的下一个行为。这在支持活动的TCP和DNS以及其他许多网络服务方面是一大亮点。
# iptables -I INPUT 4 -i lo -j ACCEPT
*基于MAC地址和TCP头标志过滤数据包。这对于阻止使用畸形数据包的攻击和限制通过本地服务器到达其他网络(不用查看ip地址)尤其有效。
# iptables -L
*提供可选择不同级别的详细报告的系统日志
Chain INPUT (policy ACCEPT)
*更好的网络地址翻译(NAT)
target    prot opt source              destination
*更好的对squid类透明web代理的支持
ACCEPT    all  --  anywhere            anywhere            state RELATED,ESTABLISHED
*一定程度上防御拒绝服务(DOS)攻击
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ssh
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:www
ACCEPT    all  --  anywhere            anywhere
DROP      all  --  anywhere            anywhere
</nowiki></pre>


与可选的ipchains相比,iptables更为快速、安全,而且iptables已经成为了Redhat和Fedora Linux上的默认防火墙。
最后2行看起来几乎一样,因此我们可以让iptables列的更详细些。
<pre><nowiki>
# iptables -L -v
</nowiki></pre>


=下载和安装iptables软件包=
=== 日志记录 ===
在上面的例子中,所有的流量都不会被记录。如果您愿意在syslog中记录被丢弃的包, 下面将是最快捷的方式:
<pre><nowiki>
# iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
</nowiki></pre>
看 提示 段获得更多关于logging的ideas.


在您开始前,您必须确保iptables RPM软件包已经安装上了。(如果您需要参考的话,请看第6章,:[[Wikipedia:Installing Linux Software]])。当您搜索RPM软件包时,记得软件包经常是以软件包版本命名的,例如iptables-1.2.9-1.0.i386.rpm。


==如何启动iptables==
=== 保存 iptables ===
如果您现在要重新启动机器的话,您的iptables配置将会消失。为了不用每次重新启动时敲入这些命令,您可以保存你的配置,让它在系统启动时自动启动。你可以通过<code><nowiki>iptables-save</nowiki></code> 和<code><nowiki>iptables-restore</nowiki></code>命令来保存配置。


您可以在系统启动后通过以下命令启动、停止、重启动iptables:
  [root@bigboy tmp]# service iptables start
  [root@bigboy tmp]# service iptables stop
  [root@bigboy tmp]# service iptables restart


为了配置iptables在系统启动时自动启动,可以使用下面的chkconfig命令:
=== 配置启动时自动加载规则 ===
  [root@bigboy tmp]# chkconfig iptables on
保存您的防火墙股则到一个文件
<pre><nowiki>
# iptables-save > /etc/iptables.up.rules
</nowiki></pre>
接着修改  /etc/network/interfaces 脚本自动应用这些规则(末行是添加的)
<pre><nowiki>
auto eth0
iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.up.rules
</nowiki></pre>


==检查iptabels的状态==
你也可以准备一组规则冰并自动应用它
<pre><nowiki>
auto eth0
iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.up.rules
post-down iptables-restore < /etc/iptables.down.rules
</nowiki></pre>


  [root@bigboy tmp]# service iptables status
=== 提示 ===
  Firewall is stopped.
==== 如果你要在一个规则基础上手动编辑iptables  ====
  [root@bigboy tmp]#
下面的步骤复习了怎样建立你的防火墙规则,并假定它们相对固定(而且对于大多数人来说它们也应该是)。但是如果你要做许多研究工作,你也许想要你的iptables在你每次重启时保存一次。你可以在 /etc/network/interfaces 里添加像下面的一行:
<pre><nowiki>
pre-up iptables-restore < /etc/iptables.up.rules
post-down iptables-save > /etc/iptables.up.rules
</nowiki></pre>
"post-down iptables-save > /etc/iptables.up.rules"  此行将保存规则用于下次启动时使用。


==iptables中数据包的处理==
==== 用iptables-save/restore来测试规则 ====
iptables通过内置的序列表(队列)检查所有经过的数据包。每组队列都用于特定的包行为,而且为一个相关的包转发/过滤链控制。
如果你超出了这个指南来编辑iptables,你可能想利用iptables-save和iptables-restore来编辑和测试你的规则。你可以通过使用你喜爱的文本编辑器(此处为gedit)来打开这些规则文件来完成编辑。
<pre><nowiki>
# iptables-save > /etc/iptables.test.rules
# gedit /etc/iptables.test.rules
</nowiki></pre>
你会得到一个如下类似的文件(下面是紧接上的例子文件):
<pre><nowiki>
# Generated by iptables-save v1.3.1 on Sun Apr 23 06:19:53 2006
*filter
:INPUT ACCEPT [368:102354]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [92952:20764374]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
COMMIT
# Completed on Sun Apr 23 06:19:53 2006
</nowiki></pre>
注意到这些都是减去iptables命令的iptables语句。随意编辑这些命令、完成后保存它们。然后简单的测试下:<pre><nowiki>
# iptables-restore < /etc/iptables.test.rules
</nowiki></pre>
测试完毕后,如果你还没添加iptables-save命令 到 /etc/network/interfaces 里面,记得不要丢失了你的更改:


总共有3个表。第一个mangel表用于变更TCP头里面的bit流QOS。这引用户家庭或小型办公环境。
<pre><nowiki>
# iptables-save > /etc/iptables.up.rules
</nowiki></pre>


第二个表是过滤队列,它负责包过滤。它有3个内建的链,在这些链里面你可以设置您的防火墙策略规则。它们是:
==== 更详细的日志 ====
为了在你的syslog中获得更多细节,你可能想创建一个额外的链。下面是个很简短的例子---我的  /etc/iptables.up.rules  ,它将展示我是如何设置iptables记录到syslog中的:<pre><nowiki>
# Generated by iptables-save v1.3.1 on Sun Apr 23 05:32:09 2006
*filter
:INPUT ACCEPT [273:55355]
:FORWARD ACCEPT [0:0]
:LOGNDROP - [0:0]
:OUTPUT ACCEPT [92376:20668252]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j LOGNDROP
-A LOGNDROP -p tcp -m limit --limit 5/min -j LOG --log-prefix "Denied TCP: " --log-level 7
-A LOGNDROP -p udp -m limit --limit 5/min -j LOG --log-prefix "Denied UDP: " --log-level 7
-A LOGNDROP -p icmp -m limit --limit 5/min -j LOG --log-prefix "Denied ICMP: " --log-level 7
-A LOGNDROP -j DROP
COMMIT
# Completed on Sun Apr 23 05:32:09 2006
</nowiki></pre>
请注意 一个名为 LOGNDROP的链在文件顶部。而且,INPUT链底部标准的DROP被替换成了LOGNDROP,同时添加了协议描述so it makes sense looking at the log。最后我们在LOGNDROP链尾部丢弃了这些流量。下面的行告诉我们发生了什么:
* <code><nowiki>--limit</nowiki></code> 设置记录相同规则到syslog中的次数
* <code><nowiki>--log-prefix "Denied..."</nowiki></code> 添加一个前缀使得在syslog中查找更easy
* <code><nowiki>--log-level 7</nowiki></code> 设置syslog的消息级别 (see man syslog for more detail, but you can probably leave this)


*Forward chain(转发链):处理受防火墙保护流经服务器的数据包。
==== 禁用防火墙 ====
*Input chain(输入链):处理目的地是防火墙的数据包。
*Output chain(输出链):处理发源于防火墙的数据包。


第三个表是NAT队列,它负责网络地址翻译。它有2条内置链:
如果您要临时禁用防火墙,您可以通过下面的命令清空所偶的规则:
*Pre-routing chain:当数据包的目的地址需要转换时执行NATs转换。
<pre><nowiki>
*Post-routing chain:当数据包的源地址需要转换时执行NATs转换。
# iptables -F
</nowiki></pre>




=== 表14-1 防火墙处理被路由的数据包===
=== 轻松配置通过 GUI ===
新手可以利用 Firetarter(一个gui工具)---仓库中的可用软件(新立德或apt-get 获得)来配置她或他的iptables规则,而需要命令行知识。请查看指南,尽管...... 配置很简单,但是对于高级用户来说可能远远不能满足。然而它对于大多数的家庭用户来说是足够的...... 。(我)建议您使用firestarter在策略表中将出站配置为 “限制”,而将您需要的连接类型(如用于http的80、https的443,msn chat的1683等等)加入白名单。您也可以通过它查看进出您计算机的活动连接...... 。防火墙会一直保持下去一旦通过向导配置完毕。拨号用户必须在向导中指定它在拨号时自动启动。


<div align=center>
firestarter主页: http://www.fs-security.com/ (再次, 仓库源中可用, 不需要编译)
指南: http://www.fs-security.com/docs/tutorial.php


<table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0
个人笔记:不幸运的是,它没有阻断(或询问用户)特定应用/程序的选项......。因此,我的理解是一旦启用了80端口(例如,用于访问网页),那么任何程序都可以通过80端口连接任何服务器、做任何它想做的事......
style='border-collapse:collapse;border:none'>
  <tr>
  <td valign=top style='border:solid windowtext 1.0pt;background:green;
  padding:.05in .05in .05in .05in'>


  <p class=MsoNormal align=center style='text-align:center'><b><span
  style='color:white'>Queue</span></b></p>
  <p class=MsoNormal align=center style='text-align:center'><b><span
  style='color:white'>Type</span></b></p>
  </td>
  <td width=147 valign=top style='width:88.35pt;border:solid windowtext 1.0pt;
  border-left:none;background:green;padding:.05in .05in .05in .05in'>
  <p class=MsoNormal align=center style='text-align:center'><b><span
  style='color:white'>Queue</span></b></p>
  <p class=MsoNormal align=center style='text-align:center'><b><span
  style='color:white'>Function</span></b></p>
  </td>


  <td width=147 valign=top style='width:88.35pt;border:solid windowtext 1.0pt;
=== 更多信息 ===
  border-left:none;background:green;padding:.05in .05in .05in .05in'>
[http://iptables-tutorial.frozentux.net/iptables-tutorial.html Iptables Tutorial]
  <p class=MsoNormal align=center style='text-align:center'><b><span
  style='color:white'>Packet transformation chain in Queue</span></b></p>
  </td>
  <td width=314 valign=top style='width:188.65pt;border:solid windowtext 1.0pt;
  border-left:none;background:green;padding:.05in .05in .05in .05in'>
  <p class=MsoNormal align=center style='text-align:center'><b><span
  style='color:white'>Chain Function</span></b></p>
  </td>
  </tr>
<tr>
  <td valign=top style='border-top:none;border-left:solid windowtext 1.0pt;
  border-bottom:none;border-right:solid windowtext 1.0pt;padding:.05in .05in .05in .05in'>
  <p class=MsoNormal align=center style='text-align:center'>Filter</p>
  </td>
  <td width=147 valign=top style='width:88.35pt;border:none;border-right:solid windowtext 1.0pt;
  padding:.05in .05in .05in .05in'>
  <p class=MsoNormal>Packet filtering</p>
  </td>
  <td width=147 valign=top style='width:88.35pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>


  <p class=MsoNormal align=center style='text-align:center'>FORWARD</p>
[http://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html Iptables How To]
  </td>
  <td width=314 valign=top style='width:188.65pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal>Filters packets to servers accessible by another NIC on
  the firewall.</p>
  </td>
</tr>
<tr>
  <td valign=top style='border-top:none;border-left:solid windowtext 1.0pt;
  border-bottom:none;border-right:solid windowtext 1.0pt;padding:.05in .05in .05in .05in'>


  <p class=MsoNormal align=center style='text-align:center'>&nbsp;</p>
[http://www.netfilter.org/documentation/ Netfilter and Iptables Multilingual Documentation]
  </td>
  <td width=147 valign=top style='width:88.35pt;border:none;border-right:solid windowtext 1.0pt;
  padding:.05in .05in .05in .05in'>
  <p class=MsoNormal>&nbsp;</p>
  </td>
  <td width=147 valign=top style='width:88.35pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal align=center style='text-align:center'>INPUT</p>
  </td>


  <td width=314 valign=top style='width:188.65pt;border-top:none;border-left:
[http://easyfwgen.morizot.net/gen/ Easy Firewall Generator for IPTables]
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal>Filters packets destined to the firewall.</p>
  </td>
</tr>
<tr>
  <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
  padding:.05in .05in .05in .05in'>
  <p class=MsoNormal align=center style='text-align:center'>&nbsp;</p>
  </td>


  <td width=147 valign=top style='width:88.35pt;border-top:none;border-left:
=== 致谢 ===
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
感谢 Rusty Russell 和他的 How-To,因为本文很多内容都是基于此。
  padding:.05in .05in .05in .05in'>
----
  <p class=MsoNormal>&nbsp;</p>
[[category:CategorySecurity]] [[category:CategoryCleanup]]
  </td>
  <td width=147 valign=top style='width:88.35pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal align=center style='text-align:center'>OUTPUT</p>
  </td>
  <td width=314 valign=top style='width:188.65pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal>Filters packets originating from the firewall</p>


  </td>
[[category:UbuntuHelp]]
</tr>
<tr>
  <td valign=top style='border-top:none;border-left:solid windowtext 1.0pt;
  border-bottom:none;border-right:solid windowtext 1.0pt;padding:.05in .05in .05in .05in'>
  <p class=MsoNormal align=center style='text-align:center'>Nat</p>
  </td>
  <td width=147 valign=top style='width:88.35pt;border:none;border-right:solid windowtext 1.0pt;
  padding:.05in .05in .05in .05in'>
  <p class=MsoNormal>Network Address Translation</p>
 
  </td>
  <td width=147 valign=top style='width:88.35pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal align=center style='text-align:center'>PREROUTING</p>
  </td>
  <td width=314 valign=top style='width:188.65pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal>Address translation occurs before routing. Facilitates the
  transformation of the destination IP address to be compatible with the
  firewall's routing table. Used with NAT of the destination IP address, also
  known as <b>destination NAT</b> or <b>DNAT</b>.</p>
 
  </td>
</tr>
<tr>
  <td valign=top style='border-top:none;border-left:solid windowtext 1.0pt;
  border-bottom:none;border-right:solid windowtext 1.0pt;padding:.05in .05in .05in .05in'>
  <p class=MsoNormal align=center style='text-align:center'>&nbsp;</p>
  </td>
  <td width=147 valign=top style='width:88.35pt;border:none;border-right:solid windowtext 1.0pt;
  padding:.05in .05in .05in .05in'>
  <p class=MsoNormal>&nbsp;</p>
  </td>
 
  <td width=147 valign=top style='width:88.35pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal align=center style='text-align:center'>POSTROUTING</p>
  </td>
  <td width=314 valign=top style='width:188.65pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal>Address translation occurs after routing. This implies
  that there was no need to modify the destination IP address of the packet as
  in pre-routing. Used with NAT of the source IP address using either one-to-one
  or many-to-one NAT. This is known as <b>source NAT</b>, or <b>SNAT</b>.</p>
  </td>
 
</tr>
<tr>
  <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
  padding:.05in .05in .05in .05in'>
  <p class=MsoNormal align=center style='text-align:center'>&nbsp;</p>
  </td>
  <td width=147 valign=top style='width:88.35pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:.05in .05in .05in .05in'>
  <p class=MsoNormal>&nbsp;</p>
  </td>
  <td width=147 valign=top style='width:88.35pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
 
  <p class=MsoNormal align=center style='text-align:center'>OUTPUT</p>
  </td>
  <td width=314 valign=top style='width:188.65pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal>Network address translation for packets generated by the
  firewall. (Rarely used in SOHO environments)</p>
  </td>
</tr>
<tr>
  <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
  padding:.05in .05in .05in .05in'>
 
  <p class=MsoNormal align=center style='text-align:center'>Mangle</p>
  </td>
  <td width=147 valign=top style='width:88.35pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:.05in .05in .05in .05in'>
  <p class=MsoNormal>TCP header modification</p>
  </td>
  <td width=147 valign=top style='width:88.35pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal align=center style='text-align:center'>PREROUTING
  POSTROUTING OUTPUT INPUT FORWARD</p>
 
  </td>
  <td width=314 valign=top style='width:188.65pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:7.5pt 7.5pt 7.5pt 7.5pt'>
  <p class=MsoNormal>Modification of the TCP packet quality of service bits
  before routing occurs</p>
  <p class=MsoNormal>(Rarely used in SOHO environments)</p>
  </td>
</tr>
</table>
 
</div>
 
您必须为您创建的每个防火墙规则指定表和链。有个例外:大多数的规则都是过滤,所以iptables假定没有定义表的链都属于filter表。因此filter表是默认的表。
 
为了是这更清楚,请查看下包在iptables被处理的方式。在图14.1中,一个来自Internet的TCP包到达网络A上防火墙的接口来创建个数据连接。
 
 
这个包首先被您规则中的mangle表中的PREROUTING链检测。接着被nat表中的PREROUTING链的规则检测,看是否包需要做DNAT(目标地址转换)。然后才被路由。
 
如果这个数据包流向一个受保护的网络,它会被防火墙fileter表中的FORWARE链中的规则过滤下来,如果有必要,这个包在到达网络B前会在POSTROUTIN链中做SNAT。当目的服务器发出响应,包要经过同样的一系列步骤。mangle表中的FORWARD和POSTROUTING链可能都会被配置来执行QOS,但在SOHO环境里通常不被配置。
 
 
如果包是流向防火墙自身,那么它在被filter表的INPUT链规则过滤前先通过INPUT链的mangle表(如果配置过)。如果成功通过了这些测试,它就可以被防火墙上的内部应用程序处理。
 
在某些时候防火墙需要对外响应。如果需要的话,这个响应会被mangle表中的output链规则路由和检测。接着,nat表中的OUTPUT链会决定需要做DNAT,而且filter表中的OUTPUT链规检查包来帮助约束未授权的包。最后,在包被送回Internet前,POSTROUTING链完成SNAT和OoS mangling 。

2007年7月31日 (二) 22:11的最新版本

  • 1 Iptables基础 如何在Ubuntu Server版上实施iptables
    • 1.1 基本命令
    • 1.2 允许建立会话
    • 1.3 在指定端口上允许入站流量
    • 1.4 阻断流量
    • 1.5 编辑iptables
    • 1.6 日志记录
    • 1.7 保存iptables
    • 1.8 配置启动时自动加载规则
    • 1.9 提示
      • 1.9.1 如果你在一个已有规则上手动编辑iptables
      • 1.9.2 使用iptables-save/restore来测试规则
      • 1.9.3 更详细的日志记录
      • 1.9.4 禁用防火墙
    • 1.10 通过GUI界面程序简单配置
    • 1.11 更多信息
    • 1.12 致谢


Iptables基础 如何在Ubuntu Server版上实施iptables

iptables 是一个安装在Ubuntu Server上的默认防火墙。在正常的ubuntu安装过程中,iptables是被安装上了的,但是它默认允许所有的流量(不管防火墙是否是无效的)。

关于iptables有价值的信息很多,但是大多都描述的很复杂。如果你想做些基本的配置,下面的 How To 很适合你。

基本命令

键入:

# iptables -L

列出您当前iptables中在规则。如果您是刚刚建立您的服务器,那么可能此时还没有任何规则,而且您应该看到如下:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

允许建立会话

我们可以允许建立会话来接受流量:

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


在指定端口上允许入站流量

阻断所有流量您也可以启动系统,但是您可能正在通过SSH工作,所有在您阻断其他流量前有必要允许SSH流量。

为了在22端口号(默认的SSH端口)上的允许流量入站,您可以告诉iptables允许您的网卡接受所有的目的端口为22的TCP流量。

# iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT

特别的,这将向表中追加(-A)INPUT规则,允许目的端口号为SSH的所有流量进入接口(-i) eth0,以便iptables完成跳转(-j)或动作:ACCEPT

让我们核对下这些规则:(这里仅显示了少数行,您应该看到更多)

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh

现在,让我们允许所有的web流量

# iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT

检查我们现有的规则

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www

我们已经指定SSH和web端口为允许通过的TCP流量,但是因为我们还没阻断任何流量,所以到目前为止所有的流量仍然可以进入。


阻断流量

一旦一条规则对一个包进行了匹配,其他规则不再对这个包有效。因为我们的规则首先允许SSH和WEB流量,所以只要我们阻断所有流量的规则紧跟其后,我们依然能接受我们感兴趣的流量。我们要做的仅仅是把阻断所有流量的规则放在最后,所以我们需要再次用到它。

# iptables -A INPUT -j DROP
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
DROP       all  --  anywhere             anywhere

因为我们刚才没有指定一个接口或一个协议,所以除了web和ssh流量外其他任何流量都会被阻断。


编辑 iptables

到目前为止我们设置过程中唯一的问题是回环端口(loopbakc)也被阻断了。我们本可以通过指定 -i eth0 来仅仅丢弃eth0上的数据包,但我们也可以为回环端口(loopback)添加一条规则。如果我们追加这条规则,这将太晚了----因为所有的流量已经被丢弃。我们必须插入这条跪着到第4行。

# iptables -I INPUT 4 -i lo -j ACCEPT
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere

最后2行看起来几乎一样,因此我们可以让iptables列的更详细些。

# iptables -L -v

日志记录

在上面的例子中,所有的流量都不会被记录。如果您愿意在syslog中记录被丢弃的包, 下面将是最快捷的方式:

# iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

看 提示 段获得更多关于logging的ideas.


保存 iptables

如果您现在要重新启动机器的话,您的iptables配置将会消失。为了不用每次重新启动时敲入这些命令,您可以保存你的配置,让它在系统启动时自动启动。你可以通过iptables-saveiptables-restore命令来保存配置。


配置启动时自动加载规则

保存您的防火墙股则到一个文件

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

接着修改 /etc/network/interfaces 脚本自动应用这些规则(末行是添加的)

auto eth0
iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.up.rules

你也可以准备一组规则冰并自动应用它

auto eth0
iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.up.rules
post-down iptables-restore < /etc/iptables.down.rules

提示

如果你要在一个规则基础上手动编辑iptables

下面的步骤复习了怎样建立你的防火墙规则,并假定它们相对固定(而且对于大多数人来说它们也应该是)。但是如果你要做许多研究工作,你也许想要你的iptables在你每次重启时保存一次。你可以在 /etc/network/interfaces 里添加像下面的一行:

pre-up iptables-restore < /etc/iptables.up.rules
post-down iptables-save > /etc/iptables.up.rules

"post-down iptables-save > /etc/iptables.up.rules" 此行将保存规则用于下次启动时使用。

用iptables-save/restore来测试规则

如果你超出了这个指南来编辑iptables,你可能想利用iptables-save和iptables-restore来编辑和测试你的规则。你可以通过使用你喜爱的文本编辑器(此处为gedit)来打开这些规则文件来完成编辑。

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

你会得到一个如下类似的文件(下面是紧接上的例子文件):

# Generated by iptables-save v1.3.1 on Sun Apr 23 06:19:53 2006
*filter
:INPUT ACCEPT [368:102354]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [92952:20764374]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
COMMIT
# Completed on Sun Apr 23 06:19:53 2006

注意到这些都是减去iptables命令的iptables语句。随意编辑这些命令、完成后保存它们。然后简单的测试下:

# iptables-restore < /etc/iptables.test.rules

测试完毕后,如果你还没添加iptables-save命令 到 /etc/network/interfaces 里面,记得不要丢失了你的更改:

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

更详细的日志

为了在你的syslog中获得更多细节,你可能想创建一个额外的链。下面是个很简短的例子---我的 /etc/iptables.up.rules ,它将展示我是如何设置iptables记录到syslog中的:

# Generated by iptables-save v1.3.1 on Sun Apr 23 05:32:09 2006
*filter
:INPUT ACCEPT [273:55355]
:FORWARD ACCEPT [0:0]
:LOGNDROP - [0:0]
:OUTPUT ACCEPT [92376:20668252]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j LOGNDROP
-A LOGNDROP -p tcp -m limit --limit 5/min -j LOG --log-prefix "Denied TCP: " --log-level 7
-A LOGNDROP -p udp -m limit --limit 5/min -j LOG --log-prefix "Denied UDP: " --log-level 7
-A LOGNDROP -p icmp -m limit --limit 5/min -j LOG --log-prefix "Denied ICMP: " --log-level 7
-A LOGNDROP -j DROP
COMMIT
# Completed on Sun Apr 23 05:32:09 2006

请注意 一个名为 LOGNDROP的链在文件顶部。而且,INPUT链底部标准的DROP被替换成了LOGNDROP,同时添加了协议描述so it makes sense looking at the log。最后我们在LOGNDROP链尾部丢弃了这些流量。下面的行告诉我们发生了什么:

  • --limit 设置记录相同规则到syslog中的次数
  • --log-prefix "Denied..." 添加一个前缀使得在syslog中查找更easy
  • --log-level 7 设置syslog的消息级别 (see man syslog for more detail, but you can probably leave this)

禁用防火墙

如果您要临时禁用防火墙,您可以通过下面的命令清空所偶的规则:

# iptables -F


轻松配置通过 GUI

新手可以利用 Firetarter(一个gui工具)---仓库中的可用软件(新立德或apt-get 获得)来配置她或他的iptables规则,而需要命令行知识。请查看指南,尽管...... 配置很简单,但是对于高级用户来说可能远远不能满足。然而它对于大多数的家庭用户来说是足够的...... 。(我)建议您使用firestarter在策略表中将出站配置为 “限制”,而将您需要的连接类型(如用于http的80、https的443,msn chat的1683等等)加入白名单。您也可以通过它查看进出您计算机的活动连接...... 。防火墙会一直保持下去一旦通过向导配置完毕。拨号用户必须在向导中指定它在拨号时自动启动。

firestarter主页: http://www.fs-security.com/ (再次, 仓库源中可用, 不需要编译) 指南: http://www.fs-security.com/docs/tutorial.php

个人笔记:不幸运的是,它没有阻断(或询问用户)特定应用/程序的选项......。因此,我的理解是一旦启用了80端口(例如,用于访问网页),那么任何程序都可以通过80端口连接任何服务器、做任何它想做的事......


更多信息

Iptables Tutorial

Iptables How To

Netfilter and Iptables Multilingual Documentation

Easy Firewall Generator for IPTables

致谢

感谢 Rusty Russell 和他的 How-To,因为本文很多内容都是基于此。