﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-LIULIANG-随笔分类-linux</title><link>http://www.cppblog.com/LIULIANG/category/20094.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 24 Nov 2012 07:10:13 GMT</lastBuildDate><pubDate>Sat, 24 Nov 2012 07:10:13 GMT</pubDate><ttl>60</ttl><item><title>网卡工作原理</title><link>http://www.cppblog.com/LIULIANG/archive/2012/11/22/195561.html</link><dc:creator>BIG森林</dc:creator><author>BIG森林</author><pubDate>Thu, 22 Nov 2012 10:01:00 GMT</pubDate><guid>http://www.cppblog.com/LIULIANG/archive/2012/11/22/195561.html</guid><wfw:comment>http://www.cppblog.com/LIULIANG/comments/195561.html</wfw:comment><comments>http://www.cppblog.com/LIULIANG/archive/2012/11/22/195561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LIULIANG/comments/commentRss/195561.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LIULIANG/services/trackbacks/195561.html</trackback:ping><description><![CDATA[<div style="layout-grid:  15.6pt none">
<p align="center"><strong><span style="font-family: 黑体; font-size: 15pt">网卡工作原理</span></strong></p>
<p style="text-indent: 21pt">Linux<span style="font-family: 宋体">操作系统的功能可以概括为进程管理、内存管理、文件系统管理、设备管理、网络等几部分。所有的系统操作最终都可以映射到对物理设备的操作。除去对</span>CPU<span style="font-family: 宋体">、内存以及其他少数几个物理实体的操作之外，系统对其他设备的所有操作都通过专门的称为驱动程序的代码完成。系统中存在的每种外设在内核中都必须有对应的设备驱动程序对其进行处理。所以分析网卡的工作原理即是分析网卡的驱动程序。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">网络是独立的一个模块。为了屏蔽网络环境中物理网络设备的多样性，</span>Linux<span style="font-family: 宋体">对所有的设备进行抽象并定义了一个统一的概念，称之为接口。所有对网络硬件的访问都是通过接口进行的，接口提供了一个对所有类型的硬件一致化的操作集合来处理基本数据发送和接收。一个网络接口被看作是一个发送和接收数据包的实体。对于每个网络接口，都用一个</span>net_device<span style="font-family: 宋体">的数据结构来表示。</span>net_device<span style="font-family: 宋体">中有很多提供系统访问和协议层调用的设备方法，包括提供设备初始化和往系统注册用的</span>init<span style="font-family: 宋体">函数，打开和关闭网络设备的</span>open<span style="font-family: 宋体">和</span>stop<span style="font-family: 宋体">函数，处理数据包发送的函数</span>hard_start_xmit<span style="font-family: 宋体">，以及中断处理函数。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">所有被发送和接收的包都用数据结构</span>sk_buff<span style="font-family: 宋体">表示。要发送数据时，网络系统将分局系统路由表选择相应的网络接口进行数据传输；当接收数据包时，通过驱动程序登记的中断服务程序进行数据的接口处理。</span></p>
<p style="text-indent: 21pt">Linux<span style="font-family: 宋体">网络驱动程序崇尚倒下分为四层：协议接口层、网络设备接口层、设备驱动功能层、网络设备和网络媒介层。如下图所示：</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体"><span style="font-size: 10.5pt" times="" new=""  ar-sa?="" 1.0pt;?? roman?;??><a href="http://blog.chinaunix.net/attachment/201102/27/23208702_1298783439GKfa.jpg" target="_blank"><img border="0" src="http://blog.chinaunix.net/attachment/201102/27/23208702_1298783439GKfa.jpg"  ;="" load="imgResize(this, 650);"  .  alt="" /></a> </span></span></p>
<p align="center"></p>
<p><strong><span style="font-family: 黑体; font-size: 14pt">网卡初始化</span></strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">网络设备初始化主要工作时检测设备的存在、初始化描述设备的</span>net_device<span style="font-family: 宋体">结构及在系统中登记该设备。在系统初始化完成以后，系统检测到的网络设备将保存在链表</span>dev_base<span style="font-family: 宋体">中，其中每个链表单元</span>net_device<span style="font-family: 宋体">对应一个存在的物理网络设备。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">初始化过程首先检测网络物理设备是否存在，这是通过检测物理设备的硬件特征来完成；然后对设备进行资源配置，这些完成之后就要构造设备的</span>net_device<span style="font-family: 宋体">数据结构，用检测到值对</span>net_device<span style="font-family: 宋体">中的变量初始化；最后</span>Linux<span style="font-family: 宋体">内核中注册该设备并申请内存空间。</span></p>
<p style="text-indent: 21.1pt"><strong>&nbsp;</strong></p>
<p><strong><span style="font-family: 黑体; font-size: 14pt">网卡的打开与关闭</span></strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">为了使用网络设备，需要打开网卡，打开和关闭的一个接口是由</span>shell<span style="font-family: 宋体">命令</span>ifconfig<span style="font-family: 宋体">调用的，而</span>ifconfig<span style="font-family: 宋体">则要调用一个通用的设备打开函数</span>dev_open<span style="font-family: 宋体">（</span>net/core/dev.c<span style="font-family: 宋体">），相应的还有一个</span>dev_close<span style="font-family: 宋体">函数，这两个函数提供独立于设备的操作接口的打开和关闭功能。一般打开函数执行的操作包括注册中断函数，分配并初始化网卡所需要的接收与发送缓冲区，启动硬件检查网络连接线状态等。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p><strong><span style="font-family: 黑体; font-size: 14pt">数据包的发送与接收</span></strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">数据包的发送和接收是实现</span>Linux<span style="font-family: 宋体">网络驱动程序中两个最关键的过程。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">当物理网络设备接收到数据是，系统通过两种途径解决这个问题。一种方法是轮询方式，另一种方式是中断法师。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在轮询方式中，系统每隔一定的时间间隔就去检查一次物理设备，若设备有数据到达，就调用读取数据的程序。</span>Linux<span style="font-family: 宋体">中通过定时器实现，但是此法有一个明显的缺点：不管设备是否有数据，系统总是要固定的消耗</span>CPU<span style="font-family: 宋体">资源去查看设备，并且可能对一些紧急数据处理予以延迟。从资源的利用率以及工作的效率上看都不是最优的。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">中断方式利用硬件体系结构的中断机制实现设备和系统的应答对话，即当物理设备需要</span>CPU<span style="font-family: 宋体">处理数据时，就向</span>CPU<span style="font-family: 宋体">发送一个终端信号，系统则在收到信号后调用相应的中断服务程序响应对设备中断的处理。因此，基本在所有的网络设备驱动程序中都是用中断方式的。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">每一个网卡上都有一块</span>FIFO<span style="font-family: 宋体">存储器，对于</span>NIC<span style="font-family: 宋体">（</span>Network Interface Controller<span style="font-family: 宋体">），</span>FIFO<span style="font-family: 宋体">存储器是用来通过系统总线传送数据到系统存储器之前，缓存从</span>LAN<span style="font-family: 宋体">上接收到的数据。对与快速以太网还有一个直接内存存取（</span>DMA<span style="font-family: 宋体">：</span>Directly Memory Access<span style="font-family: 宋体">）控制器，用于提供对系统存储器的可靠访问。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">驱动为网卡分配一个环形缓冲区，在一段连续的物理内存中实现。</span></p>
<p style="text-indent: -18pt; margin-left: 39pt"><span>1、&nbsp;</span><span style="font-family: 宋体">数据接收</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（1）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">接收来自</span>MAC<span style="font-family: 宋体">的数据包，先暂存于片内</span>FIFO<span style="font-family: 宋体">接收队列；</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（2）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">当接收器达到早期接收上线时就移至环形缓冲区；</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（3）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">待整个数据包全部从</span>FIFO<span style="font-family: 宋体">移至缓存后，将接收状态寄存器和包长度写入接收的数据包头部，并更新</span>CBA<span style="font-family: 宋体">（</span>Current Buffer Address<span style="font-family: 宋体">）寄存器的值；</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（4）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>CMD<span style="font-family: 宋体">（</span>Command<span style="font-family: 宋体">）寄存器中的</span>BufferEmpty<span style="font-family: 宋体">位和</span>ISR<span style="font-family: 宋体">（中断状态寄存器）寄存器的</span>ROK<span style="font-family: 宋体">位置</span>1<span style="font-family: 宋体">，并发出</span>ROK<span style="font-family: 宋体">的中断；</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（5）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>ISR<span style="font-family: 宋体">中断调用完成后，清除</span>ISR<span style="font-family: 宋体">（</span>ROK<span style="font-family: 宋体">）并更新</span>CAPR<span style="font-family: 宋体">（</span>Current Address of Packet Read<span style="font-family: 宋体">，指向接收缓存的已读取包的地址），完成本次接收。</span></p>
<p style="text-indent: -18pt; margin-left: 39pt"><span>2、&nbsp;</span><span style="font-family: 宋体">数据发送</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（1）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">将待传送的数据写入主存中一段连续的缓存空间，由</span>OS<span style="font-family: 宋体">配合驱动程序完成；</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（2）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">找到一个可用的描述器，并写入内容，包括该数据包的开始物理地址和传输状态字（包的大小、可传送下限、</span>OWN<span style="font-family: 宋体">位）；</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（3）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>OWN<span style="font-family: 宋体">位有效，将数据从缓存移至片内</span>FIFO<span style="font-family: 宋体">队列；</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（4）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">当</span>FIFO<span style="font-family: 宋体">队列中的数据达到早期传送下限，</span>NIC<span style="font-family: 宋体">的传送单元就会启动，将数据顺序输出至线路；</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（5）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">当整个数据包都已经传至</span>FIFO<span style="font-family: 宋体">，</span>OWN<span style="font-family: 宋体">位置</span>1<span style="font-family: 宋体">；</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（6）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">当整个数据包都已经传至线路上，</span> TOK<span style="font-family: 宋体">寄存器置</span>1<span style="font-family: 宋体">；</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（7）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">当</span>TOK<span style="font-family: 宋体">（</span>IMR<span style="font-family: 宋体">）和</span>TOK<span style="font-family: 宋体">（</span>ISR<span style="font-family: 宋体">）多置</span>1<span style="font-family: 宋体">，就发出</span>TOK<span style="font-family: 宋体">中断；</span></p>
<p style="text-indent: -36pt; margin-left: 57pt"><span>（8）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>TOK<span style="font-family: 宋体">中断调用完成以后，清除</span>TSD<span style="font-family: 宋体">状态字，完成本次传送。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">可以看出，网卡需要发送</span>/<span style="font-family: 宋体">接收数据，都必须以中断的方式告诉系统，系统处理中断后做出相应操作。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">网卡存在一定大小的</span>FIFO<span style="font-family: 宋体">存储器，同时还有缓冲区，缓冲区是由系统以及驱动共同分配一段连续的物理内存，所有的发送</span>/<span style="font-family: 宋体">接收的数据，都必须通过</span>FIFO<span style="font-family: 宋体">已经缓冲区，只有一包数据都发送成功后，才能继续发送下一包数据。系统维护缓冲区，只有当缓冲区有空间时才会接受上层来的数据，而网卡处理数据的速率远高于接收数据的最大速率，因此在网卡上不会存在堵塞情况。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">对编程而言，在应用层调用传输层函数</span>send/sendto<span style="font-family: 宋体">，使用套接字传送数据，屏蔽了底层的所有实现。此时，</span>send/sendto<span style="font-family: 宋体">函数是没有阻塞的，只要调用，必然有返回值，成功返回发送数据的长度，失败则返回负值（失败的主要原因是网络连接的问题），因此可能存在数据丢失的现象，需要写程序的时候保证数据的传输成功。但是只有</span>send/sendto<span style="font-family: 宋体">函数返回后，程序才会执行下一次发送，因此编程时没必要考虑数据会在传输层上出现阻塞。<br /><br /><font face="Verdana">转自：<a href="http://blog.chinaunix.net/uid-25839577-id-3035405.html">http://blog.chinaunix.net/uid-25839577-id-3035405.html</a></font></span></p></div><img src ="http://www.cppblog.com/LIULIANG/aggbug/195561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LIULIANG/" target="_blank">BIG森林</a> 2012-11-22 18:01 <a href="http://www.cppblog.com/LIULIANG/archive/2012/11/22/195561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下IPTABLES配置详解</title><link>http://www.cppblog.com/LIULIANG/archive/2012/10/22/193650.html</link><dc:creator>BIG森林</dc:creator><author>BIG森林</author><pubDate>Mon, 22 Oct 2012 01:42:00 GMT</pubDate><guid>http://www.cppblog.com/LIULIANG/archive/2012/10/22/193650.html</guid><wfw:comment>http://www.cppblog.com/LIULIANG/comments/193650.html</wfw:comment><comments>http://www.cppblog.com/LIULIANG/archive/2012/10/22/193650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LIULIANG/comments/commentRss/193650.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LIULIANG/services/trackbacks/193650.html</trackback:ping><description><![CDATA[<div><h1><a id="cb_post_title_url" href="http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html">linux下IPTABLES配置详解</a></h1> 	<div id="cnblogs_post_body"><div><strong>如果你的IPTABLES基础知识还不了解,建议先去看看.</strong></div> <div><strong>开始配置</strong></div> <div><strong>我们来配置一个filter表的防火墙.</strong></div> <div><strong>(1)查看本机关于IPTABLES的设置情况</strong></div> <div>[root@tp ~]# iptables -L -n<br /> Chain INPUT (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> <div>Chain FORWARD (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> <div>Chain OUTPUT (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> <div>Chain RH-Firewall-1-INPUT (0 references)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> ACCEPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> ACCEPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icmp --&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icmp type 255 <br /> ACCEPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> ACCEPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ah&nbsp;&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> ACCEPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udp&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 224.0.0.251&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udp dpt:5353 <br /> ACCEPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udp&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udp dpt:631 <br /> ACCEPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state RELATED,ESTABLISHED <br /> ACCEPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state NEW tcp dpt:22 <br /> ACCEPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state NEW tcp dpt:80 <br /> ACCEPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state NEW tcp dpt:25 <br /> REJECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reject-with icmp-host-prohibited <br /> 可以看出我在安装linux时,选择了有防火墙,并且开放了22,80,25端口.</div> <div>如果你在安装linux时没有选择启动防火墙,是这样的</div> <div> <div>[root@tp ~]# iptables -L -n<br /> Chain INPUT (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> <div>Chain FORWARD (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> <div>Chain OUTPUT (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;</div> <div>什么规则都没有.</div> <div><strong>(2)清除原有规则.</strong></div> <div>不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则.</div> <div> <div>[root@tp ~]# iptables -F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清除预设表filter中的所有规则链的规则<br /> [root@tp ~]# iptables -X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清除预设表filter中使用者自定链中的规则</div> <div>我们在来看一下</div> <div>[root@tp ~]# iptables -L -n<br /> Chain INPUT (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> <div>Chain FORWARD (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> <div>Chain OUTPUT (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> <div>什么都没有了吧,和我们在安装linux时没有启动防火墙是一样的.(提前说一句,这些配置就像用命令配置IP一样,重起就会失去作用),怎么保存.</div> <div><span style="font-size: 9pt">[root@tp ~]# /etc/rc.d/init.d/iptables save</span></div>  <div><span style="font-size: 9pt">这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.</span></div> <div><span style="font-size: 9pt">[root@tp ~]# service iptables restart</span></div>  <div>现在IPTABLES配置表里什么配置都没有了,那我们开始我们的配置吧</div> <div><strong>(3)设定预设规则</strong></div> <div>[root@tp ~]# iptables -p INPUT DROP</div> <div>[root@tp ~]# iptables -p OUTPUT ACCEPT</div> <div>[root@tp ~]# iptables -p FORWARD DROP<br /> <strong>上面的意思是,当超出了IPTABLES里filter表里的两个链规则(INPUT,FORWARD)时,不在这两个规则里的数据包怎么处理呢,那就是DROP(放弃).应该说这样配置是很安全的.我们要控制流入数据包</strong></div> <div><strong>而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也就是说,不在着个规则里的包怎么办呢,那就是通过.</strong></div> <div><strong>可以看出INPUT,FORWARD两个链采用的是允许什么包通过,而OUTPUT链采用的是不允许什么包通过.</strong></div> <div><strong>这样设置还是挺合理的,当然你也可以三个链都DROP,但这样做我认为是没有必要的,而且要写的规则就会增加.但如果你只想要有限的几个规则是,如只做WEB服务器.还是推荐三个链都是DROP.</strong></div> <div>注:如果你是远程SSH登陆的话,当你输入第一个命令回车的时候就应该掉了.因为你没有设置任何规则.</div> <div>怎么办,去本机操作呗!</div> <div><strong>(4)添加规则.</strong></div> <div><strong>首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链</strong></div> <div><strong>为了能采用远程SSH登陆,我们要开启22端口.</strong></div> <div>[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT</div> <div>[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT <strong>(注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一部,好多人都是望了写这一部规则导致,始终无法SSH.在远程一下,是不是好了.</strong></div> <div><strong>其他的端口也一样,如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:</strong></div> <div>[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其他同理.)</div> <div><strong>如果做了WEB服务器,开启80端口.</strong></div> <div>[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT<br /> <strong>如果做了邮件服务器,开启25,110端口.</strong></div> <div>[root@tp ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT<br /> [root@tp ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT<br /> <strong>如果做了FTP服务器,开启21端口</strong></div> <div>[root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT</div> <div>[root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT</div> <div><strong>如果做了DNS服务器,开启53端口</strong></div> <div>[root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT</div> <div>如果你还做了其他的服务器,需要开启哪个端口,照写就行了.</div> <div>上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP</div> <div><strong>允许icmp包通过,也就是允许ping,</strong></div> <div>[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)</div> <div>[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT&nbsp;&nbsp;&nbsp; (INPUT设置成DROP的话)<br /> </div> <div> <div><strong>允许loopback!(不然会导致DNS无法正常关闭等问题)</strong></div> <div>IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)<br /> IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)<br /> </div> </div> <div>下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链.</div> <div><strong>减少不安全的端口连接</strong></div> <div>[root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP</div> <div>[root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP</div> <div>有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会</div> <div>还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139（smb）,2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关资料.</div>  <div><strong>当然出入更安全的考虑你也可以包OUTPUT链设置成DROP,那你添加的规则就多一些,就像上边添加</strong></div> <div><strong>允许SSH登陆一样.照着写就行了.</strong></div>  <div><strong>下面写一下更加细致的规则,就是限制到某台机器</strong></div> <div><strong>如:我们只允许192.168.0.3的机器进行SSH连接</strong></div> <div>[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT</div> <div>如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.</div> <div>24表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了.</div> <div>-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因为它表示所有地址都可以登陆.</div> <div>或采用命令方式:</div> <div>[root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT</div> <div>然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存.写入到/etc/sysconfig/iptables文件里.</div> <div><span style="font-size: 9pt">[root@tp ~]# /etc/rc.d/init.d/iptables save</span></div> <div>这样写 !192.168.0.3 表示除了192.168.0.3的ip地址</div> <div>其他的规则连接也一样这么设置.</div>  <div><strong>在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.</strong></div> <div><strong>开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)</strong></div> <div>[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT</div> <div>[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT</div> <div><strong>丢弃坏的TCP包</strong></div> <div>[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP</div> <div><strong>处理IP碎片数量,防止攻击,允许每秒100个</strong></div> <div>[root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT</div> <div><strong>设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.</strong> </div> <div>[root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT</div> <div>我在前面只所以允许ICMP包通过,就是因为我在这里有限制.<br /> </div> <div><strong>二,配置一个NAT表放火墙</strong></div> <div><strong>1,查看本机关于NAT的设置情况</strong></div> <div><strong>[root@tp rc.d]# iptables -t nat -L</strong><br /> Chain PREROUTING (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> <div>Chain POSTROUTING (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> SNAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; 192.168.0.0/24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to:211.101.46.235 </div> <div>Chain OUTPUT (policy ACCEPT)<br /> target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination&nbsp;&nbsp;&nbsp;&nbsp;</div> <div>我的NAT已经配置好了的(只是提供最简单的代理上网功能,还没有添加防火墙规则).关于怎么配置NAT,参考我的另一篇文章</div> <div>当然你如果还没有配置NAT的话,你也不用清除规则,因为NAT在默认情况下是什么都没有的</div> <div><strong>如果你想清除,命令是</strong></div> <div><span style="font-size: 10pt">[root@tp ~]# iptables -F -t nat</span></div> <div><span style="font-size: 10pt"><span style="font-size: 10pt">[root@tp ~]# iptables -X -t nat</span></span></div> <div><span style="font-size: 10pt"><span style="font-size: 10pt">[root@tp ~]# iptables -<span style="font-size: 10pt"><span style="font-size: 10pt">Z</span></span> -t nat</span></span></div>  <div><strong>2,添加规则</strong></div> <div><strong>添加基本的NAT地址转换,(关于如何配置NAT可以看我的另一篇文章),</strong></div> <div><strong>添加规则,我们只添加DROP链.因为默认链全是ACCEPT.</strong></div> <div><strong>防止外网用内网IP欺骗</strong></div> <div>[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP<br /> [root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP<br /> [root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP<br /> <strong>如果我们想,比如阻止MSN,QQ,BT等的话,需要找到它们所用的端口或者IP,(个人认为没有太大必要)</strong></div> <div><strong>例：</strong></div> <div> <div><span style="font-size: 10pt"><strong>禁止与211.101.46.253的所有连接</strong></span></div> <span style="font-size: 10pt">[root@tp ~]# iptables -t nat -A PREROUTING&nbsp;&nbsp;&nbsp; -d 211.101.46.253 -j DROP</span></div> </div> </div> <div> <div><span style="font-size: 10pt"><span style="font-size: 10pt"><strong>禁用FTP(21)端口</strong></span> </span></div> <div><span style="font-size: 10pt">[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP</span></div> <div><strong>这样写范围太大了,我们可以更精确的定义.</strong></div> <div><span style="font-size: 10pt">[root@tp ~]# iptables -t nat -A PREROUTING&nbsp;&nbsp;&nbsp; -p tcp --dport 21 -d 211.101.46.253 -j DROP </span></div> <div><span style="font-size: 10pt"><strong>这样只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接.</strong></span></div> </div> <div><strong>按照我写的,你只要找到QQ,MSN等其他软件的IP地址,和端口,以及基于什么协议,只要照着写就行了.</strong></div>  <div><strong>最后：</strong></div> <div><strong>drop非法连接</strong><br /> [root@tp ~]# iptables -A INPUT&nbsp;&nbsp;&nbsp;&nbsp; -m state --state INVALID -j DROP<br /> [root@tp ~]# iptables -A OUTPUT&nbsp;&nbsp;&nbsp; -m state --state INVALID -j DROP<br /> [root@tp ~]# iptables-A FORWARD -m state --state INVALID -j DROP<br /> <strong>允许所有已经建立的和相关的连接</strong><br /> [root@tp ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT<br /> [root@tp ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT<br /> </div> <p><span style="font-size: 9pt">[root@tp ~]# /etc/rc.d/init.d/iptables save</span></p> <p><span style="font-size: 9pt"><strong>这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用．</strong></span></p> <p><span style="font-size: 9pt">[root@tp ~]# service iptables restart</span></p> <br /> <strong>别忘了保存，不行就写一部保存一次．你可以一边保存，一边做实验，看看是否达到你的要求， </strong> <div><strong>上面的所有规则我都试过，没有问题．</strong></div> <div><strong>写这篇文章，用了我将近１个月的时间．查找资料，自己做实验，希望对大家有所帮助．如有不全及不完善的地方还请提出.</strong></div> <div><strong>因为本篇文章以配置为主.关于IPTABLES的基础知识及指令命令说明等我会尽快传上,当然你可以去网上搜索一下,还是很多的.<br /><br />转自：<div>http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html</div><br /></strong></div> </div></div><img src ="http://www.cppblog.com/LIULIANG/aggbug/193650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LIULIANG/" target="_blank">BIG森林</a> 2012-10-22 09:42 <a href="http://www.cppblog.com/LIULIANG/archive/2012/10/22/193650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux专用防火墙配置教程</title><link>http://www.cppblog.com/LIULIANG/archive/2012/10/20/193569.html</link><dc:creator>BIG森林</dc:creator><author>BIG森林</author><pubDate>Sat, 20 Oct 2012 07:28:00 GMT</pubDate><guid>http://www.cppblog.com/LIULIANG/archive/2012/10/20/193569.html</guid><wfw:comment>http://www.cppblog.com/LIULIANG/comments/193569.html</wfw:comment><comments>http://www.cppblog.com/LIULIANG/archive/2012/10/20/193569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LIULIANG/comments/commentRss/193569.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LIULIANG/services/trackbacks/193569.html</trackback:ping><description><![CDATA[<div><p>Linux操作系统的安全性是众所周知的，所以，现在很多企业的服务器，如文件服务器、WEB服务器等等，都采用的是Linux的操作系统。笔者所 在的企业，有包括Oracle数据库服务器、文件备份服务器、邮件服务器、WEB服务器也都是采用Linux的服务器系统。今天，我就谈谈Linux是通 过哪些技术来保障服务器的安全，来加强对网络的访问控制。</p> <p>　　Linux内置防火墙主要是通过包过滤的手段来提高对网络的管理控制功能，从而提高网络与服务器的安全。</p> <p>　　一、 Linux防火墙的工作原理</p> <p>　　我们设想一下，一台Linux主机一般会作哪些数据包相关的工作。其实，我们可以把一台Linux形象的比喻成一个地铁车站。一个地铁车站一般 有三个口子，一个是进口，乘客需要去做地铁的话，必须通过这个地铁的进口，而且必须凭合法的票子才能进去。第二个是出口，若乘客需要离开地铁站的话，则也 必须凭着票子出站。三是一个中转的接口，也就是说，在地铁的中转站中，你可以直接通过过道到另外一条线上去。</p> <p>　　而一台Linux主机也有三个口子。一个是进口(INPUT)，到这台主机的任何数据包都需要通过这个接口才能够进入Linux系统的应用程序 空间。第二个是出口(OUTPUT)，从应用程序发送出去的任何数据包都必须通过这个出口，才能够进入到Linux系统的内核，让它把数据发送出去。第三 个是转发接口(FORWARD)，主要用来进行数据包的转发。</p> <p>　　在Linux主机上要实现包过滤，其实也就是在这三个口子上添加包过滤条件。这就好像在每个口子上设置&#8220;验票员&#8221;。当&#8220;乘客&#8221;手里的票是合法 的，则&#8220;验票员&#8221;就允许其通过;若这票是不允许的，则&#8220;验票员&#8221;就会拒绝其通过这个口子。通过这种方式，我们网络管理员就可以很好的管理网络中传递的数据 包，并且对于一些服务器的防问权限进行合理且有效的控制。</p> <p>　　如有时候我们为了防止DDOS攻击，我们就可以设置让所有主机都拒绝ICMP协议。如此的话，任何一台主机企图ping局域网内的任何一台 Linux电脑的话，局域网内的任何主机都不会有响应。而若有黑客把局域网内的主机当作肉鸡，企图通过他们来实现DOS攻击的时候，由于我们在出站接口 (OUTPUT接口)过滤了ICMP协议，所以，这个PING命令也根本不会传递到局域网中去。如此的话，就可以从根源上保护网络的安全。</p> <p>　　二、 Linux防火墙的配置方法</p> <p>　　Linux防火墙基本上是通过一条iptables命令来实现具体的配置。如我们现在为了防止局域网内的机器使用ping命令。这是一种很好的 防止DDOS攻击的方法。应为要实现DDOS攻击的话，则首先需要在局域网内部寻找肉鸡，让多台肉鸡同时采用PING命令PING服务器，直到服务器因为 资源耗竭而当机。现在若把所有Linux主机的PING命令都禁用掉的话，则就可以最大程度的防治DDOS攻击的危害。</p> <p>　　Iptables &#8211;A OUTPUT &#8211;P icmp &#8211;j DROP</p> <p>　　通过这条命令，就可以实现禁用本机的PING命令。</p> <p>　　命令iptables就是防火墙包过滤策略的配置命令。防火墙的过滤规则，就是通过这个简单的命令来实现的。后面的参数-A则表示添加一个过滤 条件;-P表示一种协议类型;-J表示我们的目标。上面的这条命令的意思就是在Linux主机的出口上，加上一条过滤语句，当数据包的协议类型是ICMP 的话，则全部丢弃。</p> <p>　　不过ICMP有一个特性。我们一般PING一台主机的话，则对于这台主机来说，首先其需要通过进站接口，把数据包传递到上层;然后，又要利用出 站接口，把回应信息发送出去。如果任何一个接口不通，如只收到信息而没有回应的话，则对与主ping方来说，就显示的是目的地不可大的信息。</p> <p>　　以上这个条命令我们是在出口上加了限制语句，上面我们说过，一共可以在Linux主机上的三个接口，包括进站进口、出站接口与转发接口，在内的 任何一个接口上配置包过滤条件，以实现对防火墙的管理控制。在下面例子中，笔者将给大家举一个WEB服务器的例子，看看如何通过Linux主机的防火墙来 管理WEB服务器，提高其安全性。</p> <p>　　三、 Linux防火墙的配置实例</p> <p>　　我们该如何利用Linux操作系统自带的防火墙来提高网络的管理控制功能呢?具体的来说，我们可以分三步走。一是先在Linux服务器上开一个 后门，这个后门是专门给我们网络管理员管理服务器用的。二是把所有的进站、出站、转发站接口都关闭，此时，只有通过我们上面开的后门，管理员才能够远程连 接到服务器上，企图任何渠道都不能连接到这台主机上。三是根据我们服务器的用途，把一些需要用到的接口开放出去。</p> <p>　　下面笔者就以一个WEB服务器为例，谈谈如何设置防火墙，才能够提高这台服务器的安全性，并且，在提高安全性的同时，也不影响我们网络管理员对其的访问控制。</p> <p>　　第一步：开后门</p> <p>　　网络管理员一般是通过SSH方式来管理Linux操作系统。所以，我们首先需要开一个后门，允许网络管理员通过SSH方式远程登录到服务器，对这台服务器进行必要的维护与管理。</p> <p>　　为了达到这个目的，我们可以利用两条语句来实现。我们这里假设我们WEB服务器的IP地址为192.168.0.2。</p> <p>　　Iptables &#8211;A INPUT &#8211;P tcp &#8211;d 192.168.0.2 &#8211;dport 22 &#8211;j ACCEPT</p> <p>　　Iptables &#8211;A OUTPUT &#8211;P tcp &#8211;S 192.168.0.2 &#8211;dport 22 &#8211;j ACCEPT</p> <p>　　第一条语句的意思是，在进站接口上，允许网络管理员通过TCP协议与22号端口，访问主机。一般SSH方式采用的就是22号端口与TCP协议。 这条语句的作用就是让网络管理员可以连接到WEB服务器上去。但是，这还不够，我们若想要远程管理WEB服务器的话，则就需要实现相互交互的功能。也就是 说，我们还需要WEB服务器能够给我们回应一些消息。此时，我们就还需要配置第二条语句。</p> <p>　　上面第二条语句的意识就是允许WEB服务器通过22号端口与TCP协议，发送一些数据出去。如此的话，我们网络管理员就可以受到WEB服务器的一些回应信息。</p> <p>　　第二步：关闭所有接口</p> <p>　　Iptables &#8211;P INPUT &#8211;j DROP</p> <p>　　Iptables &#8211;P OUTPUT &#8211;j DROP</p> <p>　　Iptables &#8211;P FORWARD &#8211;j DROP</p> <p>　　以上三条命令的作用就是把WEB服务器上的三个接口全部关闭。但是，此时因为我们在第一步开了一个后门，所以，事后网络管理员仍然可以通过 SSH这个方式登录到服务器上去，对其进行远程访问。采用这些命令把各个接口关闭后，我们就无法通过HTTP、FTP等方式访问服务器。</p> <p>　　第三步：分析服务器的用途并添加允许条件</p> <p>　　把各个接口关不后，我们还需要为其添加一些必要的条件，允许某些特定类型的数据包通过。否则的话，其他人不是不能通过网络访问WEB服务器，那不是白搭了吗?</p> <p>　　所以，接下去的任务，我们就是需要分析服务器的类型。我们现在配置的是一台WEB服务器，而WEB服务器一般是通过HTTP方式与80端口进行 访问的。默认情况下，其用到的就是TCP协议与80端口。所以，我们只需要在进口与出口上，允许协议是TCP、端口号是80的数据包通过，就可以实现我们 的目标了。</p> <p>　　Iptables &#8211;A INPUT &#8211;P tcp &#8211;d 192.168.0.2 &#8211;dport 80 &#8211;j ACCEPT</p> <p>　　Iptables &#8211;A OUTPUT &#8211;P tcp &#8211;S 192.168.0.2 &#8211;dport 80 &#8211;j ACCEPT</p> <p>　　通过如上的配置，就可以实现我们的需求</p> <p>　　四、 Linux防火墙的配置需要注意的地方</p> <p>　　在使用Linux防火墙来管理企业网络的时候，笔者给大家提一些建议。</p> <p>　　一是根据最小权限的安全与控制设计原则，我们在防火墙设计的时候，需要先把所有的接口先全部禁用掉。然后，再根据服务器的类型，添加一些允许数 据包通过的语句。如此的目的，是为了保障服务器上只允许一些特定的协议与数据包通过。如此做的话，就可以最大限度的保障服务器与企业网络的安全。如通过上 面如此配置的服务器，无法使用FTP协议访问服务器，也就杜绝了非法访问者企图利用FTP漏洞来攻击WEB服务器。同时，也禁止了ICMP协议，如此的 话，就可以有效的防止DDOS攻击等等。</p> 　　二是有时候会碰到应用程序与防火墙无法协作的问题。如在Linux服务器上部署一个ERP服务器，若同时打开了防火墙的话，则可能就无法连接上 服务器。其实，这不是防火墙或者ERP服务器产生了什么冲突，而是我们没有配置好防火墙而已。一般情况下，笔者建议先把防火墙禁用掉，把ERP服务器先配 置成功、其他用户可以连接上服务器后，再启用防火墙。在启用防火墙的时候，我们需要清楚，这个ERP服务器到底采用了哪些协议与端口来进行数据包的传递， 然后再配置防火墙。大部分的时候，都是因为我们不熟悉某个服务器到底在采用哪些协议与端口，才造成客户端连接的错误。<br />转自：<div>http://www.wangyeba.com/Article/web05/Linux/200811/20081108083048.shtml</div><br /> </div><img src ="http://www.cppblog.com/LIULIANG/aggbug/193569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LIULIANG/" target="_blank">BIG森林</a> 2012-10-20 15:28 <a href="http://www.cppblog.com/LIULIANG/archive/2012/10/20/193569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>