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
相關文章
相關標籤/搜索