網絡內容總結(感謝原創)linux
一、Linux內核參數優化web
內核參數是用戶和系統內核之間交互的一個接口,經過這個接口,用戶能夠在系統運行的同時動態更新內核配置,而這些內核參數是經過Linux Proc文件系統存在的。所以,能夠經過調整Proc文件系統達到優化Linux性能的目的。shell
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包的數量。
二、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