调谐Linux网络性能

Linux下的网络调谐是一个很复杂的课题,内容很多。在本次专题文章中,我们主要介绍了网络调谐测试工具的使用方法及其可实现的功能,详细地描述了Linux下的网络配置文件,最后提供一些网络性能调谐方法。同时对通过linux内核网络参数的调整来提高linux系统的安全性和稳定性提出了自己的一些见解,从而为系统管理员进一步增强网络的安全性和系统的稳定性提供了参考。

调谐Linux网络性能
调谐LINUX网络性能之调试工具篇
本文是调协Linux系统网络性能的第一篇,主要介绍了route、netstat、tcpdump三种网络调谐测试工具的使用方法及其可实现的功能。
调谐LINUX网络性能之网络配置文件详解
在我们了解了route、netstat、tcpdump三种网络调谐测试工具的使用方法及其可实现的功能。本文我们将着重介绍网络配置文件的内容,帮您读懂这些文件。
调谐LINUX网络性能之调谐方法概述
在我们了解了route、netstat、tcpdump网络调谐测试工具的使用方法、功能和网络配置文件的内容后,本文我们将从实战的角度介绍网络性能调谐的方法。


调谐LINUX网络性能之调试工具篇
本文是调协Linux系统网络性能的第一篇,主要介绍了route、netstat、tcpdump三种网络调谐测试工具的使用方法及其可实现的功能。
route

在配置网络时,要为机器指定接收数据包时该包要经过的路径。在Linux系统中,提供一个命令route,这个命令可以为ifconfig命令配置的网卡设置静态路由。这种设置工作通常在/etc/rc.d/rc.inet1中引入,在系统引导时进行。

我们通过几个例子来说明如何使用route命令:

       
       
        
        route add -net 127.0.0.0
       
       


这个命令将向路由表中添加一个指定地址或者网络的路由。注意此时网络为A类地址,掩码被设置为255.0.0.0,这个新添加的条目被连接到lo设备上。

       
       
        
        route add -net xxx.xxx.xxx.xxx netmask 255.255.255.0 dev eth0
       
       


这个命令为IP地址为xxx.xxx.xxx.xxx的主机增加一个路由,它的网络掩码被设置为255.255.255.0。

       
       
        
        route del -net xxx.xxx.xxx.xxx
       
       


此命令将删除xxx.xxx.xxx.xxx这个网络的路由。

使用route命令还可以很方便地对整个网络的路由信息进行管理,其输出结果是网络的路由表。如下所示:

       
       
        
        -----------------------------------------------------------------
[root@lee /root]#route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.8.224 * 255.255.255.255 UH 0 0 0 eth0
10.10.8.0 * 255.255.255.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default dgc8.njupt.edu 0.0.0.0 UG 0 0 0 eth0
default dgc8.njupt.edu 0.0.0.0 UG 1 0 0 eth0
[root@lee /root]#
-----------------------------------------------------------------
       
       


输出结果中各个字段的含义是:

· Destination表示路由的目标IP地址。

· Gateway表示网关使用的主机名或者是IP地址。上面输出的"*"表示没有网关。

· Genmask表示路由的网络掩码。在把它与路由的目标地址进行比较之前,内核通过Genmask和数据包的IP地址进行按位"与"操作来设置路由。

· Flags是表示路由的标志。可用的标志及其意义是:U表示路由在启动,H表示target是一台主机,G表示使用网关,R表示对动态路由进行复位设置;D表示动态安装路由,M表示修改路由,!表示拒绝路由。

· Metric表示路由的单位开销量。

· Ref表示依赖本路由现状的其它路由数目。

· Use表示路由表条目被使用的数目。

· Iface表示路由所发送的包的目的网络。

通过查看这些输出信息,我们就可以方便地管理网络的路由表了。

netstat

netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。在计算机上执行netstat后,其输出结果如下所示:

       
       
        
        -----------------------------------------------------------------
[root@lee /root]#netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Types State I-Node Path
Unix 5 [ ] DGRAM 460 /dev/log
Unix 0 [ ] STREAM CONNECTED 173 @00000014
Unix 0 [ ] DGRAM 662 
Unix 0 [ ] DGRAM 631 
Unix 0 [ ] DGRAM 544 
Unix 0 [ ] DGRAM 484 
Unix 0 [ ] DGRAM 470 
[root@lee /root]#
-----------------------------------------------------------------
       
       


从整体上看,netstat的输出结果可以分为两个部分:第一部分:是Active Internet connections,称为有源TCP连接,在上面的输出结果中,这一部分没有内容,表示暂时还没有TCP连接。第二部分:是Active UNIX domain sockets,称为有源Unix域套接口。输出结果显示的是Unix域套接口的连接情况:

· Proto显示连接使用的协议。

· RefCnt表示连接到本套接口上的进程号。

· Types显示套接口的类型。

· State显示套接口当前的状态。

· Path表示连接到套接口的其它进程使用的路径名。

可以用netstat -a来查看所有套接字的状态,这在您调试网络程序的时候是非常有用的。netstat -r将显示路由表的内容,一般还要同时指定"-n"选项,这样可以得到数字格式的地址,也可显示默认路由器的IP地址。使用netstat -i则将显示所有的网络接口信息。使用netstat还可以获得当前的网络状态以及网络的拓扑结构,这在实际中是非常有用的。

tcpdump

tcpdump命令用于监视TCP/IP连接并直接读取数据链路层的数据包头。您可以指定哪些数据包被监视、哪些控制要显示格式。例如我们要监视所有Ethernet上来往的通信,执行下述命令:

       
       
        
          tcpdump -i eth0
       
       


即使是在一个相对平静的网络上,也有很多的通信,所以我们可能只需要得到我们感兴趣的那些数据包的信息。在一般情况下,TCP/IP栈只为本地主机接收入站的数据包绑定同时忽略网络上的其它计算机编址(除非您使用的是一台路由器)。当运行tcpdump命令时,它会将TCP/IP栈设置为promiscuous模式。该模式可接收所有的数据包并使其有效显示。如果我们关心的只是我们本地主机的通信情况,一种方法是使用“-p”参数禁止promiscuous模式,还有一种方法就是指定主机名:

       
       
        
          tcpdump -i eth0 host hostname
       
       


此时,系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:

       
       
        
        tcpdump -i eth0 src host hostname
       
       


下面的命令可以监视所有送到主机hostname的数据包:

       
       
        
        tcpdump -i eth0 dst host hostname
       
       


我们还可以监视通过指定网关的数据包:

       
       
        
        tcpdump -i eth0 gateway Gatewayname
       
       


如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:

       
       
        
        tcpdump -i eth0 host hostname and port 80
       
       


该命令将显示从每个数据包传出的头和来自主机hostname对端口80的编址。端口80是系统默认的HTTP服务端口号。如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。

小结

本文我们介绍了网络调谐测试工具的使用方法及其可实现的功能。在下一篇文章中,我们将解析网络配置文件,了解网络配置文件的内容以及如何修改文件。

调谐LINUX网络性能之网络配置文件详解
在《调谐LINUX网络性能之调试工具篇》中,我们介绍了route、netstat、tcpdump三种网络调谐测试工具的使用方法及其可实现的功能。本文我们将着重介绍网络配置文件的内容,帮您读懂这些文件
/etc/modules.conf 文件

该配置文件定义了各种需要在启动时加载的模块的参数信息,这里主要着重讨论关于网卡的配置。为了减少启动时可能出现的问题,Linux内核不会自动检测多个网卡。对于没有将网卡的驱动编译到内核而是作为模块动态载入的系统若需要安装多块网卡,应该在“modules.conf”文件中进行相应的配置。若设备驱动被编译为模块(内核的模块):对于PCI设备,模块将自动检测到所有已经安装到系统上的设备;对于ISA卡,则需要向模块提供IO地址,以使模块知道在何处寻找该卡,这些信息在“/etc/conf.modules”中提供。

例如,我们有两块ISA总线的3c509卡,一个IO地址是0x300,另一个是0x320。编辑“modules.conf”文件如下:

        
        
         
         alias eth0 3c509 
     alias eth1 3c509 
     options 3c509 io=0x300,0x320
        
        


对于PCI卡,仅仅需要alias命令来使ethN和适当的驱动模块名关联,PCI卡的IO地址将会被自动的检测到。对于PCI卡,编辑"modules.conf"文件如下:

        
        
         
         alias eth0 3c905 
    alias eth1 3c905
        
        


若驱动已经被编译进了内核:系统启动时的PCI检测程序将会自动找到所有相关的网卡。ISA卡一般也能够被自动检测到,但是在某些情况下,ISA卡仍然需要做下面的配置工作:在"/etc/lilo.conf"中增加配置信息,其方法是通过LILO程序将启动参数信息传递给内核。对于ISA卡,编辑"lilo.conf"文件,增加如下内容:

        
        
         
         append=" ether="0,0,eth0 ether="0,0,eth1"
        
        


/etc/sysconfig/network-scripts/ifcfg-ethN 文件

在RedHat中,系统网络设备的配置文件保存在"/etc/sysconfig/network-scripts"目录下,ifcfg-eth0包含第一块网卡的配置信息,ifcfg-eth1包含第二块网卡的配置信息等,若希望手工修改网络地址或在新的接口上增加新的网络界面,可以通过修改对应的文件(ifcfg-ethN)或创建新的文件来实现。

        
        
         
         DEVICE=name     name表示物理设备的名字 
IPADDR=addr     addr表示赋给该卡的IP地址 
NETMASK=mask    mask表示网络掩码 
NETWORK=addr    addr表示网络地址 
BROADCAST=addr   addr表示广播地址
ONBOOT=yes/no   启动时是否激活该卡
        
        


none:无须启动协议

bootp:使用bootp协议

dhcp:使用dhcp协议

USERCTL=yes/no       是否允许非root用户控制该设备

/etc/resolv.conf 文件

该文件是由域名解析器(resolver,一个根据主机名解析IP地址的库)使用的配置文件,示例如下:

        
        
         
         search domainname.com 
   nameserver 208.164.186.1 
    nameserver 208.164.186.2
        
        


“search domainname.com”表示当提供了一个不包括完全域名的主机名时,在该主机名后添加domainname.com的后缀;“nameserver”表示解析域名时使用该地址指定的主机为域名服务器。其中域名服务器是按照文件中出现的顺序来查询的。

/etc/host.conf 文件

该文件指定如何解析主机名。Linux通过解析器库来获得主机名对应的IP地址。下面是一个“/etc/host.conf”的示例:

        
        
         
         order bind,hosts 
  multi on 
  ospoof on
        
        


“order bind,hosts”指定主机名查询顺序,这里规定先使用DNS来解析域名,然后再查询“/etc/hosts”文件(也可以相反)。

“multi on”指定是否“/etc/hosts”文件中指定的主机可以有多个地址,拥有多个IP地址的主机一般称为多穴主机。

“nospoof on”指不允许对该服务器进行IP地址欺骗。IP欺骗是一种攻击系统安全的手段,通过把IP地址伪装成别的计算机,来取得其它计算机的信任。

/etc/hosts 文件

当机器启动时,在可以查询DNS以前,机器需要查询一些主机名到IP地址的匹配。这些匹配信息存放在/etc/hosts文件中。在没有域名服务器情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的IP地址。

下面是一个“/etc/hosts”文件的示例:

        
        
         
           IP Address     Hostname           Alias 
  127.0.0.1      Localhost          Gate.openarch.com 
  208.164.186.1    gate.openarch.com Gate 
  …………       …………           ………
        
        


最左边一列是主机IP信息,中间一列是主机名。任何后面的列都是该主机的别名。一旦配置完机器的网络配置文件,应该重新启动网络以使修改生效。使用下面的命令来重新启动网络:/etc/rc.d/init.d/network restart。

/etc/inetd.conf 文件

众所周知,作为服务器来说,服务端口开放越多,系统安全稳定性越难以保证。所以提供特定服务的服务器应该尽可能开放提供服务必不可少的端口,而将与服务器服务无关的服务关闭,比如:一台作为www和ftp服务器的机器,应该只开放80 和25端口,而将其他无关的服务如:finger auth等服务关掉,以减少系统漏洞。
而inetd,也叫作“超级服务器”,就是监视一些网络请求的守护进程,其根据网络请求来调用相应的服务进程来处理连接请求。inetd.conf则是inetd的配置文件。inetd.conf文件告诉inetd监听哪些网络端口,为每个端口启动哪个服务。在任何的网络环境中使用Linux系统,第一件要做的事就是了解一下服务器到底要提供哪些服务。不需要的那些服务应该被禁止掉,最好卸载掉,这样黑客就少了一些攻击系统的机会。查看"/etc/inetd.conf"文件,了解一下inetd提供哪些服务。用加上注释的方法(在一行的开头加上#号),禁止任何不需要的服务,再给inetd进程发一个SIGHUP信号:

· 第一步:把文件的许可权限改成600。

        
        
         
         [root@deep]# chmod 600 /etc/inetd.conf
        
        


· 第二步:确信文件的所有者是root。

 
        
        
         
         [root@deep]# stat /etc/inetd.conf
        
        


· 第三步:编辑"inetd.conf"文件(vi /etc/inetd.conf),禁止所有不需要的服务,如:ftp、 telnet、 shell、 login、 exec、talk、ntalk、 imap、 pop-2、pop-3、finger、auth,等等。如果你觉得某些服务有用,可以不禁止这些服务。

· 第四步:改变了“inetd.conf”文件之后,别忘了给inetd进程发一个SIGHUP信号(killall -HUP inetd)。

        
        
         
          [root@deep /root]# killall -HUP inetd
        
        


· 第五步:为了保证“inetd.conf”文件的安全,可以用chattr命令把它设成不可改变。把文件设成不可改变的只要用下面的命令:

        
        
         
         [root@deep]# chattr +i /etc/inetd.conf
        
        


“i”属性的文件是不能被改动的:不能删除或重命名,不能创建这个文件的链接,不能往这个文件里写数据。只有系统管理员才能设置和清除这个属性,如果要改变inetd.conf文件,你必须先清除这个不允许改变的标志:

        
        
         
         [root@deep]# chattr -i /etc/inetd.conf
        
        


但是对于诸如sendmail,named,www等服务,由于它们不象finger,telnet等服务,在请求到来时由inet守护进程启动相应的进程提供服务,而是在系统启动时,作为守护进程运行的。而对于redhat linux,提供了一个linuxconfig命令,可以通过它在图形界面下交互式地设置是否在启动时运行相关服务。也可以通过命令来设置是否启动时启动某个服务,如:[root@deep]# chkconfig -level 35 named off 。

/etc/hosts.allow 文件

但是对于telnet、ftp等服务,如果将其一同关闭,那么对于管理员需要远程管理时,将非常不方便。Linux提供另外一种更为灵活和有效的方法来实现对服务请求用户的限制,从而可以在保证安全性的基础上,使可信任用户使用各种服务。Linux提供了一个叫TCP wrapper的程序。在大多数发布版本中该程序往往是缺省地被安装。利用TCP wrapper你可以限制访问前面提到的某些服务。而且TCP wrapper的记录文件记录了所有的企图访问你的系统的行为。通过last命令查看该程序的log,管理员可以获知谁曾经或者企图连接你的系统。

在/etc目录下,有两个文件:hosts.deny hosts.allow通过配置这两个文件,你可以指定哪些机器可以使用这些服务,哪些不可以使用这些服务。

/etc/services 文件

端口号和标准服务之间的对应关系在RFC 1700 “Assigned Numbers”中有详细的定义。“/etc/services”文件使得服务器和客户端的程序能够把服务的名字转成端口号,这张表在每一台主机上都存在,其文件名是“/etc/services”。只有“root”用户才有权限修改这个文件,而且在通常情况下这个文件是没有必要修改的,因为这个文件中已经包含了常用的服务所对应的端口号。为了提高安全性,我们可以给这个文件加上保护以避免没有经过授权的删除和改变。为了保护这个文件可以用下面的命令:

        
        
         
         [root@deep]# chattr +i /etc/services
        
        


/etc/securetty 文件

“/etc/securetty”文件允许你规定“root”用户可以从那个TTY设备登录。登录程序(通常是“/bin/login”)需要读取“/etc/securetty”文件。它的格式是:列出来的tty设备都是允许登录的,注释掉或是在这个文件中不存在的都是不允许root登录的。

/etc/inittab文件

将文件中的一行注释掉可以禁止用Control-Alt-Delete关闭计算机。如果服务器不是放在一个安全的地方,这非常重要。

编辑inittab文件(vi /etc/inittab)把这一行:

        
        
         
          ca::ctrlaltdel:/sbin/shutdown -t3 -r now
        
        


改为:

        
        
         
         #ca::ctrlaltdel:/sbin/shutdown -t3 -r now
        
        


用下面的命令使改变生效:

        
        
         
         [root@deep]# /sbin/init q
        
        


/etc/rc.d/init.d/

/etc/rc.d/init.d/下的脚本主要包含了启动服务的脚本程序。一般用户没有什么必要知道脚本文件的内容。所以应该改变这些脚本文件的权限。

        
        
         
           [root@deep]# chmod -R 700 /etc/rc.d/init.d/*
        
        


这样只有root可以读、写和执行这个目录下的脚本。

小结

到此,我们已经详细分析了11个网络配置文件。通过上面的内容,您是否已经完全了解这些配置文件并熟练地进行操作了呢?

在下一篇文章中,我们将网络调谐的实战部分,详细介绍网络性能的调谐方法。

调谐LINUX网络性能之调谐方法概述
在《 调谐LINUX网络性能之调试工具篇》和《 调谐LINUX网络性能之网络配置文件详解》两篇文章中,我们介绍了route、netstat、tcpdump三种网络调谐测试工具的使用方法及其可实现的功能和网络配置文件的内容,本文我们将从实战的角度介绍网络性能调谐的方法。

下面,我们先来介绍网络性能调谐的第一种方法:服务方式选择。
服务方式选择


网络服务器由于要同时为多个客户提供服务,就必须使用某种方式来支持这种多任务的服务方式。一般情况下可以有三种方式来选择,多进程方式、多线程方式及异步方式。其中,多进程方式中服务器对一个客户要使用一个进程来提供服务,由于在操作系统中,生成一个进程需要进程内存复制等额外的开销,这样在客户较多时的性能就会降低。为了克服这种生成进程的额外开销,可以使用多线程方式或异步方式。在多线程方式中,使用进程中的多个线程提供服务,由于线程的开销较小,性能就会提高。事实上,不需要任何额外开销的方式还是异步方式,它使用非阻塞的方式与每个客户通信,服务器使用一个进程进行轮询就行了。异步方式下,多个任务之间的调度是由服务器程序自身来完成的,而且一旦一个地方出现问题则整个服务器就会出现问题,不在讨论的范围内。增大系统线程的数量:限制线程的数量的因素很多,主要有进程数量的限制,内存大小的限制,mutex/semaphore/shm/ipc的限制;一般情况下先增大进程最大数,再扩充内存,在增大线程最大数,而增大线程最大数的方法很简单,只需改变glibc中两处即可:线程最大数和线程堆栈区的大小;线程最大数的增加是以进程的异步I/O性能下为代价;所以需要加以平衡。

络配置文件中有用的内容


1. 对于数据库而言,增大共享内存段和信号量的多少,对数据传输效率的提高起到很重要的作用;

方法:只需编辑文件linux/include/linux/sem.h和linux/include/asm-i386/shmparam.h即可。

2. 先增大进程最大数,再扩充内存,再增大线程最大数,而增大线程最大数的方法很简单,只需改变glibc中两处即可:线程最大数和线程堆栈区的大小;

3. 把"/etc/inittab"文件中的一行注释掉可以禁止用Control-Alt-Delete关闭计算机。如果服务器不是放在一个安全的地方,这非常重要。

编辑inittab文件(vi /etc/inittab)把这一行:

      
      
       
       ca::ctrlaltdel:/sbin/shutdown -t3 -r now
      
      


改为:

      
      
       
       #ca::ctrlaltdel:/sbin/shutdown -t3 -r now
      
      


用下面的命令使改变生效:

      
      
       
       [root@deep]# /sbin/init q
      
      


4. /etc/host.conf 文件指定如何解析主机名。Linux通过解析器库来获得主机名对应的IP地址。下面是一个"/etc/host.conf"的示例:

order bind,hosts :指定主机名查询顺序,这里规定先使用DNS来解析域名,然后再查询"/etc/hosts"文件(也可以相反)。

可以在该文件后加上以下两句:

multi on:指定的主机可以有多个地址,拥有多个IP地址的主机一般称为多穴主机。

ospoof on:指不允许对该服务器进行IP地址欺骗,以提高服务器的安全性。IP欺骗是一种攻击系统安全的手段,通过把IP地址伪装成别的计算机,来取得其它计算机的信任。

可调谐的Linux内核网络参数


ICMP相关内核配置参数

概述:通常我们使用icmp包来探测目的主机上的其它协议(如tcp和udp)是否可用。比如包含"destination unreachable"信息的icmp包就是最常见的icmp包。

(1) icmp_destunreach_rate:设置内容为"Destination Unreachable"icmp包的响应速率。设置值应为整数。

应用实例: 假设有A、B两部主机,首先我们在主机A上执行以下ipchains语句:

      
      
       
       ipchains -A input -p icmp -j REJECT
      
      


这里的REJECT和DENY不同,DENY会丢掉符合条件的包如同没有接收到该包一样,而REJECT会在丢掉该包的同时给请求主机发回一个"Destination Unreachable"的icmp。

然后在主机B上ping主机A,这时候我们会发现"Destination Unreachable"icmp包的响应速度是很及时的。接着我们在主机A上执行:

      
      
       
       echo "1000" > /proc/sys/net/ipv4/icmp_destunreach_rate
      
      


也即每10秒钟响应一个"Destination Unreachable"的icmp包。

这时候再从主机B上ping主机A就会发现"Destination Unreachable"icmp包的响应速度已经明显变慢,我很好奇的测试了一下,发现刚好是每10秒响应一次。

(2)icmp_echo_ignore_broadcasts:设置是否响应icmp echo请求广播,设置值应为布尔值,0表示响应icmp echo请求广播,1表示忽略。

注意:windows系统是不响应icmp echo请求广播的。

应用实例:

在我的RedHat6.x和RedHat7上该值缺省为0,这样当有个用户ping我的服务器所在的网段的网络地址时,所有的linux服务器就会响应,从而也能让让该用户得到我的服务器的ip地址,可以执行

      
      
       
       echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
      
      


来关闭该功能。从而防止icmp风暴,防止网络阻塞。

(3)icmp_echoreply_rate:设置系统响应icmp echo请求的icmp包的响应速度,设置值为整数。

应用实例:

假设有A、B两部主机,首先我们在主机B上ping主机A,可以看到响应很正常,然后在主机A上执行

      
      
       
       echo "1000" > /proc/sys/net/ipv4/icmp_echoreply_rate
      
      


也即每10秒钟响应一个icmp echo请求包。然后再ping主机A就可以看到响应速度已经变成10秒一次。

最好合理的调整该参数的值来防止icmp风暴。

(4)icmp_echo_ignore_all:设置系统是否忽略所有的icmp echo请求,如果设置了一个非0值,系统将忽略所有的icmp echo请求。其实这是icmp_echoreply_rate的一种极端情况。参数值为布尔值,1:表示忽略,0:表示响应。

(5)icmp_paramprob_rate:当系统接收到数据报的损坏的ip或tcp头时,就会向源发出一个包含有该错误信息的icmp包。这个参数就是用来设置向源发送这种icmp包的速度。当然,在通常情况下ip或tcp头出错是很少见的。参数值为整数。

(6)icmp_timeexceed_rate:数据报在网络上传输时,其生存时间(time to live)字段会不断减少,当生存时间为0时,正在处理该数据报的路由器就会丢弃该数据报,同时给源主机发送一个"time to live exceeded"的icmp包。该参数就是用来设置这种icmp包的发送的速度。当然,这通常用于充当路由器的linux主机。

IP相关内核配置参数

linux内核网络参数中关于ip的配置参数通常是用来定义或调整ip包的一些特定的参数,除此之外还定义了系统的一些网络特性。

(1)ip_default_ttl:设置从本机发出的ip包的生存时间,参数值为整数,范围为0~128,缺省值为64。在windows系统中,ip包的生存时间通常为128。如果你的系统经常得到"Time to live exceeded"的icmp回应,可以适当增大该参数的值,但是也不能过大,因为如果你的路由坏路的话,就会增加系统报错的时间。

(2)ip_dynaddr:该参数通常用于使用拨号连接的情况,可以使系统能够立即改变ip包的源地址为该ip地址,同时中断原有的tcp对话而用新地址重新发出一个syn请求包,开始新的tcp对话。在使用ip欺骗时,该参数可以立即改变伪装地址为新的ip地址。该参数的参数值可以是:

      
      
       
       1:启用该功能 
2:使用冗余模式启用该功能 
0:禁止该功能
      
      


应用实例:在使用ipchains配置ip欺骗带动局域网共享一个ppp连接上网时,有时会出现刚开时连接一个站点连不通,再次刷新又可以连接的情况,这时候就可以设置该参数的值为1,从而立即改变伪装地址为新的ip地址,就可以解决这类问题。命令为:

      
      
       
       echo "1" > /proc/sys/net/ipv4/ip_dynaddr
      
      


(3)ip_forward:可以通过该参数来启用包转发功能,从而使系统充当路由器。参数值为1时启用ip转发,为0时禁止ip转发。注意,我们可以在单网卡或双网卡的主机上实现ip转发。

应用实例:

假设我们使用一部装有双网卡的linux主机充当防火墙,这时候我们就必须执行以下命令来打开ip转发功能:

      
      
       
       echo "1" > /proc/sys/net/ipv4/ip_forward
      
      


(4) ip_local_port_range:设置当本地系统向外发起tcp或udp连接请求时使用的端口范围。设置值为两个整数,缺省为"1024 4999"。

应用实例:

      
      
       
       echo "1450 6000" > /proc/sys/net/ipv4/ip_local_port_range
      
      


tcp相关内核配置参数

通过tcp配置参数可以控制tcp会话过程中的各个方面。

(1) tcp_fin_timeout:在一个tcp会话过程中,在会话结束时,A首先向B发送一个fin包,在获得B的ack确认包后,A就进入FIN WAIT2状态等待B的fin包然后给B发ack确认包。这个参数就是用来设置A进入FIN WAIT2状态等待对方fin包的超时时间。如果时间到了仍未收到对方的fin包就主动释放该会话。参数值为整数,单位为秒,缺省为180秒。

(2) tcp_syn_retires:设置开始建立一个tcp会话时,重试发送syn连接请求包的次数。 参数值为小于255的整数,缺省值为10。假如你的连接速度很快,可以考虑降低该值来提高系统响应时间,即便对连接速度很慢的用户,缺省值的设定也足够大了。

(3) tcp_window_scaling:设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。Tcp/ip通常使用的窗口最大可达到65535字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力。

针对每一网络接口的内核网络参数

通过针对每一网络接口的内核网络参数,你可以为诸如eth0、eth1等具体的网络接口指定响应的内核网络参数。注意:/proc/sys/net/ipv4/conf/all/下的参数将应用于所有的网络接口。
(1) accept_redirects:该参数位于/proc/sys/net/ipv4/conf/DEV/accept_redirects(DEV表示具体的网络接口),如果你的主机所在的网段中有两个路由器,你将其中一个设置成了缺省网关,但是该网关在收到你的ip包时发现该ip包必须经过另外一个路由器,这时这个路由器就会给你发一个所谓的"重定向"icmp包,告诉将ip包转发到另外一个路由器。参数值为布尔值,1表示接收这类重定向icmp 信息,0表示忽略。在充当路由器的linux主机上缺省值为0,在一般的linux主机上缺省值为1。建议将其改为0,或者使用"安全重定向"(见下文)以消除安全性隐患。

(2) log_martians:将包含非法地址信息的ip包记录到内核日志。参数值为布尔值。

应用实例:

上面我们讲过rp_filter反向路径过滤参数,同时我们可以执行下面的语句

      
      
       
       echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
      
      


然后就可以将进行ip假冒的ip包记录到/var/log/messages。

(3) forwarding:启用特定网络接口的ip转发功能。参数值为布尔值,1表示进行记录。

应用实例:

      
      
       
       echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding
      
      


(4) accept_source_route:是否接受含有源路由信息的ip包。参数值为布尔值,1表示接受,0表示不接受。在充当网关的linux主机上缺省值为1,在一般的linux主机上缺省值为0。从安全性角度出发,建议你关闭该功能。

(5) secure_redirects:前面我们已经提到过"安全重定向"的概念,其实所谓的"安全重定向"就是只接受来自网关的"重定向"icmp包。该参数就是用来设置"安全重定向"功能的。参数值为布尔值,1表示启用,0表示禁止,缺省值为启用。

(6) proxy_arp:设置是否对网络上的arp包进行中继。参数值为布尔值,1表示中继,0表示忽略,缺省值为0。该参数通常只对充当路由器的linux主机有用。

改变有关系统缺省参数限制


1. _SHM_ID_BITS:在/usr/src/linux/include/asm/shmparam.h文件中定义了该值;

作用:定义共享内存段表识的数量;其缺省值为7,变化范围:1-128;

调谐:可将该值增大到9,需重新编译内核;

2. MSGMNI:/proc/sys/kernel/msgmni文件中定义了该值;

作用:该值定义了消息队列的最大长度;要使db2(7.1版)正常运行,其最小值为128;

对于高负荷的DB2服务器,可将该值调整为 >= 1024;

调谐:对于2.4.6版本的内核,其缺省值为16;可用以下三中方法改变该值

(1) bash# sysctl -w kernel.msgmni=128

(2) bash# sysctl -w kernel.msgmni=128

(3) 如果要在系统启动时改变该值,可在/etc/sysctl.conf文件中加入以下几句:

      
      
       
       # Sets maximum number of message queues to 128
# Set this to 1024 or higher on production systems
kernel.msgmni = 128
      
      


(用ipcs -l 命令来查看当前ipc 参数的各种设置)

3. NR_TASKS:/usr/src/linux/include/linux/tasks.h文件中定义了该

MAX_TASKS_PER_USER被定义为NR_TASKS/2;linux 将DB2的每个实例看作用户,每个连结一般都使用一个进程,而每个实例的最大连结数被限制为NR_TASKS/2;尽管2.4的内核对该值无限制,但有linux该缺省值仍为512;

调谐:>= 1024, 重新编译内核;

4. SEMMNI:/usr/src/linux/include/linux/sem.h 文件中定义了该值;

作用:该值定义了linux所能支持的最大信号量表识;

调谐:其缺省值为128,增大到1024;

从IPV4过渡到IPV6


尽管IPv6比IPv4具有明显的先进性,要想在短时间内将Internet和各个企业网络中的所有系统全部从IPv4升级到IPv6是不可能的。为此,做为IPv6研究工作的一个部分,IETF制定了推动IPv4向IPv6过渡的方案,其中包括三个机制:兼容IPv4的IPv6地址、双IP协议栈和基于IPv4通道的IPv6。

兼容IPv4的IPv6地址是一种特殊的IPv6单点广播地址,一个IPv6节点与一个IPv4节点可以使用这种地址在IPv4网络中通信。这种地址是由96个0位加上32位IPv4地址组成的,例如,假设某节点的IPv4地址是192.56.1.1,那么兼容IPv4的IPv6地址就是:

      
      
       
       0: 0:0:0:0:0:C038:101。
      
      


双IP协议栈是在一个系统(如一个主机或一个路由器)中同时使用IPv4和IPv6两个协议栈。这类系统既拥有IPv4地址,也拥有IPv6地址,因而可以收发IPv4和IPv6两种IP数据报。也就是用两套,需要使用IPv4的时候就使用IPv4,需要使用IPv6的时候就使用IPv6。

与双IP协议栈相比,基于IPv4通道的IPv6是一种更为复杂的技术,它是将整个IPv6数据报封装在IPv4数据报中,由此实现在当前的IPv4网络(如Internet)中IPv6节点与IPv4节点之间的IP通信。基于IPv4通道的IPv6实现过程分为三个步骤:封装、解封和通道管理。封装,是指由通道起始点创建一个IPv4包头,将IPv6数据报装入一个新的IPv4数据报中。解封,是指由通道终结点移去IPv4包头,还原原始的IPv6数据报。通道管理,是指由通道起始点维护通道的配置信息。IPv4通道有四种方案:路由器对路由器、主机对路由器、主机对主机、路由器对主机。

当进行通信的两个主机都有兼容IPv4的IPv6地址时,数据发送方主机将建立一个主机对主机通道。通道起始点(数据发送方主机)确定数据接收方主机就是通道终结点,并自动从其兼容IPv4的IPv6地址中抽取后32个地址位以确定通道终结点的IPv4地址,这种类型的通道被称为自动通道(automated tunneling)。

双IP协议栈和基于IPv4通道的IPv6网络使IPv4网络能够以可控的速度向IPv6迁移。在开始向IPv6过渡之前,必须设置一个同时支持IPv4和IPv6的新的DNS服务器。有关设置或关于IPv6更多的详细内容可访问IPv6相关网站。我们在这里仅为在Linux下使用IPV6提供一种简单的理论叙述。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值