Tuesday, March 22, 2011

NetBIOS 名稱解析

轉:http://technet.microsoft.com/zh-tw/library/cc738412%28WS.10%29.aspx


NetBIOS name resolution
Updated: January 21, 2005
Applies To: Windows Server 2003, Windows Server 2003 R2, Windows Server 2003 with SP1, Windows Server 2003 with SP2

NetBIOS name resolution

NetBIOS name resolution means successfully mapping a NetBIOS name to an IP address. A NetBIOS name is a 16-byte address that is used to identify a NetBIOS resource on the network. A NetBIOS name is either a unique (exclusive) or group (nonexclusive) name. When a NetBIOS process is communicating with a specific process on a specific computer, a unique name is used. When a NetBIOS process is communicating with multiple processes on multiple computers, a group name is used.
An example of a process that uses a NetBIOS name is the File and Printer Sharing for Microsoft Networks service on a computer running Windows XP Professional. When your computer starts up, this service registers a unique NetBIOS name based on the name of your computer. The exact name used by the service is the 15-character computer name plus a 16th character of 0x20. If the computer name is not 15 characters long, it is padded with spaces up to 15 characters.
When you attempt to make a file-sharing connection to a computer by using its computer name, the File and Printer Sharing for Microsoft Networks service on the file server you specify corresponds to a specific NetBIOS name. For example, when you attempt to connect to a computer called CORPSERVER, the NetBIOS name corresponding to the File and Printer Sharing for Microsoft Networks service on that computer is:
CORPSERVER     [20]
Note the use of spaces to pad the computer name. Before you can establish a file and print sharing connection, a TCP connection must be created. In order for a TCP connection to be established, the NetBIOS name "CORPSERVER     [20]" must be resolved to an IP address.
The exact mechanism by which NetBIOS names are resolved to IP addresses depends on the NetBIOS node type that is configured for the node. RFC 1001, "protocol Standard for a NetBIOS Service on a TCP/UDP Transport: Concepts and Methods," defines the NetBIOS node types, as listed in the following table.

 

Node type Description
B-node(broadcast)
B-node uses broadcast NetBIOS name queries for name registration and resolution. B-node has two major problems: (1) Broadcasts disturb every node on the network, and (2) Routers typically do not forward broadcasts, so only NetBIOS names on the local network can be resolved.
P-node (peer-peer)
P-node uses a NetBIOS name server (NBNS), such as a WINS server, to resolve NetBIOS names. P-node does not use broadcasts; instead, it queries the name server directly.
M-node (mixed)
M-node is a combination of B-node and P-node. By default, an M-node functions as a B-node. If an M-node is unable to resolve a name by broadcast, it queries a NBNS using P-node.
H-node(hybrid)
H-node is a combination of P-node and B-node. By default, an H-node functions as a P-node. If an H-node is unable to resolve a name through the NBNS, it uses a broadcast to resolve the name.
Computers running Windows Server 2003 operating systems are B-node by default and become H-node when they are configured with a WINS server. Those computers can also use a local database file called Lmhosts to resolve remote NetBIOS names. The Lmhosts file is stored in the systemroot\System32\Drivers\Etc folder. For more information, see TCP/IP database files.
It is highly recommended that you configure Windows-based computers with the IP address of your WINS server in order for remote NetBIOS names to be resolved. You must configure Active Directory-based computers, such as Windows XP Professionaland Windows Server 2003 operating systems, with the IP address of a WINS server if they are to communicate with computers running Windows NT, Windows 95, Windows 98, Windows 2000, or Windows Millennium Edition that are not Active Directory-based.


NetBIOS 名稱解析

NetBIOS name resolution

NetBIOS 名稱解析表示將 NetBIOS 名稱成功地對應到 IP 位址。NetBIOS 名稱是用來識別網路上 NetBIOS 資源的 16 位元組位址。NetBIOS 名稱可以是唯一 (獨佔) 的名稱,也可以是群組 (非獨佔) 名稱。NetBIOS 處理程序與指定電腦上的指定處理程序通訊時,使用唯一的名稱。NetBIOS 處理序與多重電腦上的多重處理程序通訊時,使用群組名稱。
使 用 NetBIOS 名稱的範例處理程序為,執行 Windows XP Professional 的電腦上的 File and Printer Sharing for Microsoft Networks 服務。電腦啟動時,此服務依據您的電腦名稱登錄唯一的 NetBIOS 名稱。此服務使用的完整名稱是 15 位字元電腦名稱加上一個 0x20 的第 16 位字元。如果電腦名稱的長度不是 15 位字元,會由空格來補齊 15 位字元。
當您嘗試依電腦名稱,產生連接到電腦的檔案共用連線案時,在您指定的檔案伺服器上的 File and Printer Sharing for Microsoft Networks 服務,對應特定的 NetBIOS 名稱。例如,當您嘗試連線到稱為 CORPSERVER 的電腦時,電腦上與 File and Printer Sharing for Microsoft Networks 服務對應的 NetBIOS 名稱為:
CORPSERVER     [20]
請注意它使用空格以補齊電腦名稱。在您可以建立檔案及列印共用連線之前,必須建立 TCP 連線。為了建立 TCP 連線,必須將 NetBIOS 名稱「CORPSERVER [20]」解析成 IP 位址。
將 NetBIOS 名稱解析成 IP 位址的完整機制依存於為 NetBIOS 節點設定的節點類型。RFC 1001「Protocol Standard for a NetBIOS Service on a TCP/UDP Transport:Concepts and Methods」定義 NetBIOS 節點類型,如下表所列。

 

節點類型 描述
B-Node (廣播)B-Node 使用廣播 NetBIOS 名稱查詢,以進行名稱登錄及解析。B-Node 有二個主要問題:(1) 廣播打擾了網路上的每個節點,及 (2) 路由器基本上不轉送廣播,所以只可以解析區域網路上的 NetBIOS名稱。
P-Node (對等)P-Node 使用 NetBIOS 名稱伺服器 (NBNS),如 WINS 伺服器,來解析 NetBIOS 名稱。P-Node 不使用廣播;它改為直接查詢名稱伺服器。
M-node (混合式)M-Node 是 B-Node 與 P-Node 的結合。M-Node 預設會具有 B-Node 的功能。如果 M-Node 無法藉由廣播解析名稱,則它使用 P-Node 查詢 NBNS。
H-node (合成式)H-Node 是 P-Node 及 B-Node 的結合。H-Node 預設會具有 P-Node 的功能。如果 H-Node 無法透過 NBNS 解析名稱,那麼它會使用廣播來解析名稱。
執 行 Windows Server 2003 作業系統的電腦預設會是 B-Node;而運用 WINS 伺服器設定它們時,它們就變成 H-Node。這些電腦也可以使用稱為 Lmhosts 的本機資料庫檔案,來解析遠端 NetBIOS 名稱。Lmhosts 檔案存放在 systemroot\System32\Drivers\Etc 資料夾。如需相關資訊,請參閱 TCP/IP 資料庫檔案
極 力建議您運用 WINS 伺服器的 IP 位址來設定 Windows 電腦,以便解析遠端 NetBIOS 名稱。如果這類電腦要與執行 Windows NT、Windows 95、Windows 98、Windows 2000 或 Windows Millennium Edition 這些不是 Active Directory 型的電腦進行通訊,您必須以 WINS 伺服器的 IP 位址設定 Active Directory 型的電腦,例如Windows XP Professional 及 Windows Server 2003 作業系統。
如需 WINS 的相關資訊,請參閱 WINS 定義

WINS

轉:http://baike.baidu.com/view/22282.htm
轉:http://article.pchome.net/content-105388.html

目录
WINS的基本要求
  1. 对于WINS服务器
  2. 对于WINS客户
另一个WINS
WINS解析
  1. 客户端的需求
  2. 解析原理

WINS的基本要求

对于WINS服务器

1. 必须是一台NT server计算机   
2. 使用TCP/IP协议,并且具有一个静态的IP地址。

对于WINS客户

1.要求是运行以下操作系统的计算机:
Windows NT Server 3.5或更高
Windows NT Workstation 3.5或更高
Windows 95
运行Microsoft TCP/IP-32的Windows for Workgroups 3.11
带有实模式TCP/IP驱动的Microsoft Network Client 3.0 for MS-DOS
LAN Manager 2.2c for MS-DOS。不支持LAN Manager 2.2c for OS/2

2.需要WINS server的IP地址
(2)WINS过程
(a)在一个WINS的环境中,每次WINS客户开启计算机并初始化TCP/IP后,它都会将它的NetBIOS名和IP地址的对应关系映射到WINS服务器的数据库中。
(b)当一个WINS客户想和另外一台主机通讯时,它会直接和WINS server联系,查询计算机名和IP地址的关系。
(c)如果WINS服务器在自己的数据库中查到了被查计算机名和IP地址的映射关系,它就将目的计算机的IP 地址返回要求查询的WINS客户。

另一个WINS

Windows Internet Name Service (WINS)
WINS提供一个分布式数据库,它的作用是在路由网络的环境中对IP地址和NetBIOS名的映射进行注册与查询。 这可能是解决NetBIOS名与IP地址之间转换的比较合适的一种方法,对于比较复杂的网络如互联网更是如此。
LMHOSTS文件在广播式系统中有一点缺点,它是基于广播的,所以对网络的通信量是一个沉重的负担,这个问题并未得到解决。有人设计了通过路由协议进行单播式的动作对NetBIOS名字进行注册和解析。如果采用这个协议,那就可以解决了广播的问题,也就没有必要使用LMHOSTS文件了,使动态配置的灵活性与方便性得到重新体现,使得这个系统可以和DHCP协议无缝连接。我们可以想象,当DHCP给一台计算机分配了一个地址后,这个更新可以直接在WINS数据库中体现。用户和管理员都不需要进行任何额外的工作,十分方便。WINS协议可以和NBNS一起工作,但是因为WINS数据库备份的问题没有解决,因为它不能和别的NetBIOS名字服务器一起工作,数据不能在WINS服务器和非WINS服务器间进行复制。
WINS是基于客户服务器模型的,它有两个重要的部分,WINS服务器和WINS客户。我们首 先看一下服务器,它主要负责处理由客户发来名字和IP地址的注册和解除注册信息。如果WINS客户进行查询时,服务器会返回当前查询名下的IP地址。服务 器还负责对数据库进行备份。而客户主要在加入或离开网络时向WIN服务器注册自己的名字或解除注册。当然了,在进行通信的时候它也向服务器进行查询,以确 定远程计算机的地址。
我们使用WINS的好处在什么地方呢?WINS就是以集中的方式进行IP地址和计算机名称的映射,这种方式可以简化网络的管理,减少网络内的通信量,但是这种集中式的管理方式可以和星型结构相比,我们有理由怀疑它可以会成为网络的瓶颈。在本地的域控制器不在路由器管理网段的另一段时,客户仍然可以游览远程域,在集中处理的时候,数据都会集中于这个服务器中,一定要注意不要让这个节点失败。
WINS的另外一个重要特点是可以和DNS进行集成。这使得非WINS客户通过DNS服务器解析获得NetBIOS名。这对于网络管理提供了方便,也为异种网的连接提供了另一种手段。我们可以看到,使用集中管理可以使管理工作大大简化,但是却使网络拓朴结构出 现了中心结点,这是一个隐性的瓶颈,而如果采用分布式的管理方式,却有个一致性的问题,也就是如果一个服务器知道了这个改变,而另一个不知道,那数据就不 一致了,这时候要有一些复杂的算法来解决这一问题,两台服务器要想知道对方的情况,不可能不进行通信,也就无形中加重了网络负担。网络就是这样,集中起来 就加大了单机的处理压力,而分布了就增加了网络传输量,天下没有十全十美的事情。

WINS解析

WINS是Windows Internet Name Server(Windows网际名字服务)的简称。WINS为NetBIOS名字提供名字注册、更新、释放和转换服务,这些服务允许WINS服务器维护一个将NetBIOS名链接到IP地址动态数据库,大大减轻了对网络交通的负担。

客户端的需求

1.Microsoft对服务器的需求
(1).至少提供一个首选WINS服务器和一个次选WINS服务器来提供容错功能。
(2).一个WINS服务器每分钟可以处理近1500个名字注册和约4500个名字查询。因此我们强烈建议你一个首选和一个次选WINS服务器可以带动10000个客户端。
(3).如果WINS服务器与客户机不在同一个子网上,就要考虑到路由器的性能了。

2.客户端的需求
几乎所有的支持网络互联的Microsoft客户端都可以是WINS客户端,下面列出了可以与WINS一起工作的客户端:
*Windows NT Server 3.5x,4.0
*Windows NT Workstation 3.5x,4.0
*Windows 9x/me/2000
*Windows for Workgroups with TCP/IP-32
*Microsoft Network Client 3.0 for MS-DOS
*LAN Manager 2.2c for MS-DOS
基于DOS的客户端也可以用WINS服务器进行名字解析,但你必须为它们在WINS服务器中添加静态词条。
2000以后wins几乎被抛弃
全面转向win2000的DNS系统了~

解析原理

WINS服务的基本工作原理
通常,Windows操作系统支持以下两种主要的网络名称解析方法。
主机名称解析:这是Windows基于套接字的名称解析方式,它执行gethostbyname() API函数以搜索主机IP地址,该地址是建立在已查询的主机名称基础上的。该方法依赖于Hosts文件或查询DNS以执行名称解析功能。
NetBIOS名称解析:该名称解析使用NetBIOS重定向程序来搜索基于查询的NetBIOS名称的地址。该方法依赖于Lmhosts文件,或查询WINS执行名称解析。
在默认情况下,运行Windows 2000/XP/Server 2003操作系统的WINS客户端被配置为先使用DNS解析长度超过15个字符或包含句点(.)的名称。对于少于15个字符,并且不包含句点的名称,如果 将客户端配置为使用DNS服务器,则也可以在WINS查询失败之后再次将DNS用做最终选项。在默认情况下,当用WINS服务器地址配置(手动或通过 DHCP)运行Windows 2000/XP/Server 2003操作系统的计算机的名称解析时,除非配置了其他NetBIOS节点类型,否则计算机将使用混合节点(h-节点)作为NetBIOS名称注册的节点 类型。对于NetBIOS名称查询和解析,也使用h-节点行为,但有少许差异。

WINS服务器和DNS服务器有什么区别?

2006-07-24 CBSi中国·PChome.net 类型: 转载 [评论5条]


  对于许多人来说,WINS服务器和DNS服务器之间的关系还是一件神秘的事情。不过,我们希望用你的问题澄清这个事情。   首先,DNS指的是“域名服务器”,而WINS指的是“Windows互联网名称服务”。两者都是用来解析域名的,但是,使用的方法完全不同!
为了帮助说明这个问题,我准备使用一个例子,保证让你正确地了解这两种服务的情况。
考虑一个名为“Jupiter”的文件服务器和下面两个指令:
Ping Jupiter.space.net
Net use * jupiter mainshare
上面两个指令看起来很相似。第一个指令是向我们的文件服务器发送一个ping (icmp echo)数据包,确认这个服务器在工作。而第二个指令呼叫同一台服务器(jupiter),以便连接到一个名为“mainshare”的共享文件夹。
虽然这两个指令都指向同一台服务器(Jupiter),但是,它们之间的区别是很重要的。
这里的“Ping”使用DNS把Jupiter.space.net解析为一个IP地址,如204.45.12.1。而“net use”指令使用WINS把NetBIOS名称“Jupiter”解析为一个IP地址。
这样,你也许会感到疑惑,为什么有两种不同的服务实际上在完成同一个任务?
这个问题的答案是,这两种服务的每一种服务都依靠不同的协议。他们只是以不同的方式工作。
WINS是微软网 络拓扑的一个重要的组成部分。在过去,你需要在Windows网络中运行一个WINS服务器以避免域名解析的问题。当时的这种 NetBIOS(Windows机器名称)协议只能在NetBEUI传输协议上工作。如果你曾经使用过Windows 95,你会记得NetBEUI协议经常出现在你的网络属性中。在网络属性中,TCP/IP协议也是一个选项。
目前,DNS取代了WINS。由于微软对NetBIOS做了修改,允许它使用TCP/IP堆栈完成其工作(TCP/IP协议上的NetBIOS),大多数DNS服务器都能够处理NetBIOS的请求。这就是WINS服务器变得越来越少的原因。
简言之,DNS把TCP/IP主机名称映射为IP地址,WINS把NetBIOS主机名称映射为IP地址。

Friday, March 18, 2011

linux内核网络栈代码的准备知识

轉:http://blog.csdn.net/cz_hyf/archive/2006/02/19/602802.aspx

 
一.linux内核网络栈代码的准备知识
 
1. linux内核ipv4网络部分分层结构
 

BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。这一部分的文件
 
主要有:/net/socket.c /net/protocols.c etc

INET socket层:BSD socket是个可以用于各种网络协议的接口,而当用于tcp/ip,即建立了AF_INET形式的socket时,
 
还需要保留些额外的参数,于是就有了struct sock结构。文件主要
 
有:/net/ipv4/protocol.c /net/ipv4/af_inet.c /net/core/sock.c etc

TCP/UDP层:处理传输层的操作,传输层用struct inet_protocol和struct proto两个结构表示。文件主要
 
有:/net/ipv4/udp.c /net/ipv4/datagram.c /net/ipv4/tcp.c /net/ipv4/tcp_input.c /net/ipv4//tcp_output.c /net/ipv4/tcp_minisocks.c /net/ipv4/tcp_output.c /net/ipv4/tcp_timer.c
 
etc 
    
IP层:处理网络层的操作,网络层用struct packet_type结构表示。文件主要有:/net/ipv4/ip_forward.c
ip_fragment.c ip_input.c ip_output.c etc.

数据链路层和驱动程序:每个网络设备以struct net_device表示,通用的处理在dev.c中,驱动程序都在/driver/net目
 
录下。
 
2. 两台主机建立udp通信所走过的函数列表
 
^
|       sys_read                fs/read_write.c
|       sock_read               net/socket.c
|       sock_recvmsg            net/socket.c
|       inet_recvmsg            net/ipv4/af_inet.c
|       udp_recvmsg             net/ipv4/udp.c
|       skb_recv_datagram       net/core/datagram.c
|       -------------------------------------------
|       sock_queue_rcv_skb      include/net/sock.h
|       udp_queue_rcv_skb       net/ipv4/udp.c
|       udp_rcv                 net/ipv4/udp.c
|       ip_local_deliver_finish net/ipv4/ip_input.c
|       ip_local_deliver        net/ipv4/ip_input.c
|       ip_recv                 net/ipv4/ip_input.c
|       net_rx_action           net/dev.c
|       -------------------------------------------
|       netif_rx                net/dev.c
|       el3_rx                  driver/net/3c309.c
|       el3_interrupt           driver/net/3c309.c

==========================

|       sys_write               fs/read_write.c
|       sock_writev             net/socket.c                   
|       sock_sendmsg            net/socket.c
|       inet_sendmsg            net/ipv4/af_inet.c
|       udp_sendmsg             net/ipv4/udp.c
|       ip_build_xmit           net/ipv4/ip_output.c
|       output_maybe_reroute    net/ipv4/ip_output.c
|       ip_output               net/ipv4/ip_output.c
|       ip_finish_output        net/ipv4/ip_output.c
|       dev_queue_xmit          net/dev.c
|       --------------------------------------------
|       el3_start_xmit          driver/net/3c309.c
V
 
 
3. 网络路径图、重要数据结构sk_buffer及路由介绍
 
    linux-net.pdf 第2.1章 第2.3章 第2.4章
    
4. 从连接、发送、到接收数据包的过程
 
    linux-net.pdf 第4、5、6章详细阐述
 
 
二.linux的tcp-ip栈代码的详细分析
 
1.数据结构(msghdr,sk_buff,socket,sock,proto_ops,proto)
 
bsd套接字层,操作的对象是socket,数据存放在msghdr这样的数据结构:
 
创建socket需要传递family,type,protocol三个参数,创建socket其实就是创建一个socket实例,然后创建一 个文件描述符结构,并且互相建立一些关联,即建立互相连接的指针,并且初始化这些对文件的写读操作映射到socket的read,write函数上来。
 
同时初始化socket的操作函数(proto_ops结构),如果传入的type参数是STREAM类型,那么就初始化为 SOCKET->ops为inet_stream_ops,如果是DGRAM类型,则SOCKET-ops为inet_dgram_ops。对于 inet_stream_ops其实是一个结构体,包含了stream类型的socket操作的一些入口函数,在这些函数里主要做的是对socket进行 相关的操作,同时通过调用下面提到的sock中的相关操作完成socket到sock层的传递。比如在inet_stream_ops里有个 inet_release的操作,这个操作除了释放socket的类型空间操作外,还通过调用socket连接的sock的close操作,对于 stream类型来说,即tcp_close来关闭sock
释放sock。
 
创建socket同时还创建sock数据空间,初始化sock,初始化过程主要做的事情是初始化三个队列,receive_queue(接收到 的数据包sk_buff链表队列),send_queue(需要发送数据包的sk_buff链表队列),backlog_queue(主要用于tcp中三 次握手成功的那些数据包,自己猜的),根据family、type参数,初始化sock的操作,比如对于family为inet类型的,type为 stream类型的,sock->proto初始化为tcp_prot.其中包括stream类型的协议sock操作对应的入口函数。
 
在一端对socket进行write的过程中,首先会把要write的字符串缓冲区整理成msghdr的数据结构形式(参见linux内核 2.4版源代码分析大全),然后调用sock_sendmsg把msghdr的数据传送至inet层,对于msghdr结构中数据区中的每个数据包,创建 sk_buff结构,填充数据,挂至发送队列。一层层往下层协议传递。一下每层协议不再对数据进行拷贝。而是对sk_buff结构进行操作。
 
inet套接字及以下层 数据存放在sk_buff这样的数据结构里:
 
路由:
    
    在linux的路由系统主要保存了三种与路由相关的数据,第一种是在物理上和本机相连接的主机地址信息表,第二种是保存了在网络访问中判断一个网络地址应该走什么路由的数据表;第三种是最新使用过的查询路由地址的缓存地址数据表。
    1.neighbour结构  neighbour_table{ }是一个包含和本机所连接的所有邻元素的信息的数据结构。该结构中有个元素是neighbour结构的数组,数组的每一个元素都是一个对应于邻机的 neighbour结构,系统中由于协议的不同,会有不同的判断邻居的方式,每种都有neighbour_table{}类型的实例,这些实例是通过 neighbour_table{}中的指针next串联起来的。在neighbour结构中,包含有与该邻居相连的网络接口设备net_device的 指针,网络接口的硬件地址,邻居的硬件地址,包含有neigh_ops{}指针,这些函数指针是直接用来连接传输数据的,包含有 queue_xmit(struct * sk_buff)函数入口地址,这个函数可能会调用硬件驱动程序的发送函数。
 
    2.FIB结构 在FIB中保存的是最重要的路由规则,通过对FIB数据的查找和换算,一定能够获得路由一个地址的方法。系统中路由一般采取的手段是:先到路由缓存中查找 表项,如果能够找到,直接对应的一项作为路由的规则;如果不能找到,那么就到FIB中根据规则换算传算出来,并且增加一项新的,在路由缓存中将项目添加进 去。
    3.route结构(即路由缓存中的结构)
 
 
 
数据链路层:
  
   net_device{}结构,对应于每一个网络接口设备。这个结构中包含很多可以直接获取网卡信息的函数和变量,同时包含很多对于网卡操作的函数,这些 直接指向该网卡驱动程序的许多函数入口,包括发送接收数据帧到缓冲区等。当这些完成后,比如数据接收到缓冲区后便由netif_rx(在net/core /dev.c各种设备驱动程序的上层框架程序)把它们组成sk_buff形式挂到系统接收的backlog队列然后交由上层网络协议处理。同样,对于上层 协议处理下来的那些sk_buff。便由dev_queue_xmit函数放入网络缓冲区,交给网卡驱动程序的发送程序处理。
 
   在系统中存在一张链表dev_base将系统中所有的net_device{}结构连在一起。对应于内核初始化而言,系统启动时便为每个所有可能支持的网 络接口设备申请了一个net_device{}空间并串连起来,然后对每个接点运行检测过程,如果检测成功,则在dev_base链表中保留这个接点,否 则删除。对应于模块加载来说,则是调用register_netdev()注册net_device,在这个函数中运行检测过程,如果成功,则加到 dev_base链表。否则就返回检测不到信息。删除同理,调用
unregister_netdev。
 
 
2.启动分析
 
    2.1 初始化进程 :start-kernel(main.c)---->do_basic_setup(main.c)---->sock_init(/net/socket.c)---->do_initcalls(main.c)
 
void __init sock_init(void){
 int i;
 
 printk(KERN_INFO "Linux NET4.0 for Linux 2.4\n");
 printk(KERN_INFO "Based upon Swansea University Computer Society NET3.039\n");
 
 /*
  * Initialize all address (protocol) families. 每一项表示的是针对一个地址族的操作集合,例如对于ipv4来说,在net/ipv4/af_inet.c文件中的函数 inet_proto_init()就调用sock_register()函数将inet_families_ops初始化到属于IPV4的 net_families数组中的一项。
  */
 
 for (i = 0; i < NPROTO; i++)
  net_families[i] = NULL;  
 
 /*
  * Initialize sock SLAB cache.初始化对于sock结构预留的内存的slab缓存。
  */
 
 sk_init();
 
#ifdef SLAB_SKB
 /*
  * Initialize skbuff SLAB cache 初始化对于skbuff结构的slab缓存。以后对于skbuff的申请可以通过函数kmem_cache_alloc()在这个缓存中申请空间。
  */
 skb_init();
#endif
 
 /*
  * Wan router layer.
  */
 
#ifdef CONFIG_WAN_ROUTER 
 wanrouter_init();
#endif
 
 /*
  * Initialize the protocols module. 向系统登记sock文件系统,并且将其安装到系统上来。
  */
 
 register_filesystem(&sock_fs_type);
 sock_mnt = kern_mount(&sock_fs_type);
 /* The real protocol initialization is performed when
  *  do_initcalls is run. 
  */

 /*
  * The netlink device handler may be needed early.
  */
 
#ifdef CONFIG_NET
 rtnetlink_init();
#endif
#ifdef CONFIG_NETLINK_DEV
 init_netlink();
#endif
#ifdef CONFIG_NETFILTER
 netfilter_init();
#endif
 
#ifdef CONFIG_BLUEZ
 bluez_init();
#endif
 
/*yfhuang ipsec*/
#ifdef CONFIG_IPSEC           
 pfkey_init();
#endif
/*yfhuang ipsec*/
}
 
 
    2.2 do_initcalls() 中做了其它的初始化,其中包括
 
                协议初始化,路由初始化,网络接口设备初始化
 
(例如inet_init函数以_init开头表示是系统初始化时做,函数结束后跟 module_init(inet_init),这是一个宏,在include/linux/init.c中定义,展开为 _initcall(inet_init),表示这个函数在do_initcalls被调用了)
 
    2.3 协议初始化
此处主要列举inet协议的初始化过程。
 
static int __init inet_init(void)
{
 struct sk_buff *dummy_skb;
 struct inet_protocol *p;
 struct inet_protosw *q;
 struct list_head *r;
 
 printk(KERN_INFO "NET4: Linux TCP/IP 1.0 for NET4.0\n");
 
 if (sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb)) {
  printk(KERN_CRIT "inet_proto_init: panic\n");
  return -EINVAL;
 }
 
 /*
  * Tell SOCKET that we are alive... 注册socket,告诉socket inet类型的地址族已经准备好了
  */
  
   (void) sock_register(&inet_family_ops);
 
 /*
  * Add all the protocols. 包括arp,ip、ICMP、UPD、tcp_v4、tcp、igmp的初始化,主要初始化各种协议对应的inode和socket变量。
 
其中arp_init完成系统中路由部分neighbour表的初始化
 
ip_init完成ip协议的初始化。在这两个函数中,都通过定义一个packet_type结构的变量将这种数据包对应的协议发送数据、允许发送设备都做初始化。

  */
 
 printk(KERN_INFO "IP Protocols: ");
 for (p = inet_protocol_base; p != NULL;) {
  struct inet_protocol *tmp = (struct inet_protocol *) p->next;
  inet_add_protocol(p);
  printk("%s%s",p->name,tmp?", ":"\n");
  p = tmp;
 }
 
 /* Register the socket-side information for inet_create. */
 for(r = &inetsw[0]; r < &inetsw[SOCK_MAX]; ++r)
  INIT_LIST_HEAD(r);
 
 for(q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q)
  inet_register_protosw(q);
 
 /*
  * Set the ARP module up 
  */
 
 arp_init();
 
   /*
    * Set the IP module up
    */
 
 ip_init();
 
 tcp_v4_init(&inet_family_ops);
 
 /* Setup TCP slab cache for open requests. */
 tcp_init();

 /*
  * Set the ICMP layer up
  */
 
 icmp_init(&inet_family_ops);
 
 /* I wish inet_add_protocol had no constructor hook...
    I had to move IPIP from net/ipv4/protocol.c :-( --ANK
  */
#ifdef CONFIG_NET_IPIP
 ipip_init();
#endif
#ifdef CONFIG_NET_IPGRE
 ipgre_init();
#endif
 
 /*
  * Initialise the multicast router
  */
#if defined(CONFIG_IP_MROUTE)
 ip_mr_init();
#endif
 
 /*
  * Create all the /proc entries.
  */
#ifdef CONFIG_PROC_FS
 proc_net_create ("raw", 0, raw_get_info);
 proc_net_create ("netstat", 0, netstat_get_info);
 proc_net_create ("snmp", 0, snmp_get_info);
 proc_net_create ("sockstat", 0, afinet_get_info);
 proc_net_create ("tcp", 0, tcp_get_info);
 proc_net_create ("udp", 0, udp_get_info);
#endif  /* CONFIG_PROC_FS */
 
 ipfrag_init();
 
 return 0;
}   
module_init(inet_init);
                                                 
 
     2.4 路由初始化(包括neighbour表、FIB表、和路由缓存表的初始化工作)
 
            2.4.1 rtcache表 ip_rt_init()函数 在net/ipv4/ip_output中调用,net/ipv4/route.c中定义
 
            2.4.2 FIB初始化 在ip_rt_init()中调用 在net/ipv4/fib_front.c中定义
 
           2.4.3 neigbour表初始化  arp_init()函数中定义 
 
     2.5 网络接口设备初始化
             
             在系统中网络接口都是由一个dev_base链表进行管理的。通过内核的启动方式也是通过这个链表进行操作的。在系 统启动之初,将所有内核能够支持的网络接口都初始化成这个链表中的一个节点,并且每个节点都需要初始化出init函数指针,用来检测网络接口设备。然后, 系统遍历整个dev_base链表,对每个节点分别调用init函数指针,如果成功,证明网络接口设备可用,那么这个节点就可以进一步初始化,如果返回失 败,那么证明该网络设备不存在或是不可用,只能将该节点删除。启动结束之后,在dev_base中剩下的都是可以用的网络接口设备。
 
            2.5.1 do_initcalls---->net_dev_init()(net/core /dev.c)------>ethif_probe()(drivers/net/Space.c,在netdevice{}结构的init中调 用,这边ethif_probe是以太网卡针对的调用)
 
 
 
3.网络设备驱动程序(略)
        
 
4.网络连接
 
     4.1 连接的建立和关闭
 
            tcp连接建立的代码如下:
                    server=gethostbyname(SERVER_NAME);
                    sockfd=socket(AF_INET,SOCK_STREAM,0);
                    address.sin_family=AF_INET;
                    address.sin_port=htons(PORT_NUM);
                    memcpy(&address.sin_addr,server->h_addr,server->h_length);
                    connect(sockfd,&address,sizeof(address));
 
       连接的初始化与建立期间主要发生的事情如下:
                      
       1)sys_socket调用:调用socket_creat(),创建出一个满足传入参数family、type、和 protocol的socket,调用sock_map_fd()获取一个未被使用的文件描述符,并且申请并初始化对应的file{}结构。
        
       2)sock_creat():创建socket结构,针对每种不同的family的socket结构的初始化,就需要调用不同 的create函数来完成。对应于inet类型的地址来说,在网络协议初始化时调用sock_register()函数中完成注册的定义如下:
        struct net_proto_family inet_family_ops={
                PF_INET;
                inet_create
        };所以inet协议最后会调用inet_create函数。
        
       3)inet_create: 初始化sock的状态设置为SS_UNCONNECTED,申请一个新的sock结构,并且初始化socket的成员ops初始化为 inet_stream_ops,而sock的成员prot初始化为tcp_prot。然后调用sock_init_data,将该socket结构的变 量sock和sock类型的变量关联起来。
 
       4)在系统初始化完毕后便是进行connect的工作,系统调用connect将一个和socket结构关联的文件描述符和一个 sockaddr{}结构的地址对应的远程机器相关联,并且调用各个协议自己对应的connect连接函数。对应于tcp类型,则 sock->ops->connect便为inet_stream_connect。
 
 
       5)inet_stream_connect: 得到sk,sk=sock->sk,锁定sk,对自动获取sk的端口号存放在sk->num中,并且用htons()函数转换存放在sk-& gt;sport中。然后调用sk->prot->connect()函数指针,对tcp协议来说就是tcp_v4_connect()函 数。然后将sock->state状态字设置为SS_CONNECTING,等待后面一系列的处理完成之后,就将状态改成 SS_CONNECTTED。
 
       6) tcp_v4_connect():调用函数ip_route_connect(),寻找合适的路由存放在rt中。ip_route_connect找两 次,第一次找到下一跳的ip地址,在路由缓存或fib中找到,然后第二次找到下一跳的具体邻居,到neigh_table中找到。然后申请出tcp头的空 间存放在buff中。将sk中相关地址数据做一些针对路由的变动,并且初始化一个tcp连接的序列号,调用函数tcp_connect(),初始化tcp 头,并设置tcp处理需要的定时器。一次connect()建立的过程就结束了。
 
       连接的关闭主要如下:
 
        1)close: 一个socket文件描述符对应的file{}结构中,有一个file_operations{}结构的成员f_ops,它的初始化关闭函数为sock_close函数。
 
        2)sock_close:调用函数sock_release(),参数为一个socket{}结构的指针。
 
        3)sock_release:调用inet_release,并释放socket的指针和文件空间
 
        4)inet_release: 调用和该socket对应协议的关闭函数inet_release,如果是tcp协议,那么调用的是tcp_close;最后释放sk。
 
        4.2 数据发送流程图
 
 
 
各层主要函数以及位置功能说明:
        1)sock_write:初始化msghdr{}结构 net/socket.c
        2)sock_sendmsg:net/socket.c
        3)inet_sendmsg:net/ipv4/af_net.c
        4)tcp_sendmsg:申请sk_buff{}结构的空间,把msghdr{}结构中的数据填入sk_buff空间。net/ipv4/tcp.c
        5)tcp_send_skb:net/ipv4/tcp_output.c
        6)tcp_transmit_skb:net/ipv4/tcp_output.c
        7)ip_queue_xmit:net/ipv4/ip_output.c
        8)ip_queue_xmit2:net/ipv4/ip_output.c
        9)ip_output:net/ipv4/ip_output.c
        10)ip_finish_output:net/ipv4/ip_output.c
        11)ip_finish_output2:net/ipv4/ip_output.c
        12)neigh_resolve_output:net/core/neighbour.c
        13)dev_queue_xmit:net/core/dev.c
 
 
        4.3 数据接收流程图
 
各层主要函数以及位置功能说明:
 
        1)sock_read:初始化msghdr{}的结构类型变量msg,并且将需要接收的数据存放的地址传给msg.msg_iov->iov_base.      net/socket.c
        2)sock_recvmsg: 调用函数指针sock->ops->recvmsg()完成在INET Socket层的数据接收过程.其中sock->ops被初始化为inet_stream_ops,其成员recvmsg对应的函数实现为 inet_recvmsg()函数. net/socket.c
        3)sys_recv()/sys_recvfrom():分别对应着面向连接和面向无连接的协议两种情况. net/socket.c
        4)inet_recvmsg:调用sk->prot->recvmsg函数完成数据接收,这个函数对于tcp协议便是tcp_recvmsg net/ipv4/af_net.c
        5)tcp_recvmsg:从网络协议栈接收数据的动作,自上而下的触发动作一直到这个函数为止,出现了一次等待的过程.函 数tcp_recvmsg可能会被动地等待在sk的接收数据队列上,也就是说,系统中肯定有其他地方会去修改这个队列使得tcp_recvmsg可以进行 下去.入口参数sk是这个网络连接对应的sock{}指针,msg用于存放接收到的数据.接收数据的时候会去遍历接收队列中的数据,找到序列号合适的.
        但读取队列为空时tcp_recvmsg就会调用tcp_v4_do_rcv使用backlog队列填充接收队列.
        6)tcp_v4_rcv:tcp_v4_rcv被ip_local_deliver函数调用,是从IP层协议向INET Socket层提交的"数据到"请求,入口参数skb存放接收到的数据,len是接收的数据的长度,这个函数首先移动skb->data指针,让它 指向tcp头,然后更新tcp层的一些数据统计,然后进行tcp的一些值的校验.再从INET Socket层中已经建立的sock{}结构变量中查找正在等待当前到达数据的哪一项.可能这个sock{}结构已经建立,或者还处于监听端口、等待数据 连接的状态。返回的sock结构指针存放在sk中。然后根据其他进程对sk的操作情况,将skb发送到合适的位置.调用如下:
 
        TCP包接收器(tcp_v4_rcv)将TCP包投递到目的套接字进行接收处理. 当套接字正被用户锁定,TCP包将暂时排入该套接字的后备队列(sk_add_backlog).这时如果某一用户线程企图锁定该套接字 (lock_sock),该线程被排入套接字的后备处理等待队列(sk->lock.wq).当用户释放上锁的套接字时 (release_sock,在tcp_recvmsg中调用),后备队列中的TCP包被立即注入TCP包处理器(tcp_v4_do_rcv)进行处 理,然后唤醒等待队列中最先的一个用户来获得其锁定权. 如果套接字未被上锁,当用户正在读取该套接字时, TCP包将被排入套接字的预备队列(tcp_prequeue),将其传递到该用户线程上下文中进行处理.如果添加到sk->prequeue不成 功,便可以添加到 sk->receive_queue队列中(用户线程可以登记到预备队列,当预备队列中出现第一个包时就唤醒等待线程.)   /net/tcp_ipv4.c
 
        7)ip_rcv、ip_rcv_finish:从以太网接收数据,放到skb里,作ip层的一些数据及选项检查,调用 ip_route_input()做路由处理,判断是进行ip转发还是将数据传递到高一层的协议.调用skb->dst->input函数指 针,这个指针的实现可能有多种情况,如果路由得到的结果说明这个数据包应该转发到其他主机,这里的input便是ip_forward;如果数据包是给本 机的,那么input指针初始化为ip_local_deliver函数./net/ipv4/ip_input.c
 
        8)ip_local_deliver、ip_local_deliver_finish:入口参数skb存放需要传送到上层 协议的数据,从ip头中获取是否已经分拆的信息,如果已经分拆,则调用函数ip_defrag将数据包重组。然后通过调用 ip_prot->handler指针调用tcp_v4_rcv(tcp)。ip_prot是inet_protocol结构指针,是用来ip层登 记协议的,比如由udp,tcp,icmp等协议。 /net/ipv4/ip_input.c
 

Thursday, March 17, 2011

ALG Technique White Paper

轉:http://www.eefocus.com/Matthew/blog/10-07/193040_ce6a7.html

ALG技术白皮书
关键词:ALGNATASPF,会话
    要:ALG是一种对应用层进行处理的技术,它通过与NATASPF等技术的组合应用,实现对应用层的处理和检测。本文详细介绍了ALG技术的工作机制以及典型组网应用。
缩略语:
缩略语
英文全名
中文解释
ALG
Application Level Gateway
应用层网关
ASPF
Application Specific Packet Filter
基于应用层状态的包过滤
DNS
Domain Name System
域名系统
FTP
File Transfer Protocol
文件传输协议
ILS
Internet Locator Service
Internet定位服务
LDAP
Lightweight Directory Access Protocol
轻量级目录访问协议
NAT
Network Address Translation
网络地址转换
NBT
Network Basic Input/Output System Based TCP/IP
基于TCP/IP的网络基本输入/输出系统
RTSP
Real-Time Streaming Protocol
实时流协议
SIP
Session Initiation Protocol
会话发起协议






概述

1.1  产生背景

在应用层协议中,有很多协议都包含多通道的信息,比如多媒体协议(H.323SIP等)、FTPSQLNET等。这种多通道的应用需要首先在控制通道中对后续数据通道的地址和端口进行协商,然后根据协商结果创建多个数据通道连接。在NAT的实际应用过程中,NAT仅对网络层报文的报文头进行IP地址的识别和转换,对于应用层协议协商过程中报文载荷携带的地址信息则无法进行识别和转换,因此在有NAT处理的组网方案中,NAT利用ALG技术可以对多通道协议进行应用层的报文信息的解析和地址转换,保证应用层上通信的正确性。
在传统的包过滤防火墙中,也会遇到类似问题。由于包过滤防火墙是基于IP包中的源地址、目的地址、源端口和目的端口来判断是否允许包通过,这种基于静态IP包头的匹配虽然可以允许或者拒绝特定的应用层服务,但无法理解服务的上下文会话,而且对于多通道的应用层协议,其数据通道是动态协商的,无法预先知道数据通道的地址和端口,无法制定完善的安全策略。ASPF利用ALG技术便可以解决包过滤防火墙遇到的问题,实现对多通道应用协议的动态检测。
综上所述,ALGNATASPF特性的配合使用,可以解决这些特性遇到的应用层协议的多通道问题,进而可以协助网络设备实现整体的网络安全解决方案。

1.2  技术优点

ALGNATASPF等特性配合使用,为内部网络和外部网络之间的通信提供基于应用的访问控制,具有以下优点:
l              ALG统一对各应用层协议报文进行解析处理,避免了NATASPF特性对同一类报文应用层协议的重复解析,可以有效提高报文转发效率。
l              ALG的状态检测是基于应用层协议的,能够监听每一个应用的每个连接所使用的端口,打开合适的通道允许会话中的数据穿过防火墙,在会话结束时关闭该通道,从而实现对动态端口应用的有效访问控制。
l              可支持多种应用层协议:DNSFTPH.323(包括RASH.225H.245)、HTTPICMPILSMSN/QQNBTRTSPSIPSQLNETTFTP

ALG技术实现

2.1  概念介绍

l              会话:记录了传输层报文之间的交互信息,包括源IP地址、源端口、目的IP地址、目的端口,协议类型和源/目的IP地址所属的VPN实例。交互信息相同的报文属于一条流,通常情况下,一个会话对应正反两条流,一条流对应一个方向上的一个会话。
l              动态通道:当应用层协议报文中携带地址信息时,这些地址信息会被用于建立动态通道,后续符合该地址信息的连接将使用已经建立的动态通道来传输数据。

2.2  ALG技术实现原理

ALG技术配合NAT特性可支持对报文载荷的地址转换功能;配合ASPF特性可支持动态通道的检测功能,以及对应用层的状态检测功能。
下文将结合具体的应用协议工作过程,分别对以上三个ALG技术的实现原理进行介绍。

2.2.1  报文载荷的地址转换

对于多通道应用协议,IP报文数据载荷中携带了地址信息,在NAT的组网环境中,为保证后续动态通道的正确建立,这些数据载荷中的地址也需要进行转换,ALG的作用就是对载荷中的地址进行转换。
下面以多通道应用协议FTPDNSICMPNAT组网环境中的ALG应用来具体说明报文载荷的转换过程。

1. FTPALG应用

图1 FTP报文载荷的ALG处理示意图
1所示,私网侧的主机要访问公网的FTP服务器。NAT设备上配置了私网地址192.168.0.10到公网地址50.10.10.10的映射,实现地址的NAT转换,以支持私网主机对公网的访问。在该组网中,如果没有ALG对报文载荷的处理,私网主机发送的Port报文到达服务器端后,服务器无法识别该报文载荷中的私网地址,也就无法建立正确的数据连接。下面是应用了ALGFTP连接建立过程。
(1)        首先,私网主机和公网FTP服务器之间通过TCP三次握手成功建立控制连接。
(2)        控制连接建立后,私网主机向FTP服务器发送Port报文,报文中携带私网主机指定的数据连接的目的地址和端口,用于通知服务器使用该地址和端口和自己进行数据连接。
(3)        Port报文在经过支持ALG特性的NAT设备时,报文载荷中的私网地址和端口会被转换成对应的公网地址和端口。即,设备将收到的Port报文载荷中的 私网地址192.168.0.10转换成公网地址50.10.10.10,端口1024转换成5000
(4)        公网的FTP服务器收到Port报文后,解析其内容,并向私网主机发起数据连接,该数据连接的目的地址为50.10.10.10,端口为5000。由于该目的地址是一个公网地址,因此后续的数据连接就能够成功建立,从而实现私网主机对公网服务器的访问。

2. DNSALG应用

图2 DNS报文载荷的ALG处理示意图
2所示,私网侧主机要访问内部WWW服务器(域名为www.abc.com,对外公网地址为50.10.10.10),它所询问的DNS服务器在公网。
(1)        首先,私网主机向公网的DNS服务器发起DNS查询。
(2)        DNS服务器收到查询报文后进行查询处理,并将查询到的结果(域名www.abc.com对应IP地址50.10.10.10)放在DNS响应报文(DNS Answer)中发送给私网主机对应的公网地址。
(3)        DNS响应报文在到达具有ALG特性的NAT设备时,报文载荷中的公网地址会被映射成为内部WWW服务器的私网地址。即,NAT设备将收到的DNS响应报文数据载荷中的IP地址50.10.10.10替换为192.168.0.10后,将DNS响应报文发往私网。
(4)        这样,私网主机收到的DNS响应报文中就携带了www.abc.com的私网IP地址,从而实现私网客户端通过公网DNS服务器以域名方式访问私网服务器的功能。

3. ICMP差错报文的ALG应用

图3 ICMP差错报文载荷的ALG处理示意图
3所示,公网侧的主机要访问私网中的FTP服务器,该内部服务器对外的公网地址为50.10.10.10。若内部FTP服务器的21端口未打开,那么它会向主机发送一个ICMP差错报文。
由于该差错报文的数据载荷中的IP地址信息是被NAT处理过的,因此其数据载荷中的地址信息为私网IP地址。在这种情况下,如果未经过ALG处理的ICMP差错报文从私网发送到公网,那么公网主机就无法识别该差错报文属于哪个应用程序,同时也会将FTP服务器的私网地址泄漏到公网中。
因此,当该ICMP差错报文到达NAT设备时,ALG会根据原始FTP会话的地址转换信息记录,将其数据载荷中的私网地址192.168.0.10还原成公网地址50.10.10.10,再将该ICMP差错报文发送到公网。这样,公网主机就可以正确识别出错的应用程序,同时也避免了私网地址的泄漏。

2.2.2  动态通道检测

多通道协议的报文交互过程中需要协商动态通道的地址和端口,在ASPF的组网环境中,ALG通过记录报文交互过程中的动态通道地址和端口,与ASPF特性相配合决定允许哪些报文通过。
下面通过两种常见的组网情况来具体介绍一下动态通道检测的原理。

1. 私网主机访问公网提供的服务

图4 ALG支持动态通道的报文穿越防火墙
4所示,私网主机访问公网的FTP服务器。通常情况下,防火墙上的ASPF会禁止公网主动发起的报文进入私网内部,以实现保护内部网络的目的。当FTP连接进行动态通道协商时,私网主机向FTP服务器发送Port报文。Port报文经过防火墙时,ALG记录其中的IP地址和端口号(IPPort),并把它们作为该连接产生的动态通道信息。之后,ASPF仅允许公网主动发起并符合动态通道信息的报文通过防火墙设备进入私网。如果没有ALG的支持,服务器发起的数据连接将被阻挡在防火墙之外,主机和服务器之间就无法成功建立FTP动态通道。
从上述过程可以看出,在ASPFALG的配和工作下,防火墙既支持了私网访问公网服务器的正常功能,又拒绝了其他不属于该连接的网络流量访问私网。

2. 私网和公网之间的端对端访问

有一些应用协议(比如QQ/MSN)的ALG处理和上面的FTP应用稍有不同。QQ/MSN用户在上线后,通常会建立一对多的连接,而且还会出现由公网主动发起连接的情况。对于以上这样的情况,ALG同样可以支持。
图5 对于某些特殊应用,ALG允许公网端首先发起连接
5所示,Host A上的QQ的客户端,向公网服务器发送上线请求,ALG对上线请求报文进行解析,并根据客户端地址等信息建立动态通道。Host A成功上线之后,公网中Host BHost A发送的QQ应用报文便可以根据已经建立的动态通道穿过防火墙,而来自Host B的其他报文,或者其他未知的网络流量都会被防火墙丢弃。通过这样的方式,ALG在支持各种类型应用程序正常功能的同时也保护了内部私网。

2.2.3  应用层状态检测

ASPF的组网环境中,ALG技术可以对应用层状态进行跟踪检测。各种应用程序通常都有相对稳定的报文交互过程,如果不符合该交互过程,则很有可能是异常的报文攻击。ALG通过解析、记录应用层报文的状态信息,记录会话的上下文信息,对即将到来的报文做预测,对于不符合要求的报文进行丢弃,实现应用层状态的跟踪检测。

1. FTP应用的状态检测

图6 防火墙进行FTP应用层状态检测原理
6所示,公网主机和私网的FTP服务器建立TCP连接后,FTP服务器开始等待主机发送USER命令进行用户认证,之后主机发出的USER命令便可以正常穿过防火墙到达私网。FTP服务器收到USER命令后,要求用户在主机上输入密码。这时,主机应该发送PASS命令,如果主机没有发送PASS命令,而是发送PORT或者PASV等等其它类型的命令或报文,则会被防火墙的ALG丢弃。

2. SIP应用的状态检测

图7 防火墙进行SIP应用层状态检测原理
7所示,私网内部的终端1和公网的终端2进行通信,在终端1发送Invite请求后,对该请求的正常响应能够通过防火墙,比如图中的180响应报文,但是其它类型的报文,比如Register或者Options报文,由于不属于该会话的正常响应,则会被防火墙的ALG丢弃。

2.3  应用限制

l              ALG技术是安全防御特性的一部分,应该和NAT或者ASPF配合使用来组成整体的防火墙安全方案。
l              由于ALG对于各应用的支持需要分别进行专门的协议解析,因此每一种新的应用协议都需要单独进行支持。

典型组网应用

3.1  ALG支持FTP的典型组网应用

图8 ALG支持FTP的典型组网应用
8所示,私网侧某公司通过启用了NATASPFALG功能的防火墙设备连接到Internet,公司内部对外提供FTP服务。通过NATALG的配合,可以满足私网用户访问公网资源的需求,并可以支持公网主机访问私网内部服务器的功能。通过 ASPFALG的配合,拒绝外部未知网络流量,达到保护内部网络的目的。

Thursday, March 10, 2011

proc性能優化參考

proc性能優化參考
一、前言
本文檔針對OOP8生產環境,具體優化策略需要根据實際情況進行調整;本文檔將在以下几個方面來闡述如何針對RedHat Enterprise Linux進行性能優化。
1)     Linux Proc文件系統,通過對Proc文件系統進行調整,達到性能優化的目的。
2)     Linux性能診斷工具,介紹如何使用Linux自帶的診斷工具進行性能診斷。
加粗斜體表示可以直接運行的命令。
下划線表示文件的內容。
二、/proc/sys/kernel/優化
1)     /proc/sys/kernel/ctrl-alt-del
該文件有一個二進制值,該值控制系統在接收到ctrl+alt+delete按鍵組合時如何反應。這兩個值分別是:
零(0)值,表示捕獲ctrl+alt+delete,並將其送至 init 程序;這將允許系統可以安全地關閉和重啟,就好象輸入shutdown命令一樣。
壹(1)值,表示不捕獲ctrl+alt+delete,將執行非正常的關閉,就好象直接關閉電源一樣。
缺省設置:0
建議設置:1,防止意外按下ctrl+alt+delete導致系統非正常重啟。
2)     proc/sys/kernel/msgmax
該文件指定了從一個進程發送到另一個進程的消息的最大長度(bytes)。進程間的消息傳遞是在內核的內存中進行的,不會交換到磁盤上,所以如果增加該值,則將增加操作系統所使用的內存數量。
缺省設置:8192
3)     /proc/sys/kernel/msgmnb
該文件指定一個消息隊列的最大長度(bytes)。
缺省設置:16384
4)     /proc/sys/kernel/msgmni
該文件指定消息隊列標識的最大數目,即系統范圍內最大多少個消息隊列。
缺省設置:16
5)     /proc/sys/kernel/panic
該文件表示如果發生“內核嚴重錯誤(kernel panic)”,則內核在重新引導之前等待的時間(以秒為單位)。
零(0)秒,表示在發生內核嚴重錯誤時將禁止自動重新引導。
缺省設置:0
6)     proc/sys/kernel/shmall
該文件表示在任何給定時刻,系統上可以使用的共享內存的總量(bytes)。
缺省設置:2097152
7)     /proc/sys/kernel/shmmax
該文件表示內核所允許的最大共享內存段的大小(bytes)。
缺省設置:33554432
建議設置:物理內存 * 50%
實際可用最大共享內存段大小=shmmax * 98%,其中大約2%用于共享內存結构。
可以通過設置shmmax,然后執行ipcs -l來驗証。
8)     /proc/sys/kernel/shmmni
該文件表示用于整個系統的共享內存段的最大數目(個)。
缺省設置:4096
9)     /proc/sys/kernel/threads-max
該文件表示內核所能使用的線程的最大數目。
缺省設置:2048
10) /proc/sys/kernel/sem
該文件用于控制內核信號量,信號量是System VIPC用于進程間通訊的方法。
建議設置:250 32000 100 128
第一列,表示每個信號集中的最大信號量數目。
第二列,表示系統范圍內的最大信號量總數目。
第三列,表示每個信號發生時的最大系統操作數目。
第四列,表示系統范圍內的最大信號集總數目。
所以,(第一列)*(第四列)=(第二列)
以上設置,可以通過執行ipcs -l來驗証。
11) 待續。。。
三、/proc/sys/vm/優化
1)     /proc/sys/vm/block_dump
該文件表示是否打開Block Debug模式,用于記錄所有的讀寫及Dirty Block寫回動作。
缺省設置:0,禁用Block Debug模式
2)     /proc/sys/vm/dirty_background_ratio
該文件表示臟數据到達系統整體內存的百分比,此時触發pdflush進程把臟數据寫回磁盤。
缺省設置:10
3)     /proc/sys/vm/dirty_expire_centisecs
該文件表示如果臟數据在內存中駐留時間超過該值,pdflush進程在下一次將把這些數据寫回磁盤。
缺省設置:3000(1/100秒)
4)     /proc/sys/vm/dirty_ratio
該文件表示如果進程產生的臟數据到達系統整體內存的百分比,此時進程自行把臟數据寫回磁盤。
缺省設置:40
5)     /proc/sys/vm/dirty_writeback_centisecs
該文件表示pdflush進程周期性間隔多久把臟數据寫回磁盤。
缺省設置:500(1/100秒)
6)     /proc/sys/vm/vfs_cache_pressure
該文件表示內核回收用于directory和inode cache內存的傾向;缺省值100表示內核將根据pagecache和swapcache,把directory和inode cache保持在一個合理的百分比;降低該值低于100,將導致內核傾向于保留directory和inode cache;增加該值超過100,將導致內核傾向于回收directory和inode cache。
缺省設置:100
7)     /proc/sys/vm/min_free_kbytes
該文件表示強制Linux VM最低保留多少空閑內存(Kbytes)。
缺省設置:724(512M物理內存)
8)     /proc/sys/vm/nr_pdflush_threads
該文件表示當前正在運行的pdflush進程數量,在I/O負載高的情況下,內核會自動增加更多的pdflush進程。
缺省設置:2(只讀)
9)     /proc/sys/vm/overcommit_memory
該文件指定了內核針對內存分配的策略,其值可以是0、1、2。
0, 表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。
1, 表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。
2, 表示內核允許分配超過所有物理內存和交換空間總和的內存(參照overcommit_ratio)。
缺省設置:0
10) /proc/sys/vm/overcommit_ratio
該文件表示,如果overcommit_memory=2,可以過載內存的百分比,通過以下公式來計算系統整體可用內存。
系統可分配內存=交換空間+物理內存*overcommit_ratio/100
缺省設置:50(%)
11) /proc/sys/vm/page-cluster
該文件表示在寫一次到swap區的時候寫入的頁面數量,0表示1頁,1表示2頁,2表示4頁。
缺省設置:3(2的3次方,8頁)
12) /proc/sys/vm/swapiness
該文件表示系統進行交換行為的程度,數值(0-100)越高,越可能發生磁盤交換。
缺省設置:60
13) legacy_va_layout
該文件表示是否使用最新的32位共享內存mmap()系統調用,Linux支持的共享內存分配方式包括mmap(),Posix,System VIPC。
0, 使用最新32位mmap()系統調用。
1, 使用2.4內核提供的系統調用。
缺省設置:0
14) nr_hugepages
該文件表示系統保留的hugetlb頁數。
15) hugetlb_shm_group
該文件表示允許使用hugetlb頁創建System VIPC共享內存段的系統組ID。
16) 待續。。。
四、/proc/sys/fs/優化
1)     /proc/sys/fs/file-max
該文件指定了可以分配的文件句柄的最大數目。如果用戶得到的錯誤消息聲明由于打開
文件數已經達到了最大值,從而他們不能打開更多文件,則可能需要增加該值。
缺省設置:4096
建議設置:65536
2)     /proc/sys/fs/file-nr
該文件與 file-max 相關,它有三個值:
已分配文件句柄的數目
已使用文件句柄的數目
文件句柄的最大數目
該文件是只讀的,僅用于顯示信息。
3)     待續。。。
五、/proc/sys/net/core/優化
該目錄下的配置文件主要用來控制內核和網絡層之間的交互行為。
1) /proc/sys/net/core/message_burst
寫新的警告消息所需的時間(以 1/10 秒為單位);在這個時間內系統接收到的其它警告消息會被丟棄。這用于防止某些企圖用消息“淹沒”系統的人所使用的拒絕服務(Denial of Service)攻擊。
缺省設置:50(5秒)
2) /proc/sys/net/core/message_cost
該文件表示寫每個警告消息相關的成本值。該值越大,越有可能忽略警告消息。
缺省設置:5
3) /proc/sys/net/core/netdev_max_backlog
該文件表示在每個網絡接口接收數据包的速率比內核處理這些包的速率快時,允許送到隊列的數据包的最大數目。
缺省設置:300
4) /proc/sys/net/core/optmem_max
該文件表示每個套接字所允許的最大緩沖區的大小。
缺省設置:10240
5) /proc/sys/net/core/rmem_default
該文件指定了接收套接字緩沖區大小的缺省值(以字節為單位)。
缺省設置:110592
6) /proc/sys/net/core/rmem_max
該文件指定了接收套接字緩沖區大小的最大值(以字節為單位)。
缺省設置:131071
7) /proc/sys/net/core/wmem_default
該文件指定了發送套接字緩沖區大小的缺省值(以字節為單位)。
缺省設置:110592
8) /proc/sys/net/core/wmem_max
該文件指定了發送套接字緩沖區大小的最大值(以字節為單位)。
缺省設置:131071
9) 待續。。。
六、/proc/sys/net/ipv4/優化
1)     /proc/sys/net/ipv4/ip_forward
該文件表示是否打開IP轉發。
0,禁止
1,轉發
缺省設置:0
2)     /proc/sys/net/ipv4/ip_default_ttl
該文件表示一個數据報的生存周期(Time To Live),即最多經過多少路由器。
缺省設置:64
增加該值會降低系統性能。
3)     /proc/sys/net/ipv4/ip_no_pmtu_disc
該文件表示在全局范圍內關閉路徑MTU探測功能。
缺省設置:0
4)     /proc/sys/net/ipv4/route/min_pmtu
該文件表示最小路徑MTU的大小。
缺省設置:552
5)     /proc/sys/net/ipv4/route/mtu_expires
該文件表示PMTU信息緩存多長時間(秒)。
缺省設置:600(秒)
6)     /proc/sys/net/ipv4/route/min_adv_mss
該文件表示最小的MSS(Maximum Segment Size)大小,取決于第一跳的路由器MTU。
缺省設置:256(bytes)
6.1 IP Fragmentation
1)     /proc/sys/net/ipv4/ipfrag_low_thresh/proc/sys/net/ipv4/ipfrag_low_thresh
兩個文件分別表示用于重組IP分段的內存分配最低值和最高值,一旦達到最高內存分配值,其它分段將被丟棄,直到達到最低內存分配值。
缺省設置:196608(ipfrag_low_thresh)
262144(ipfrag_high_thresh)
2)     /proc/sys/net/ipv4/ipfrag_time
該文件表示一個IP分段在內存中保留多少秒。
缺省設置:30(秒)
6.2 INET Peer Storage
1)     /proc/sys/net/ipv4/inet_peer_threshold
INET對端存儲器某個合適值,當超過該閥值條目將被丟棄。該閥值同樣決定生存
時間以及廢物收集通過的時間間隔。條目越多,存活期越低,GC 間隔越短。
缺省設置:65664
2)     /proc/sys/net/ipv4/inet_peer_minttl
條目的最低存活期。在重組端必須要有足夠的碎片(fragment)存活期。這個最低
存活期必須保証緩沖池容積是否少于 inet_peer_threshold。該值以 jiffies為
單位測量。
缺省設置:120
3)     /proc/sys/net/ipv4/inet_peer_maxttl
條目的最大存活期。在此期限到達之后,如果緩沖池沒有耗盡壓力的話(例如:緩
沖池中的條目數目非常少),不使用的條目將會超時。該值以 jiffies為單位測量。
缺省設置:600
4)     /proc/sys/net/ipv4/inet_peer_gc_mintime
廢物收集(GC)通過的最短間隔。這個間隔會影響到緩沖池中內存的高壓力。 該值
以 jiffies為單位測量。
缺省設置:10
2006-10-31 16:33 清水飄萍
5)     /proc/sys/net/ipv4/inet_peer_gc_maxtime
廢物收集(GC)通過的最大間隔,這個間隔會影響到緩沖池中內存的低壓力。 該值
以 jiffies為單位測量。
缺省設置:120
6.3 TCP Variables
1)     /proc/sys/net/ipv4/tcp_syn_retries
該文件表示本机向外發起TCP SYN連接超時重傳的次數,不應該高于255;該值僅僅針對外出的連接,對于進來的連接由tcp_retries1控制。
缺省設置:5
2)     /proc/sys/net/ipv4/tcp_keepalive_probes
該文件表示丟棄TCP連接前,進行最大TCP保持連接偵測的次數。保持連接僅在
SO_KEEPALIVE套接字選項被打開時才被發送。
缺省設置:9(次)
3)     /proc/sys/net/ipv4/tcp_keepalive_time
該文件表示從不再傳送數据到向連接上發送保持連接信號之間所需的秒數。
缺省設置:7200(2小時)
4)     /proc/sys/net/ipv4/tcp_keepalive_intvl
該文件表示發送TCP探測的頻率,乘以tcp_keepalive_probes表示斷開沒有相應的TCP連接的時間。
缺省設置:75(秒)
5)     /proc/sys/net/ipv4/tcp_retries1
該文件表示放棄回應一個TCP連接請求前進行重傳的次數。

缺省設置:3
6)     /proc/sys/net/ipv4/tcp_retries2
該文件表示放棄在已經建立通訊狀態下的一個TCP數据包前進行重傳的次數。

缺省設置:15
7)     /proc/sys/net/ipv4/tcp_orphan_retries
在近端丟棄TCP連接之前,要進行多少次重試。默認值是 7 個,相當于 50秒–
16分鐘,視 RTO 而定。如果您的系統是負載很大的web服務器,那麼也許需
要降低該值,這類 sockets 可能會耗費大量的資源。另外參考
tcp_max_orphans。
8)     /proc/sys/net/ipv4/tcp_fin_timeout
對于本端斷開的socket連接,TCP保持在FIN-WAIT-2狀態的時間。對方可能
會斷開連接或一直不結束連接或不可預料的進程死亡。默認值為 60 秒。過去在
2.2版本的內核中是 180 秒。您可以設置該值,但需要注意,如果您的机器為負
載很重的web服務器,您可能要冒內存被大量無效數据報填滿的風險,
FIN-WAIT-2 sockets 的危險性低于 FIN-WAIT-1,因為它們最多只吃 1.5K
的內存,但是它們存在時間更長。另外參考 tcp_max_orphans。
缺省設置:60(秒)
9)     /proc/sys/net/ipv4/tcp_max_tw_buckets
系統在同時所處理的最大timewait sockets 數目。如果超過此數的話,
time-wait socket 會被立即砍除並且顯示警告信息。之所以要設定這個限制,純
粹為了抵御那些簡單的 DoS 攻擊,千萬不要人為的降低這個限制,不過,如果
網絡條件需要比默認值更多,則可以提高它(或許還要增加內存)。
缺省設置:180000
10) /proc/sys/net/ipv4/tcp_tw_recyle
打開快速 TIME-WAIT sockets 回收。除非得到技朮專家的建議或要求,請不要隨
意修改這個值。
缺省設置:0
11) /proc/sys/net/ipv4/tcp_tw_reuse
該文件表示是否允許重新應用處于TIME-WAIT狀態的socket用于新的TCP連接。
缺省設置:0
12) /proc/sys/net/ipv4/tcp_max_orphans
系統所能處理不屬于任何進程的TCP sockets最大數量。假如超過這個數量,那
麼不屬于任何進程的連接會被立即reset,並同時顯示警告信息。之所以要設定這
個限制,純粹為了抵御那些簡單的 DoS 攻擊,千萬不要依賴這個或是人為的降
低這個限制。
缺省設置:8192
13) /proc/sys/net/ipv4/tcp_abort_on_overflow
當守護進程太忙而不能接受新的連接,就向對方發送reset消息,默認值是false。
這意味著當溢出的原因是因為一個偶然的猝發,那麼連接將恢復狀態。只有在你确
信守護進程真的不能完成連接請求時才打開該選項,該選項會影響客戶的使用。
缺省設置:0
14) /proc/sys/net/ipv4/tcp_syncookies
該文件表示是否打開TCP同步標簽(syncookie),內核必須打開了 CONFIG_SYN_COOKIES項進行編譯。 同步標簽(syncookie)可以防止一個套接字在有過多試圖連接到達時引起過載。
缺省設置:0
15) /proc/sys/net/ipv4/tcp_stdurg
使用 TCP urg pointer 字段中的主机請求解釋功能。大部份的主机都使用老舊的
BSD解釋,因此如果您在 Linux 打開它,或會導致不能和它們正确溝通。
缺省設置:0
16) /proc/sys/net/ipv4/tcp_max_syn_backlog
對于那些依然還未獲得客戶端确認的連接請求,需要保存在隊列中最大數目。對于
超過 128Mb 內存的系統,默認值是 1024,低于 128Mb 的則為 128。如果
服務器經常出現過載,可以嘗試增加這個數字。警告!假如您將此值設為大于
1024,最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE,以保持
TCP_SYNQ_HSIZE*16 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如
果tcp_adv_win_scale 128Mb 32768-610000)則系統將忽略所有發送給自己
的ICMP ECHO請求或那些廣播地址的請求。
缺省設置:1024
17) /proc/sys/net/ipv4/tcp_window_scaling
該文件表示設置tcp/ip會話的滑動窗口大小是否可變。參數值為布爾值,為1時表示可變,為0時表示不可變。tcp/ip通常使用的窗口最大可達到 65535 字節,對于高速網絡,該值可能太小,這時候如果啟用了該功能,可以使tcp/ip滑動窗口大小增大數個數量級,從而提高數据傳輸的能力。
缺省設置:1
18) /proc/sys/net/ipv4/tcp_sack
該文件表示是否啟用有選擇的應答(Selective Acknowledgment),這可以通過有選擇地應答亂序接收到的報文來提高性能(這樣可以讓發送者只發送丟失的報文段);(對于廣域網通信來說)這個選項應該啟用,但是這會增加對 CPU 的占用。
缺省設置:1
19) /proc/sys/net/ipv4/tcp_timestamps
該文件表示是否啟用以一種比超時重發更精确的方法(請參閱 RFC 1323)來啟用對 RTT 的計算;為了實現更好的性能應該啟用這個選項。
缺省設置:1
20) /proc/sys/net/ipv4/tcp_fack
該文件表示是否打開FACK擁塞避免和快速重傳功能。
缺省設置:1
21) /proc/sys/net/ipv4/tcp_dsack
該文件表示是否允許TCP發送“兩個完全相同”的SACK。
缺省設置:1
22) /proc/sys/net/ipv4/tcp_ecn
該文件表示是否打開TCP的直接擁塞通告功能。
缺省設置:0
23) /proc/sys/net/ipv4/tcp_reordering
該文件表示TCP流中重排序的數据報最大數量。
缺省設置:3
24) /proc/sys/net/ipv4/tcp_retrans_collapse
該文件表示對于某些有bug的打印机是否提供針對其bug的兼容性。
缺省設置:1
25) /proc/sys/net/ipv4/tcp_wmem
該文件包含3個整數值,分別是:min,default,max
Min:為TCP socket預留用于發送緩沖的內存最小值。每個TCP socket都可以使用它。
Default:為TCP socket預留用于發送緩沖的內存數量,默認情況下該值會影響其它協議使用的net.core.wmem中default的 值,一般要低于net.core.wmem中default的值。
Max:為TCP socket預留用于發送緩沖的內存最大值。該值不會影響net.core.wmem_max,今天選擇參數SO_SNDBUF則不受該值影響。默認值為128K。
缺省設置:4096 16384 131072
26) /proc/sys/net/ipv4/tcp_rmem
該文件包含3個整數值,分別是:min,default,max
Min:為TCP socket預留用于接收緩沖的內存數量,即使在內存出現緊張情況下TCP socket都至少會有這麼多數量的內存用于接收緩沖。
Default:為TCP socket預留用于接收緩沖的內存數量,默認情況下該值影響其它協議使用的 net.core.wmem中default的值。該值決定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win的 默認值情況下,TCP 窗口大小為65535。
Max:為TCP socket預留用于接收緩沖的內存最大值。該值不會影響 net.core.wmem中max的值,今天選擇參數 SO_SNDBUF則不受該值影響。
缺省設置:4096 87380 174760
27) /proc/sys/net/ipv4/tcp_mem
該文件包含3個整數值,分別是:low,pressure,high
Low:當TCP使用了低于該值的內存頁面數時,TCP不會考慮釋放內存。
Pressure:當TCP使用了超過該值的內存頁面數量時,TCP試圖穩定其內存使用,進入pressure模式,當內存消耗低于low值時則退出pressure狀態。
High:允許所有tcp sockets用于排隊緩沖數据報的頁面量。
一般情況下這些值是在系統啟動時根据系統內存數量計算得到的。
缺省設置:24576 32768 49152
28) /proc/sys/net/ipv4/tcp_app_win
該文件表示保留max(window/2^tcp_app_win, mss)數量的窗口由于應用緩沖。當為0時表示不需要緩沖。
缺省設置:31
29) /proc/sys/net/ipv4/tcp_adv_win_scale
該文件表示計算緩沖開銷bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale >; 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。
缺省設置:2
6.4 IP Variables
1)     /proc/sys/net/ipv4/ip_local_port_range
該文件表示TCP/UDP協議打開的本地端口號。
缺省設置:1024 4999
建議設置:32768 61000
2)     /proc/sys/net/ipv4/ip_nonlocal_bind
該文件表示是否允許進程邦定到非本地地址。
缺省設置:0
3)     /proc/sys/net/ipv4/ip_dynaddr
該參數通常用于使用撥號連接的情況,可以使系統動能夠立即改變ip包的源地址為該ip地址,同時中斷原有的tcp對話而用新地址重新發出一個syn請求 包,開始新的tcp對話。在使用ip欺騙時,該參數可以立即改變偽裝地址為新的ip地址。該文件表示是否允許動態地址,如果該值非0,表示允許;如果該值 大于1,內核將通過log記錄動態地址重寫信息。
缺省設置:0
4)     /proc/sys/net/ipv4/icmp_echo_ignore_all/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
該文件表示內核是否忽略所有的ICMP ECHO請求,或忽略廣播和多播請求。
0, 響應請求
1, 忽略請求
缺省設置:0
建議設置:1
5)     /proc/sys/net/ipv4/icmp_ratelimit
6)     /proc/sys/net/ipv4/icmp_ratemask
7)     /proc/sys/net/ipv4/icmp_ignore_bogus_error_reponses
某些路由器違背RFC1122標准,其對廣播幀發送偽造的響應來應答。這種違背行
為通常會被以告警的方式記錄在系統日志中。如果該選項設置為True,內核不會
記錄這種警告信息。
缺省設置:0
8)     /proc/sys/net/ipv4/igmp_max_memberships
該文件表示多播組中的最大成員數量。
缺省設置:20
6.5 Other Configuration
1)     /proc/sys/net/ipv4/conf/*/accept_redirects
如果主机所在的網段中有兩個路由器,你將其中一個設置成了缺省網關,但是該網關
在收到你的ip包時發現該ip包必須經過另外一個路由器,這時這個路由器就會給你
發一個所謂的“重定向”icmp包,告訴將ip包轉發到另外一個路由器。參數值為布爾
值,1表示接收這類重定向icmp 信息,0表示忽略。在充當路由器的linux主机上缺
省值為0,在一般的linux主机上缺省值為1。建議將其改為0以消除安全性隱患。
2)     /proc/sys/net/ipv4/*/accept_source_route
是否接受含有源路由信息的ip包。參數值為布爾值,1表示接受,0表示不接受。在
充當網關的linux主机上缺省值為1,在一般的linux主机上缺省值為0。從安全性角
度出發,建議關閉該功能。
3)     /proc/sys/net/ipv4/*/secure_redirects
其實所謂的“安全重定向”就是只接受來自網關的“重定向”icmp包。該參數就是
用來設置“安全重定向”功能的。參數值為布爾值,1表示啟用,0表示禁止,缺省值
為啟用。
4)     /proc/sys/net/ipv4/*/proxy_arp
設置是否對網絡上的arp包進行中繼。參數值為布爾值,1表示中繼,0表示忽略,
缺省值為0。該參數通常只對充當路由器的linux主机有用。
七、性能優化策略
7.1 基本優化
1)     關閉后台守護進程
系統安裝完后,系統會默認啟動一些后台守護進程,有些進程並不是必需的;因此,關閉這些進程可以節省一部分物理內存消耗。以root身份登錄系統,運行ntsysv,選中如下進程:
iptables
network
syslog
random
apmd
xinetd
vsftpd
crond
local
修改完后,重新啟動系統。
如此,系統將僅僅啟動選中的這些守護進程。
2)     減少終端連接數
系統默認啟動6個終端,而實際上只需啟動3個即可;以root身份登錄系統,運行vi /etc/inittab,修改成如下:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
如上所述,注釋掉4、5、6終端。
3)     待續。。。
7.2 網絡優化
1)     優化系統套接字緩沖區
net.core.rmem_max=16777216
net.core.wmem_max=16777216
2)     優化TCP接收/發送緩沖區
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
3)     優化網絡設備接收隊列
net.core.netdev_max_backlog=3000
4)     關閉路由相關功能
net.ipv4.conf.lo.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.eth0.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.lo.secure_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.eth0.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv4.conf.lo.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.default.send_redirects=0
5)     優化TCP協議棧
打開TCP SYN cookie選項,有助于保護服務器免受SyncFlood攻擊。
net.ipv4.tcp_syncookies=1
打開TIME-WAIT套接字重用功能,對于存在大量連接的Web服務器非常有效。
net.ipv4.tcp_tw_recyle=1
net.ipv4.tcp_tw_reuse=1
減少處于FIN-WAIT-2連接狀態的時間,使系統可以處理更多的連接。
net.ipv4.tcp_fin_timeout=30
減少TCP KeepAlive連接偵測的時間,使系統可以處理更多的連接。
net.ipv4.tcp_keepalive_time=1800
增加TCP SYN隊列長度,使系統可以處理更多的並發連接。
net.ipv4.tcp_max_syn_backlog=8192