⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iptables 指南 1_1_19.htm

📁 这是我对防火墙技术的一些见解
💻 HTM
📖 第 1 页 / 共 5 页
字号:
</I></A>下载,网站中的FAQs也是很好的教程。<B class=COMMAND>iptables</B> 也使用一些内核空间,可以在用<B 
class=COMMAND>make configure</B>配置内核的过程中配置,下面会介绍必要的步骤。</P></DIV>
<DIV class=SECTION>
<HR>

<H1 class=SECTION><A name=KERNELSETUP>2.2. 内核配置 </A></H1>
<P>为了运行<B class=COMMAND>iptables</B>,需要在内核配置期间,选择以下一些选项,不管你用<B 
class=COMMAND>make config</B>或其他命令。 </P>
<P><TT class=COMPUTEROUTPUT>CONFIG_PACKET</TT> - 
允许程序直接访问网络设备(译者注:最常用的就是网卡了),象tcpdump 和 snort就要使用这个功能。</P>
<DIV class=NOTE>
<P></P>
<TABLE class=NOTE width="100%" border=0>
  <TBODY>
  <TR>
    <TD vAlign=top align=middle width=25><IMG alt=Note hspace=5 
      src="Iptables 指南 1_1_19.files/note.gif"></TD>
    <TD vAlign=top align=left>
      <P>严格地说,iptables并不需要CONFIG_PACKET,但是它有很多用处(译者注:其他程序需要),所以就选上了。当然,你不想要,不选就是了。(译者注:建议还是选的为好)</P></TD></TR></TBODY></TABLE></DIV>
<P><TT class=COMPUTEROUTPUT>CONFIG_NETFILTER</TT> - 
允许计算机作为网关或防火墙。这个是必需的,因为整篇文章都要用到这个功能。我想你也需要这个,谁叫你学iptables呢:)</P>
<P>当然,你要给网络设备安装正确的驱动程序,比如,Ethernet 网卡, <I>PPP </I>还有 <I>SLIP</I> 。 
上面的选项,只是在内核中建立了一个框架, 
iptables确实已经可以运行,但不能做任何实质性的工作。我们需要更多的选项。以下给出内核2.4.9的选项和简单的说明:</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_CONNTRACK</TT> - 连接跟踪模块,用于 
<I>NAT(网络地址转换)</I> 和 
<I>Masquerading(ip地址伪装)</I>,当然,还有其他应用。如果你想把<I>LAN</I>中的一台机子作为防火墙,这个模块你算选对了。脚本<A 
href="http://1842.net/iptables/iptables-tutorial%201-1-19.html#RCFIREWALLTXT"><I>rc.firewall.txt</I></A> 
要想正常工作,就必需有它的存在。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_FTP</TT> - 
这个选项提供针对FTP连接进行连接跟踪的功能。一般情况下,对FTP连接进行连接跟踪是很困难的,要做到这一点,需要一个名为helper的动态链接库。此选项就是用来编译helper的。如果没有这个功能,就无法穿越防火墙或网关使用FTP。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_IPTABLES</TT> - 
有了它,你才能使用过滤、伪装、NAT。它为内核加入了iptables标识框架。没有它,iptables毫无作用。 </P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_MATCH_LIMIT</TT> - 此模块并不是十分必要,但我在例子<A 
href="http://1842.net/iptables/iptables-tutorial%201-1-19.html#RCFIREWALLTXT"><I>rc.firewall.txt</I></A>中用到了。它提供匹配LIMIT的功能,以便于使用一个适当的规则来控制每分钟要匹配的数据包的数量。比如, 
<B class=COMMAND>-m limit --limit 3/minute</B> 
的作用是每分钟最多匹配三个数据包。这个功能也可用来消除某种DoS攻击。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_MATCH_MAC</TT> - 
选择这个模块,可以根据MAC地址匹配数据包。例如,我们想要阻塞使用了某些MAC地址的数据包,或阻塞某些计算机的通信,用这个很容易。因为每个Ethernet网卡都有它自己的MAC地址,且几乎从不会改变。但我在<A 
href="http://1842.net/iptables/iptables-tutorial%201-1-19.html#RCFIREWALLTXT"><I> 
rc.firewall.txt</I></A>中没有用到这个功能,其他例子也未用到。(译者注:这又一次说明了学习是为将来打基础:) ) </P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_MATCH_MARK</TT> - 这个选项用来标记数据包。对数据包做 
MARK(标记)操作,我们就可以在后面的表中用这个标记来匹配数据包。后文有详细的说明。 </P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_MATCH_MULTIPORT</TT> - 
选择这个模块我们可以使用端口范围来匹配数据包,没有它,是无法做到这一点的。 </P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_MATCH_TOS</TT> - 使我们可以设置数据包的TOS(Type Of 
Service 服务类型)。这个工作也可以用命令ip/tc完成,还可在mangle表中用某种规则设定。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_MATCH_TCPMSS</TT> - 
可以基于MSS匹配TCP数据包。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_MATCH_STATE</TT> - 相比较<B 
class=COMMAND>ipchains 
</B>这是最大的更新,有了它,我们可以对数据包做状态匹配。比如,在某个TCP连接的两个方向上已有通信,则这个连接上的数据包就被看作<B 
class=COMMAND>ESTABLISHED</B>(已建立连接)状态。在<A 
href="http://1842.net/iptables/iptables-tutorial%201-1-19.html#RCFIREWALLTXT"><I>rc.firewall.txt</I></A> 
里大量使用了此模块的功能。 </P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_MATCH_UNCLEAN</TT> - 匹配那些不符合类型标准或无效的 
P、TCP、UDP、ICMP数据包(译者注:之所以此模块名为UNCLEAN,可以这样理解,凡不是正确模式的包都是脏的。这有些象操作系统内存管理中的“脏页”,那这里就可以称作“脏包”了,自然也就UNCLEAN了)。我们一般丢弃这样的包,但不知这样做是否正确。另外要注意,这种匹配功能还在实验阶段,可能会有些问题。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_MATCH_OWNER</TT> - 
根据套接字的拥有者匹配数据包。比如,我们只允许root访问Internet。在<B 
class=COMMAND>iptables</B>中,这个模块最初只是用一个例子来说明它的功能。同样,这个模块也处于实验阶段,还无法使用。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_FILTER</TT> - 
这个模块为iptables添加基本的过滤表,其中包含INPUT、FORWARD、OUTPUT链。通过过滤表可以做完全的IP过滤。只要想过滤数据包,不管是接收的还是发送的,也不管做何种过滤,都必需此模块。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_TARGET_REJECT</TT> - 
这个操作使我们用ICMP错误信息来回应接收到的数据包,而不是简单地丢弃它。有些情况必须要有回应的,比如,相对于ICMP和UDP来说,要重置或拒绝TCP连接总是需要一个TCP 
RST包。 </P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_TARGET_MIRROR</TT> - 
这个操作使数据包返回到发送它的计算机。例如,我们在INPUT链里对目的端口为HTTP的包设置了MIRROR操作,当有人访问HTTP时,包就被发送回原计算机,最后,他访问的可能是他自己的主页。(译者注:应该不难理解为什么叫做MIRROR了)</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_NAT</TT> - 
顾名思义,本模块提供NAT功能。这个选项使我们有权访问nat表。端口转发和伪装是必需此模块的。当然,如果你的LAN里的所有计算机都有唯一的有效的 
IP地址,那在做防火墙或伪装时就无须这个选项了。<A 
href="http://1842.net/iptables/iptables-tutorial%201-1-19.html#RCFIREWALLTXT"><I>rc.firewall.txt</I> 
</A>是需要的:)</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_TARGET_MASQUERADE</TT> - 
提供MASQUERADE(伪装)操作。如果我们不知道连接Internet的IP,首选的方法就是使用MASQUERADE,而不是DNAT或SNAT。换句话说,就是如果我们使用PPP或SLIP等连入Internet,由DHCP或其他服务分配IP,使用这个比SNAT好。因为MASQUERADE 
不需要预先知道连接Internet的IP,虽然对于计算机来说MASQUERADE要比NAT的负载稍微高一点。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_TARGET_REDIRECT</TT> - 
这个操作和代理程序一起使用是很有用的。它不会让数据包直接通过,而是把包重新映射到本地主机,也就是完成透明代理。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_TARGET_LOG</TT> - 为<B 
class=COMMAND>iptables</B>增加 <B 
class=COMMAND>LOG</B>(日志)操作。通过它,可以使用系统日志服务记录某些数据包,这样我们就能了解在包上发生了什么。这对于我们做安全审查、调试脚本的帮助是无价的。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_TARGET_TCPMSS</TT> - 
这个选项可以对付一些阻塞ICMP分段信息的ISP(服务提供商)或服务。没有ICMP分段信息,一些网页、大邮件无法通过,虽然小邮件可以,还有,在握手完成之后,ssh可以但scp不能工作。我们可以用TCPMSS解决这个问题,就是使MSS(Maximum 
Segment Size)被钳制于PMTU(Path Maximum Transmit 
Unit)。这个方法可以处理被Netfilter开发者们在内核配置帮助中称作“criminally brain-dead ISPs or 
servers”的问题。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_COMPAT_IPCHAINS</TT> - <B 
class=COMMAND>ipchains</B> 的,这只是为内核从2.2转换到2.4而使用的,它会在2.6中删除。</P>
<P><TT class=COMPUTEROUTPUT>CONFIG_IP_NF_COMPAT_IPFWADM</TT> - 同上,这只是<B 
class=COMMAND> ipfwadm</B>的暂时使用的兼容模式。</P>
<P>上面,我简要介绍了很多选项,但这只是内核2.4.9中的。要想看看更多的选项,建议你去Netfilter 
看看patch-o-matic。在那里,有其他的一些选项。POM可能会被加到内核里,当然现在还没有。这有很多原因,比如,还不稳定,Linus 
Torvalds没打算或没坚持要把这些补丁放入主流的内核,因为它们还在实验。</P>
<P>把以下选项编译进内核或编译成模块,<A 
href="http://1842.net/iptables/iptables-tutorial%201-1-19.html#RCFIREWALLTXT"><I>rc.firewall.txt</I></A>才能使用。</P>
<P></P>
<UL>
  <LI>
  <P>CONFIG_PACKET </P>
  <LI>
  <P>CONFIG_NETFILTER </P>
  <LI>
  <P>CONFIG_IP_NF_CONNTRACK </P>
  <LI>
  <P>CONFIG_IP_NF_FTP </P>
  <LI>
  <P>CONFIG_IP_NF_IRC </P>
  <LI>
  <P>CONFIG_IP_NF_IPTABLES </P>
  <LI>
  <P>CONFIG_IP_NF_FILTER </P>
  <LI>
  <P>CONFIG_IP_NF_NAT </P>
  <LI>
  <P>CONFIG_IP_NF_MATCH_STATE </P>
  <LI>
  <P>CONFIG_IP_NF_TARGET_LOG </P>
  <LI>
  <P>CONFIG_IP_NF_MATCH_LIMIT </P>
  <LI>
  <P>CONFIG_IP_NF_TARGET_MASQUERADE </P></LI></UL>
<P>以上是为保证 <A 
href="http://1842.net/iptables/iptables-tutorial%201-1-19.html#RCFIREWALLTXT"><I>rc.firewall.txt</I></A>正常工作而需要的最少的选项。其他脚本需要的选项,在相应的章节里都有说明。目前,我们只需注意要学习的这个脚本。</P></DIV>
<DIV class=SECTION>
<HR>

<H1 class=SECTION><A name=USERLANDSETUP>2.3. 编译与安装</A></H1>
<P>下面,我们来看看如何编译<B 
class=COMMAND>iptables</B>。iptables很多组件的配置、编译是与内核的配置、编译相关联的,了解这一点是很重要的。某些Linux产品预装了<B 
class=COMMAND>iptables</B>,比如Red Hat,但是它的缺省设置是不启用iptables的。后文我们会介绍如何启用它,也会介绍一下其他 
Linux产品里的iptables情况。</P>
<DIV class=SECTION>
<HR>

<H2 class=SECTION><A name=COMPILINGUSERAPPS>2.3.1. 编译</A></H2>
<P>首先要解压iptables包。这里,我用iptables 1.2.6a做例子(译者注:在我翻译时,最新版本已经是 
1.2.9,其中又有了不少改进,修补了一些bug,增添了几个match和target。)。命令<B class=COMMAND> bzip2 -cd 
iptables-1.2.6a.tar.bz2 | tar -xvf -</B>(当然也可以用<B class=COMMAND>tar -xjvf 
iptables-1.2.6a.tar.bz2</B>,但这个命令可能对一些老版的<B class=COMMAND>tar</B>不适用 ) 
将压缩包解压至目录iptables-1.2.6a,其中的INSTALL文件有很多对编译、运行有用的信息。</P>
<P>这一步,你将配置、安装一些额外的模块,也可以为内核增加一些选项。我们这里只是检查、安装一些未被纳入内核的标准的补丁。当然,更多的在实验阶段的补丁,仅在进行其他某些操作时才会用到。</P>
<DIV class=NOTE>
<P></P>
<TABLE class=NOTE width="100%" border=0>
  <TBODY>
  <TR>
    <TD vAlign=top align=middle width=25><IMG alt=Note hspace=5 
      src="Iptables 指南 1_1_19.files/note.gif"></TD>
    <TD vAlign=top align=left>
      <P>有一些补丁仅仅处在实验阶段,把它们也安装上不是一个好主意。这一步,你会遇到很多十分有趣的匹配和对数据包的操作,但它们还正在实验。</P>
      <P>为了完成这一步,我们要在iptables的目录内用到如下一些命令: </P></TD></TR></TBODY></TABLE></DIV>
<P><B class=COMMAND>make pending-patches KERNEL_DIR=/usr/src/linux/</B> </P>
<P>变量KERNEL_DIR指向内核原码的真实路径。一般情况下,都是<TT class=FILENAME>/usr/src/linux/ 
</TT>,但也会不一样,这要看你所用的Linux产品了。</P>
<DIV class=NOTE>
<P></P>
<TABLE class=NOTE width="100%" border=0>
  <TBODY>
  <TR>
    <TD vAlign=top align=middle width=25><IMG alt=Note hspace=5 
      src="Iptables 指南 1_1_19.files/note.gif"></TD>
    <TD vAlign=top align=left>
      <P>总之,只有某些补丁会被询问是否加入内核,而Netfilter的开发者们有大量的补丁或附件想要加入内核,但还要再实验一阵子才能做到。如果你想安装这些东西,就用下面的命令:</P></TD></TR></TBODY></TABLE></DIV>
<P><B class=COMMAND>make most-of-pom KERNEL_DIR=/usr/src/linux/</B> </P>
<P>这个命令会安装部分patch-o-matic(netfilter世界对补丁的称呼),忽略掉的是非常极端的那一部分,它们可能会对内核造成严重的破坏。你要知道这个命令的作用,要了解它们对内核原码的影响,好在在你选用之前,会有所提示。下面的命令可以安装所有的patch-o-matic(译者注:一定要小心哦)。</P>
<P><B class=COMMAND>make patch-o-matic KERNEL_DIR=/usr/src/linux/</B> </P>
<P>要仔细的读读每一个补丁的帮助文件,因为有些patch-o-matic会损坏内核,而有些对其他补丁有破坏作用。</P>
<DIV class=NOTE>
<P></P>
<TABLE class=NOTE width="100%" border=0>
  <TBODY>
  <TR>
    <TD vAlign=top align=middle width=25><IMG alt=Note hspace=5 
      src="Iptables 指南 1_1_19.files/note.gif"></TD>
    <TD vAlign=top align=left>
      <P>你要是不打算用patch-o-matic修补内核,以上的命令都用不着,它们不是必需的。不过,你可以用这些命令来看看有什么有趣的玩意儿,这不会影响任何东西。</P></TD></TR></TBODY></TABLE></DIV>
<P>安装好patch-o-matic,现在应该重新编译内核了,因为其中增加了一些补丁。但别忘了重新配置内核,现有的配置文件里可没有你增加的补丁的信息。当然,你也可以先编译<B 
class=COMMAND>iptables</B> , 再来编译内核。</P>
<P>接下来就该编译<B class=COMMAND>iptables</B>了,用下面这个简单的命令:</P>
<P><B class=COMMAND>make KERNEL_DIR=/usr/src/linux/</B> </P>
<P>iptables应该编译好了,如果不行,好好考虑考虑问题在哪儿,要么订阅<A 
href="http://1842.net/iptables/iptables-tutorial%201-1-19.html#NETFILTERLIST"> 
Netfilter mailing list</A>,那里可能有人能帮助你。</P>
<P>一切顺利的话,我们该安装<B class=COMMAND>iptables</B>了,这几乎不会有什么问题的。我们用下面的命令来完成这一步: </P>
<P><B class=COMMAND>make install KERNEL_DIR=/usr/src/linux/</B> </P>
<P>现在大功告成了。如果你在前面没有重新编译、安装内核,现在就要做了,不然,你还是不能使用更新后的iptables。好好看看INSTALL吧,那里面有详细的安装信息。</P></DIV>
<DIV class=SECTION>
<HR>

<H2 class=SECTION><A name=INSTALLRH71>2.3.2. 在Red Hat 7.1上安装</A></H2>
<P>Red Hat 7.1使用2.4.x的内核,支持Netfilter和<B class=COMMAND>iptables</B>。Red 
Hat包含了所有基本的程序和需要的配置文件,但缺省使用的是B 
class=COMMAND&gt;ipchains</B>。“iptables为什么不能用”是最常见的问题,下面就让我们就来说说如何关闭ipchains而起用<B 
class=COMMAND>iptables</B> 。 </P>
<DIV class=NOTE>
<P></P>
<TABLE class=NOTE width="100%" border=0>
  <TBODY>
  <TR>
    <TD vAlign=top align=middle width=25><IMG alt=Note hspace=5 
      src="Iptables 指南 1_1_19.files/note.gif"></TD>
    <TD vAlign=top align=left>
      <P>Red Hat 
7.1预装的iptables版本有些老了,在使用之前,你可能想装个新的,再自己编译一下内核。</P></TD></TR></TBODY></TABLE></DIV>
<P>我们先要关闭ipchains,并且不想再让它运行起来,做到这一点,要更改目录<TT 
class=FILENAME>/etc/rc.d/</TT>下的一些文件名。用以下命令完成: </P>
<P><B class=COMMAND>chkconfig --level 0123456 ipchains off</B> </P>
<P>这个命令把所有指向<TT class=FILENAME>/etc/rc.d/init.d/ipchains</TT>的软连接改名为 
K92ipchains。以S开头表示,在启动时会由初始化脚本运行此脚本。改为K开头后,就表示终止服务,或以后在启动时不再运行。这样,ipchains以后不会再开机就运行了。</P>
<P>要想终止正在运行的服务,要用<B class=COMMAND>service</B>命令。终止<B class=COMMAND>ipchains 
</B>服务的命令是:</P>
<P><B class=COMMAND>service ipchains stop</B> </P>
<P>现在,我们可以启动<B class=COMMAND>iptables</B>服务了。首先,要确定在哪个运行层运行,一般是 
2,3和5,这些层有不同的用处:</P>
<P>
<P></P>
<UL>
  <LI>
  <P>2. 不带NFS的多用户环境,和层3的区别仅在于不带网络支持。</P>
  <LI>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -