Linux服务器性能评估与优化(二)

网络内容总结(感谢原创)linux

一、Linux内核参数优化web

     内核参数是用户和系统内核之间交互的一个接口,经过这个接口,用户能够在系统运行的同时动态更新内核配置,而这些内核参数是经过Linux Proc文件系统存在的。所以,能够经过调整Proc文件系统达到优化Linux性能的目的。shell

1、sysctl命令

sysctl命令 用来配置与显示在/proc/sys目录中的内核参数.若是想使参数长期保存,能够经过编辑/etc/sysctl.conf文件来实现。
 
 命令格式:
 sysctl [-n] [-e] -w variable=value
 sysctl [-n] [-e] -p (default /etc/sysctl.conf)
 sysctl [-n] [-e] –a
 
经常使用参数的意义:
 -w  临时改变某个指定参数的值,如
        # sysctl -w net.ipv4.ip_forward=1
 -a  显示全部的系统参数
 -p从指定的文件加载系统参数,默认从/etc/sysctl.conf 文件中加载,如:
# echo 1 > /proc/sys/net/ipv4/ip_forward
# sysctl -w net.ipv4.ip_forward=1
 以上两种方法均可能当即开启路由功能,但若是系统重启,或执行了
     # service network restart
命令,所设置的值即会丢失,若是想永久保留配置,能够修改/etc/sysctl.conf文件,将 net.ipv4.ip_forward=0改成net.ipv4.ip_forward=1


2、linux内核参数调整:linux 内核参数调整有两种方式

 
方法一:修改/proc下内核参数文件内容,不能使用编辑器来修改内核参数文件,理由是因为内核随时可能更改这些文件中的任意一个,另外,这些内核参数文件都是虚拟文件,实际中不存在,所以不能使用编辑器进行编辑,而是使用echo命令,而后从命令行将输出重定向至 /proc 下所选定的文件中。如:将 timeout_timewait 参数设置为30秒:
# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
参数修改后当即生效,可是重启系统后,该参数又恢复成默认值。所以,想永久更改内核参数,须要修改/etc/sysctl.conf文件
 
   方法二.修改/etc/sysctl.conf文件。检查sysctl.conf文件,若是已经包含须要修改的参数,则修改该参数的值,若是没有须要修改的参数,在sysctl.conf文件中添加参数。如:
   net.ipv4.tcp_fin_timeout=30
保存退出后,能够重启机器使参数生效,若是想使参数立刻生效,也能够执行以下命令:
   # sysctl  -p

3、sysctl.conf 文件中参数设置及说明

一、常见配置
net.ipv4.ip_local_port_range = 1024 65536  
net.core.rmem_max=16777216 
net.core.wmem_max=16777216 
net.ipv4.tcp_rmem=4096 87380 16777216  
net.ipv4.tcp_wmem=4096 65536 16777216  
net.ipv4.tcp_fin_timeout = 30 
net.core.netdev_max_backlog = 30000 
net.ipv4.tcp_no_metrics_save=1 
net.core.somaxconn = 262144 
net.ipv4.tcp_syncookies = 1 
net.ipv4.tcp_max_orphans = 262144 
net.ipv4.tcp_max_syn_backlog = 262144 
net.ipv4.tcp_synack_retries = 2 
net.ipv4.tcp_syn_retries = 2 

net.ipv4.ip_local_port_range:用来指定外部链接的端口范围,默认是32 768到61 000,这里设置为1024到65 536。缓存

net.core.rmem_max:指定接收套接字缓冲区大小的最大值,单位是字节。安全

net.core.wmem_max:指定发送套接字缓冲区大小的最大值,单位是字节。bash

net.ipv4.tcp_rmem:此参数与net.ipv4.tcp_wmem都是用来优化TCP接收/发送缓冲区的,包含3个整数值,分别是min、default、max。服务器

对于tcp_rmem,min表示为TCP socket预留的用于接收缓存的最小内存数量,default表示为TCP socket预留的用于接收缓存的默认的内存值,max表示用于TCP socket接收缓存的内存最大值。cookie

对于tcp_wmem,min表示为TCP socket预留的用于发送缓存的内存最小值,default表示为TCP socket预留的用于发送缓存的默认的内存值,max表示用于TCP socket发送缓存的内存最大值。网络

net.ipv4.tcp_fin_timeout:此参数用于减小处于FIN-WAIT-2链接状态的时间,使系统能够处理更多的链接。此参数值为整数,单位为秒。session

例如,在一个tcp会话过程当中,在会话结束时,A首先向B发送一个fin包,在得到B的ack确认包后,A就进入FIN-WAIT-2状态等待B的fin包,而后给B发ack确认包。net.ipv4.tcp_fin_timeout参数用来设置A进入FIN-WAIT-2状态等待对方fin包的超时时间。若是时间到了仍未收到对方的fin包就主动释放该会话。

net.core.netdev_max_backlog:该参数表示当在每一个网络接口接收数据包的速率比内核处理这些包的速率快时,容许发送到队列的数据包的最大数量。

net.ipv4.tcp_syncookies:表示是否打开SYN Cookie。tcp_syncookies是一个开关,该参数的功能有助于保护服务器免受SyncFlood攻击。默认值为0,这里设置为1。

net.ipv4.tcp_max_orphans:表示系统中最多有多少TCP套接字不被关联到任何一个用户文件句柄上。若是超过这里设置的数字,链接就会复位并输出警告信息。这个限制仅仅是为了防止简单的DoS攻击。此值不能过小。这里设置为262 144。

net.ipv4.tcp_max_syn_backlog:表示SYN队列的长度,预设为1024,这里设置队列长度为262 144,以容纳更多的等待链接。

net.ipv4.tcp_synack_retries:这个参数用于设置内核放弃链接以前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries:此参数表示在内核放弃创建链接以前发送SYN包的数量。


4、Linux内核优化之TCP/IP相关参数

  全部的TCP/IP调优参数都位于/proc/sys/net/目录。 例如, 下面是最重要的一些调优参数, 后面是它们的含义:
  1. /proc/sys/net/core/rmem_max — 最大的TCP数据接收缓冲
  2. /proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲
  3. /proc/sys/net/ipv4/tcp_timestamps — 时间戳在(请参考RFC 1323)TCP的包头增长12个字节
  4. /proc/sys/net/ipv4/tcp_sack — 有选择的应答
  5. /proc/sys/net/ipv4/tcp_window_scaling — 支持更大的TCP窗口。 若是TCP窗口最大超过65535(64K), 必须设置该数值为1
  6. rmem_default — 默认的接收窗口大小
  7. rmem_max — 接收窗口的最大大小
  8. wmem_default — 默认的发送窗口大小
  9. wmem_max — 发送窗口的最大大小
  /proc目录下的全部内容都是临时性的, 因此重启动系统后任何修改都会丢失。
  建议在系统启动时自动修改TCP/IP参数:

  把下面代码增长到/etc/rc.local文件, 而后保存文件, 系统从新引导的时候会自动修改下面的TCP/IP参数:
  echo 256960 > /proc/sys/net/core/rmem_default
  echo 256960 > /proc/sys/net/core/rmem_max
  echo 256960 > /proc/sys/net/core/wmem_default
  echo 256960 > /proc/sys/net/core/wmem_max
  echo 0 > /proc/sys/net/ipv4/tcp_timestamps
  echo 1 > /proc/sys/net/ipv4/tcp_sack
  echo 1 > /proc/sys/net/ipv4/tcp_window_scaling

  TCP/IP参数都是自解释的, TCP窗口大小设置为256960, 禁止TCP的时间戳(取消在每一个数据包的头中增长12字节), 支持更大的TCP窗口和TCP有选择的应答。
  上面数值的设定是根据互连网链接和最大带宽/延迟率来决定。
  注: 上面实例中的数值能够实际应用, 但它只包含了一部分参数。

  另一个方法: 使用 /etc/sysctl.conf 在系统启动时将参数配置成您所设置的值:
  net.core.rmem_default = 256960
  net.core.rmem_max = 256960
  net.core.wmem_default = 256960
  net.core.wmem_max = 256960
  net.ipv4.tcp_timestamps = 0
  net.ipv4.tcp_sack =1
  net.ipv4.tcp_window_scaling = 1
=========================================================================

tcp_syn_retries:INTEGER
默认值是5
对于一个新建链接,内核要发送多少个 SYN 链接请求才决定放弃。不该该大于255,默认值是5,对应于180秒左右时间。( 对于大负载而物理通讯良好的网络而言,这个值偏高,可修改成2.这个值仅仅是针对对外的链接,对进来的链接,是由tcp_retries1决定的 )


tcp_synack_retries:INTEGER
默认值是5
对于远端的链接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN链接请求包。这是所谓的三次握手( threewayhandshake)机制的第二个步骤。这里决定内核在放弃链接以前所送出的 SYN+ACK 数目。不该该大于255,默认值是5,对应于180秒左右时间。(能够根据上面的tcp_syn_retries来决定这个值)


tcp_keepalive_time:INTEGER
默认值是7200(2小时)
当keepalive打开的状况下,TCP发送keepalive消息的频率。(因为目前网络攻击等因素,形成了利用这个进行的攻击很频繁,曾经也有cu的朋友提到过,说若是2边创建了链接,而后不发送任何数据或者rst/fin消息,那么持续的时间是否是就是2小时,空链接攻击?tcp_keepalive_time就是预防此情形的.我我的在作nat服务的时候的修改值为1800秒)


tcp_keepalive_probes:INTEGER
默认值是9
TCP发送keepalive探测以肯定该链接已经断开的次数。(注意:保持链接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不须要修改,固然根据情形也能够适当地缩短此值.设置为5比较合适)


tcp_keepalive_intvl:INTEGER
默认值为75
探测消息发送的频率,乘以tcp_keepalive_probes就获得对于从开始探测以来没有响应的链接杀除的时间。默认值为75秒,也就是没有活动的链接将在大约11分钟之后将被丢弃。(对于普通应用来讲,这个值有一些偏大,能够根据须要改小.特别是web类服务器须要改小该值,15是个比较合适的值)


tcp_retries1:INTEGER
默认值是3
放弃回应一个TCP链接请求前﹐须要进行多少次重试。RFC 规定最低的数值是3﹐这也是默认值﹐根据RTO的值大约在3秒 - 8分钟之间。(注意:这个值同时还决定进入的syn链接)


tcp_retries2:INTEGER
默认值为15
在丢弃激活(已创建通信情况)的TCP链接以前﹐须要进行多少次重试。默认值为15,根据RTO的值来决定,至关于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,能够适当地改小,个人网络内修改成了5)


tcp_orphan_retries:INTEGER
默认值是7
在近端丢弃TCP链接以前﹐要进行多少次重试。默认值是7个﹐至关于 50秒 - 16分钟﹐视 RTO 而定。若是您的系统是负载很大的web服务器﹐那么也许须要下降该值﹐这类 sockets 可能会耗费大量的资源。另外参的考tcp_max_orphans。(事实上作NAT的时候,下降该值也是好处显著的,我本人的网络环境中下降该值为3)


tcp_fin_timeout:INTEGER
默认值是60
对于本端断开的socket链接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开链接或一直不结束链接或不可预料的进程死亡。默认值为60秒。过去在2.2版本的内核中是 180 秒。您能够设置该值﹐但须要注意﹐若是您的机器为负载很重的web服务器﹐您可能要冒内存被大量无效数据报填满的风险﹐FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1 ﹐由于它们最多只吃 1.5K 的内存﹐可是它们存在时间更长。另外参考tcp_max_orphans。(事实上作NAT的时候,下降该值也是好处显著的,我本人的网络环境中下降该值为30)


tcp_max_tw_buckets:INTEGER
默认值是180000
系统在同时所处理的最大 timewaitsockets 数目。若是超过此数的话﹐time-wait socket 会被当即砍除而且显示警告信息。之因此要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要人为的下降这个限制﹐不过﹐若是网络条件须要比默认值更多﹐则能够提升它(或许还要增长内存)。(事实上作NAT的时候最好能够适当地增长该值)


tcp_tw_recycle:BOOLEAN
默认值是0
打开快速 TIME-WAITsockets 回收。除非获得技术专家的建议或要求﹐请不要随意修改这个值。(作NAT的时候,建议打开它)
 
tcp_tw_reuse:BOOLEAN
默认值是0
该文件表示是否容许从新应用处于TIME-WAIT状态的socket用于新的TCP链接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形很是有帮助)


tcp_max_orphans:INTEGER
缺省值是8192
系统所能处理不属于任何进程的TCP sockets


二、Linux文件系统优化

     ulimit -a 用来显示当前的各类用户进程限制。
  Linux对于每一个用户,系统限制其最大进程数。为提升性能,能够根据设备资源状况,设置各linux 用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:
  ulimit -u 10000
  对于须要作许多 socket 链接并使它们处于打开状态的 Java 应用程序而言,最好经过使用 ulimit -n xx 修改每一个进程可打开的文件数,缺省值是 1024。
  ulimit -n 4096 将每一个进程能够打开的文件数目加大到4096,缺省为1024
  其余建议设置成无限制(unlimited)的一些重要设置是:
  数据段长度:ulimit -d unlimited
  最大内存大小:ulimit -m unlimited
  堆栈大小:ulimit -s unlimited
  CPU 时间:ulimit -t unlimited
  虚拟内存:ulimit -v unlimited
  暂时地,适用于经过 ulimit 命令登陆 shell 会话期间。永久地,经过将一个相应的 ulimit 语句添加到由登陆 shell 读取的文件中, 即特定于 shell 的用户资源文件,如:
  1)、解除 Linux 系统的最大进程数和最大文件打开数限制:
  vi /etc/security/limits.conf
  # 添加以下的行
  * soft noproc 11000
  * hard noproc 11000
  * soft nofile 4100
  * hard nofile 4100
  说明:* 表明针对全部用户
  noproc 是表明最大进程数
  nofile 是表明最大文件打开数

  2)、让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制:
  a、vi /etc/ssh/sshd_config
  把 UserLogin 的值改成 yes,并把 # 注释去掉
  b、重启 sshd 服务:
  /etc/init.d/sshd restart
  3)、修改全部 linux 用户的环境变量文件:
  vi /etc/profile
  ulimit -u 10000
  ulimit -n 4096
  ulimit -d unlimited
  ulimit -m unlimied
  ulimit -s unlimited
  ulimit -t unlimited
  ulimit -v unlimited
  /**************************************

  有时候在程序里面须要打开多个文件,进行分析,系统通常默认数量是1024,(用ulimit -a能够看到)对于正常使用是够了,可是对于程序来说,就太少了。
  修改2个文件。
  1./etc/security/limits.conf
  vi /etc/security/limits.conf
  加上:
  * soft nofile 8192
  * hard nofile 20480
  2./etc/pam.d/login
  session required /lib/security/pam_limits.so
  **********
  另外确保/etc/pam.d/system-auth文件有下面内容
  session required /lib/security/$ISA/pam_limits.so
  这一行确保系统会执行这个限制。
  ***********
  3.通常用户的。bash_profile
  #ulimit -n 1024
  从新登录ok

三、Linux内存调优

  内存子系统的调优不是很容易,须要不停地监测来保证内存的改变不会对服务器的其余子系统形成负面影响。若是要改变虚拟内存参数(在/proc/sys/vm),建议您每次只改变一个参数而后监测效果。对与虚拟内存的调整包括如下几个项目:


  配置Linux内核如何更新dirty buffers到磁盘。磁盘缓冲区用于暂存磁盘的数据。相对于内存来说,磁盘缓冲区的速度很慢。所以,若是服务器使用这类内存,性能会成问题。当缓冲区内的数据彻底dirty,使用:sysctl -w vm.bdflush="30 500 0 0 500 3000 60 20 0"

  vm.bdflush有9个参数,可是建议您只改变其中的3个:

  1 nfract, 为排队写入磁盘前,bdflush daemon容许的缓冲区最大百分比

  2 ndirty, 为bdflush即刻写的最大缓冲区的值。若是这个值很大,bdflush须要更多的时间完成磁盘的数据更新。

  7 nfract_sync, 发生同步前,缓冲区变dirty的最大百分比


  配置kswapd daemon,指定Linux的内存页数量

  sysctl -w vm.kswapd="1024 32 64"


  三个参数的描述以下:

  – tries_base 至关于内核每次所的“页”的数量的四倍。对于有不少交换信息的系统,增长这个值能够改进性能。

  – tries_min 是每次kswapd swaps出去的pages的最小数量。

  – swap_cluster 是kswapd 即刻写如的pages数量。数值小,会提升磁盘I/O的性能;数值大可能也会对请求队列产生负面影响。

  若是要对这些参数进行改动,请使用工具vmstat检查对性能的影响。其它能够改进性能的虚拟内存参数为:

  _ buffermem

  _ freepages

  _ overcommit_memory

  _ page-cluster

  _ pagecache

  _ pagetable_cache

四、Linux网络调优

操做系统安装完毕,就要对网络子系统进行调优。对其它子系统的影响:影响CPU利用率,尤为在有大量TCP链接、块尺寸又很是小时,内存的使用会

明显增长。

如何预防性能降低


  以下的sysctl命令用于改变安全设置,可是它也能够防止网络性能的降低。这些命令被设置为缺省值。


  ◆关闭以下参数能够防止黑客对服务器IP地址的攻击


  sysctl -w net.ipv4.conf.eth0.accept_source_route=0


  sysctl -w net.ipv4.conf.lo.accept_source_route=0


  sysctl -w net.ipv4.conf.default.accept_source_route=0


  sysctl -w net.ipv4.conf.all.accept_source_route=0


  ◆开启TCP SYN cookies,保护服务器避免受syn-flood攻击,包括服务取决denial-of-service (DoS) 或者分布式服务拒绝distributed denial-of-


  service (DDoS) (仅适用Red Hat Enterprise Linux AS)


  sysctl -w net.ipv4.tcp_syncookies=1


  ◆如下命令使服务器忽略来自被列入网关的服务器的重定向。因重定向能够被用来进行攻击,因此咱们只接受有可靠来源的重定向。


  sysctl -w net.ipv4.conf.eth0.secure_redirects=1


  sysctl -w net.ipv4.conf.lo.secure_redirects=1


  sysctl -w net.ipv4.conf.default.secure_redirects=1


  sysctl -w net.ipv4.conf.all.secure_redirects=1


  另外,你能够配置接受或拒绝任何ICMP重定向。ICMP重定向是器传输信息的机制。好比,当网关接收到来自所接网络主机的Internet数据报时,网关能够发送重定向信息到一台主机。网关检查路由表得到下一个网关的地址,第二个网关将数据报路由到目标网络。关闭这些重定向得命令以下:


  sysctl -w net.ipv4.conf.eth0.accept_redirects=0


  sysctl -w net.ipv4.conf.lo.accept_redirects=0


  sysctl -w net.ipv4.conf.default.accept_redirects=0


  sysctl -w net.ipv4.conf.all.accept_redirects=0


  ◆若是这个服务器不是一台路由器,那么它不会发送重定向,因此能够关闭该功能:


  sysctl -w net.ipv4.conf.eth0.send_redirects=0


  sysctl -w net.ipv4.conf.lo.send_redirects=0


  sysctl -w net.ipv4.conf.default.send_redirects=0


  sysctl -w net.ipv4.conf.all.send_redirects=0


  ◆配置服务器拒绝接受广播风暴或者smurf 攻击attacks:


  sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1


  ◆忽略全部icmp包或者pings:


  sysctl -w net.ipv4.icmp_echo_ignore_all=1


  ◆有些路由器针对广播祯发送无效的回应,每一个都产生警告并在内核产生日志。这些回应能够被忽略:


  sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1


  针对TCP和UDP的调优


  下边的命令用来对链接数量很是大的服务器进行调优。


  ◆对于同时支持不少链接的服务器,新的链接能够从新使用TIME-WAIT套接字。 这对于Web服务器很是有效:


  sysctl -w net.ipv4.tcp_tw_reuse=1


  若是你使用该命令,还要启动TIME-WAIT 套接字状态的快速循环功能:


  sysctl -w net.ipv4.tcp_tw_recycle=1


  图Figure 10-7显示出将这些功能启用,链接数量明显下降。由于每一个TCP传输都包含远程客户端的信息缓存,因此有利于提升性能。缓存中存放round-trip时间、最大segment大小、拥塞窗口的信息。


  ◆参数tcp_fin_timeout 是套接字关闭时,保持FIN-WAIT-2状态的时间。一个TCP链接以three-segment SYN序列开始, 以three-segment FIN序列结束。均不保留数据。经过改变tcp_fin_timeout的值, 从FIN序列到内存能够空闲出来处理新链接的时间缩短了,使性能获得改进。改变这个值的前要通过认真的监测,避免由于死套接字形成内存溢出。


  sysctl -w net.ipv4.tcp_fin_timeout=30


  ◆服务器的一个问题是,同一时刻的大量TCP链接里有不少的链接被打开可是没有使用。 TCP的keepalive功能检测到这些链接,缺省状况下,在2小时以后丢掉. 2个小时的可能致使内存过分使用,下降性能。所以改为1800秒(30分钟)是个更好的选择:


  sysctl -w net.ipv4.tcp_keepalive_time=1800


  ◆对于全部的队列,设置最大系统发送缓存(wmem) 和接收缓存(rmem)到8MB


  sysctl -w net.ipv4.core.wmem_max=8388608


  sysctl -w net.ipv4.core.rmem_max=8388608


  这些设置指定了建立TCP套接字时为其分配的内存容量。 另外,使用以下命令发送和接收缓存。该命令设定了三个值:最小值、初始值和最大值:


  sysctl -w net.ipv4.tcp_rmem="4096 87380 8388608"


  sysclt -w net.ipv4.tcp.wmem="4096 87380 8388608"


  第三个值必须小于或等于wmem_max和rmem_max。


  ◆(SUSE LINUX Enterprise Server适用) 经过保留路径验证来源数据包。缺省状况下,路由器转发全部的数据包,即使是明显的异常网络流量。经过启动和是的过滤功能,丢掉这些数据包:


  sysctl -w net.ipv4.conf.eth0.rp_filter=1


  sysctl -w net.ipv4.conf.lo.rp_filter=1


  sysctl -w net.ipv4.conf.default.rp_filter=1


  sysctl -w net.ipv4.conf.all.rp_filter=1


  ◆当服务器负载繁重或者是有不少客户端都是超长延时的链接故障,可能会致使half-open链接数量的增长。这对于Web服务器很来说很日常,尤为有不少拨号客户时。这些half-open链接保存在 backlog connections 队列中。将这个值最少设置为4096 (缺省为1024)。 即使是服务器不接收这类链接,设置这个值还能防止受到denial-of-service (syn-flood)的攻击。


  sysctl -w net.ipv4.tcp_max_syn_backlog=4096


  ◆设置ipfrag参数,尤为是NFS和Samba服务器。这里,咱们能够设置用于从新组合IP碎片的最大、最小内存。当ipfrag_high_thresh值被指派,碎片会被丢弃直到达到ipfrag_low_thres值。当TCP数据包传输发生错误时,开始碎片整理。有效的数据包保留在内存,同时损坏的数据包被转发。例如,设置可用内存范围从256 MB到384 MB


  sysctl -w net.ipv4.ipfrag_low_thresh=262144


  sysctl -w net.ipv4.ipfrag_high_thresh=393216


五、Linux网络安全设置

TCP SYN Flood 攻击


  TCP SYN Flood是一种常见,并且有效的远端(远程)拒绝服务(Denial of Service)攻击方式,它透过必定的操做破坏TCP三次握手创建正常链接,占用并耗费系统资源,使得提供TCP服务的主机系统没法正常工做。由於TCP SYN Flood是透过网路底层对服务器Server进行攻击的,它能够在任意改变本身的网路IP地址的同时,不被网路上的其余设备所识别,这样就给防范网路犯罪部门追查犯罪来源形成很大的困难。系统检查


  通常状况下,能够一些简单步骤进行检查,来判断系统是否正在遭受TCP SYN Flood攻击。


  一、服务端没法提供正常的TCP服务。链接请求被拒绝或超时。

  二、透过 netstat -an 命令检查系统,发现有大量的SYN_RECV链接状态。

  3. iptables的设置,引用自CU防止同步包洪水(Sync Flood)


  # iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

  也有人写做

  #iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT

  --limit 1/s 限制syn并发数每秒1次,能够根据本身的须要修改

  防止各类端口扫描

  # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

  Ping洪水攻击(Ping of Death)

  # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

Linux上的NAT与iptables


谈起Linux上的NAT,大多数人会跟你提到iptables。缘由是由于iptables是目前在linux上实现NAT的一个很是好的接口。它经过和内核级直接操做网络包,效率和稳定性都很是高。这里简单列举一些NAT相关的iptables实例命令,可能对于大多数实现有多帮助。
 这里说明一下,为了节省篇幅,这里把准备工做的命令略去了,仅仅列出核心步骤命令,因此若是你单单执行这些没有实现功能的话,极可能因为准备工做没有作好。若是你对整个命令细节感兴趣的话,能够直接访问个人《如何让你的Linux网关更强大》系列文章,其中对于各个脚本有详细的说明和描述。
# 案例1:实现网关的MASQUERADE
# 具体功能:内网网卡是eth1,外网eth0,使得内网指定本服务作网关能够访问外网

EXTERNAL="eth0"
INTERNAL="eth1"

# 这一步开启ip转发支持,这是NAT实现的前提
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o $EXTERNAL -j MASQUERADE
# 案例2:实现网关的简单端口映射
# 具体功能:实现外网经过访问网关的外部ip:80,能够直接达到访问私有网络内的一台主机192.168.1.10:80效果

LOCAL_EX_IP=11.22.33.44 #设定网关的外网卡ip,对于多ip状况,参考《如何让你的Linux网关更强大》系列文章
LOCAL_IN_IP=192.168.1.1  #设定网关的内网卡ip
INTERNAL="eth1" #设定内网卡

# 这一步开启ip转发支持,这是NAT实现的前提
echo 1 > /proc/sys/net/ipv4/ip_forward

# 加载须要的ip模块,下面两个是ftp相关的模块,若是有其余特殊需求,也须要加进来
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

# 这一步实现目标地址指向网关外部ip:80的访问都吧目标地址改为192.168.1.10:80
iptables -t nat -A PREROUTING -d $LOCAL_EX_IP -p tcp --dport 80 -j DNAT --to 192.168.1.10

# 这一步实现把目标地址指向192.168.1.10:80的数据包的源地址改为网关本身的本地ip,这里是192.168.1.1
iptables -t nat -A POSTROUTING -d 192.168.1.10 -p tcp --dport 80 -j SNAT --to $LOCAL_IN_IP

# 在FORWARD链上添加到192.168.1.10:80的容许,不然不能实现转发
iptables -A FORWARD -o $INTERNAL -d 192.168.1.10 -p tcp --dport 80 -j ACCEPT

# 经过上面重要的三句话以后,实现的效果是,经过网关的外网ip:80访问,所有转发到内网的192.168.1.10:80端口,实现典型的端口映射
# 特别注意,全部被转发过的数据都是源地址是网关内网ip的数据包,因此192.168.1.10上看到的全部访问都好像是网关发过来的同样,而看不到外部ip
# 一个重要的思想:数据包根据“从哪里来,回哪里去”的策略来走,因此没必要担忧回头数据的问题

# 如今还有一个问题,网关本身访问本身的外网ip:80,是不会被NAT到192.168.1.10的,这不是一个严重的问题,但让人很不爽,解决的方法以下:
iptables -t nat -A OUTPUT -d $LOCAL_EX_IP -p tcp --dport 80 -j DNAT --to 192.168.1.10
获取系统中的NAT信息和诊断错误
了解/proc目录的意义
在Linux系统中,/proc是一个特殊的目录,proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它包含当前系统的一些参数(variables)和状态(status)状况。它以文件系统的方式为访问系统内核数据的操做提供接口
经过/proc能够了解到系统当前的一些重要信息,包括磁盘使用状况,内存使用情况,硬件信息,网络使用状况等等,不少系统监控工具(如HotSaNIC)都经过/proc目录获取系统数据。
另外一方面经过直接操做/proc中的参数能够实现系统内核参数的调节,好比是否容许ip转发,syn-cookie是否打开,tcp超时时间等。
得到参数的方式:
第一种:cat /proc/xxx/xxx,如 cat /proc/sys/net/ipv4/conf/all/rp_filter
第二种:sysctl xxx.xxx.xxx,如 sysctl net.ipv4.conf.all.rp_filter
改变参数的方式:
第一种:echo value > /proc/xxx/xxx,如 echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
第二种:sysctl [-w] variable=value,如 sysctl [-w] net.ipv4.conf.all.rp_filter=1
以上设定系统参数的方式只对当前系统有效,重起系统就没了,想要保存下来,须要写入/etc/sysctl.conf文件中
经过执行 man 5 proc能够得到一些关于proc目录的介绍
查看系统中的NAT状况
和NAT相关的系统变量
/proc/slabinfo:内核缓存使用状况统计信息(Kernel slab allocator statistics)
/proc/sys/net/ipv4/ip_conntrack_max:系统支持的最大ipv4链接数,默认65536(事实上这也是理论最大值)
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 已创建的tcp链接的超时时间,默认432000,也就是5天
和NAT相关的状态值
/proc/net/ip_conntrack:当前的前被跟踪的链接情况,nat翻译表就在这里体现(对于一个网关为主要功能的Linux主机,里面大部分信息是NAT翻译表)
/proc/sys/net/ipv4/ip_local_port_range:本地开放端口范围,这个范围一样会间接限制NAT表规模
# 1. 查看当前系统支持的最大链接数
cat /proc/sys/net/ipv4/ip_conntrack_max 
# 值:默认65536,同时这个值和你的内存大小有关,若是内存128M,这个值最大8192,1G以上内存这个值都是默认65536
# 影响:这个值决定了你做为NAT网关的工做能力上限,全部局域网内经过这台网关对外的链接都将占用一个链接,若是这个值过低,将会影响吞吐量

# 2. 查看tcp链接超时时间
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 
# 值:默认432000(秒),也就是5天
# 影响:这个值过大将致使一些可能已经不用的链接常驻于内存中,占用大量连接资源,从而可能致使NAT ip_conntrack: table full的问题
# 建议:对于NAT负载相对本机的 NAT表大小很紧张的时候,可能须要考虑缩小这个值,以尽早清除链接,保证有可用的链接资源;若是不紧张,没必要修改

# 3. 查看NAT表使用状况(判断NAT表资源是否紧张)
# 执行下面的命令能够查看你的网关中NAT表状况
cat /proc/net/ip_conntrack

# 4. 查看本地开放端口的范围
cat /proc/sys/net/ipv4/ip_local_port_range
# 返回两个值,最小值和最大值

# 下面的命令帮你明确一下NAT表的规模
wc -l /proc/net/ip_conntrack
#或者
grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print $1 ',' $2;}'

# 下面的命令帮你明确可用的NAT表项,若是这个值比较大,那就说明NAT表资源不紧张
grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print $1 ',' $3;}'

# 下面的命令帮你统计NAT表中占用端口最多的几个ip,颇有可能这些家伙再作一些bt的事情,嗯bt的事情:-)
cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10
# 上面这个命令有点瑕疵cut -d' ' -f10会由于命令输出有些行缺项而形成统计误差,下面给出一个正确的写法:
cat /proc/net/ip_conntrack | perl -pe s/^\(.*?\)src/src/g | cut -d ' ' -f1 | cut -d '=' -f2 | sort | uniq -c | sort -nr | head -n 10
相关文章
相关标签/搜索