1. 程式人生 > >Linux伺服器效能評估與優化(二)

Linux伺服器效能評估與優化(二)

網路內容總結(感謝原創)

1、Linux核心引數優化

     核心引數是使用者和系統核心之間互動的一個介面,通過這個介面,使用者可以在系統執行的同時動態更新核心配置,而這些核心引數是通過Linux Proc檔案系統存在的。因此,可以通過調整Proc檔案系統達到優化Linux效能的目的。

一、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

二、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

三、sysctl.conf 檔案中引數設定及說明

1、常見配置
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:指定傳送套接字緩衝區大小的最大值,單位是位元組。

net.ipv4.tcp_rmem:此引數與net.ipv4.tcp_wmem都是用來優化TCP接收/傳送緩衝區的,包含3個整數值,分別是min、default、max。

對於tcp_rmem,min表示為TCP socket預留的用於接收快取的最小記憶體數量,default表示為TCP socket預留的用於接收快取的預設的記憶體值,max表示用於TCP socket接收快取的記憶體最大值。

對於tcp_wmem,min表示為TCP socket預留的用於傳送快取的記憶體最小值,default表示為TCP socket預留的用於傳送快取的預設的記憶體值,max表示用於TCP socket傳送快取的記憶體最大值。

net.ipv4.tcp_fin_timeout:此引數用於減少處於FIN-WAIT-2連線狀態的時間,使系統可以處理更多的連線。此引數值為整數,單位為秒。

例如,在一個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包的數量。

四、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

2、Linux檔案系統優化

    ulimit -a 用來顯示當前的各種使用者程序限制。
  Linux對於每個使用者,系統限制其最大程序數。為提高效能,可以根據裝置資源情況,設定各linux 使用者的最大程序數,下面我把某linux使用者的最大程序數設為10000個:
  ulimit -u 10000
  其他建議設定成無限制(unlimited)的一些重要設定是:
  資料段長度:ulimit -d unlimited
  最大記憶體大小:ulimit -m unlimited
  堆疊大小:ulimit -s unlimited
  CPU 時間:ulimit -t unlimited
  虛擬記憶體:ulimit -v unlimited
  暫時地,適用於通過 ulimit 命令登入 shell 會話期間。

    永久修改ulimit:

 ulimit -SHn 65535
    ubuntu limit 設定需修改三個檔案:
   [/etc/sysctl.conf]
    fs.file-max = 65535 [/etc/pam.d/common-session]
    session required pam_limits.so
    [/etc/security/limits.conf]
   *  soft nproc 65535
       *  hard nproc 65535
       *  soft nofile 65535 
       *  hard nofile 65535

  說明:* 代表針對所有使用者
  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

    我們通過核心引數瞭解,TCP 連線建立的時候會分配接收緩衝區和傳送緩衝區,各 4KB,一共是 8K
     net.ipv4.tcp_wmem = 4096 16384 4194304

 net.ipv4.tcp_rmem = 4096 87380 4194304
 第一個值是socket 的傳送快取區分配的最少位元組數;
     第二個值是預設值( 該值會被net.core.wmem_default 覆蓋), 快取區在系統負載不重的情況下可以增長到這個值;
     第三個值是傳送快取區空間的最大位元組數( 該值會被net.core.wmem_max 覆蓋 )。  就是說,每個tcp連線的socket,根據實際情況測試,如果單單建立穩定連線,緩衝區基本不佔記憶體。

3、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

4、Linux網路調優

作業系統安裝完畢,就要對網路子系統進行調優。對其它子系統的影響:影響CPU利用率,尤其在有大量TCP連線、塊尺寸又非常小時,記憶體的使用會

明顯增加。

1)如何預防效能下降


  如下的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


2)針對TCP和UDP的調優

  下邊的命令用來對連線數量非常大的伺服器進行調優。

◆對於同時支援很多連線的伺服器,新的連線可以重新使用TIME-WAIT套接字。 這對於Web伺服器非常有效:
  sysctl -w net.ipv4.tcp_tw_reuse=1
  如果你使用該命令,還要啟動TIME-WAIT 套接字狀態的快速迴圈功能:
  sysctl -w net.ipv4.tcp_tw_recycle=1
  每個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

5、Linux網路安全設定

1)TCP SYN Flood 攻擊

  TCP SYN Flood是一種常見,而且有效的遠端(遠端)拒絕服務(Denial of Service)攻擊方式,它透過一定的操作破壞TCP三次握手建立正常連線,佔用並耗費系統資源,使得提供TCP服務的主機系統無法正常工作。由於TCP SYN Flood是透過網路底層對伺服器Server進行攻擊的,它可以在任意改變自己的網路IP地址的同時,不被網路上的其他裝置所識別,這樣就給防範網路犯罪部門追查犯罪來源造成很大的困難。系統檢查

  一般情況下,可以一些簡單步驟進行檢查,來判斷系統是否正在遭受TCP SYN Flood攻擊。

  1、服務端無法提供正常的TCP服務。連線請求被拒絕或超時。
  2、透過 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

2)Linux上的NAT與iptables

談起Linux上的NAT,大多數人會跟你提到iptables。原因是因為iptables是目前在linux上實現NAT的一個非常好的介面。它通過和核心級直接操作網路包,效率和穩定性都非常高。這裡簡單列舉一些NAT相關的iptables例項命令,可能對於大多數實現有多幫助。 # 案例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

感謝您的支援,我會繼續努力的! 掃碼打賞,你說多少就多少