- A 64 bits hardware/kernel (AMD64, Opterons)
- At least 8GB of ram
- A recent linux kernel (2.6.x)
About tuning, I prefer to not fully disclose them because servers are targets of many attacks, so it's better not help hackers.
The most touchy thing is the IP route cache : You have to tune it or else the machine drops many connections
(hint : rhash_entries=... in the boot append string)
hints :
echo 1 > /proc/sys/net/ipv4/route/gc_interval
echo 150 >/proc/sys/net/ipv4/route/gc_timeout
echo 2 >/proc/sys/net/ipv4/route/gc_elasticity
- Use of hugeTLB pages
hint :
echo xxx >/proc/sys/vm/nr_hugepages
Tune tcp :
echo "4096 49152 131072" >/proc/sys/net/ipv4/tcp_wmem
echo xxxx >/proc/sys/net/ipv4/tcp_max_syn_backlog
echo xxxx >/proc/sys/net/core/somaxconn
echo 1200000 > /proc/sys/net/ipv4/tcp_max_tw_buckets
echo 7 >/proc/sys/net/ipv4/tcp_retries2
echo "600000 650000 700000" >/proc/sys/net/ipv4/tcp_mem
echo 0 >/proc/sys/net/ipv4/tcp_timestamps
echo 0 >/proc/sys/net/ipv4/tcp_window_scaling
echo 0 >/proc/sys/net/ipv4/tcp_sack
echo 330000 >/proc/sys/net/ipv4/tcp_max_orphans
echo "10000 62000" >/proc/sys/net/ipv4/ip_local_port_range
others :
echo 1300000 >/proc/sys/fs/file-max
有多種方法加大Linux的threads數
1、sysctl -w kernel.threads-max=8167 最大threads數
2、echo 8167 > /proc/sys/kernel/threads-max
重啟後儲存修改值
編輯/etc/sysctl.conf
增加
kernel.threads-max = 8167
#sysctl -p 馬上生效
/proc/sys/net/ipv4/參數說明
參數名 參數類型
參數值(如無特別標註,記憶體類的單位為byte,關於時間的單位為秒)
官方詳細說明(skylove對該參數的個人心得或補充說明)
ip_forward :BOOLEAN
0 - 關閉(預設值)
非0值 - 開啟ip轉寄
在網路本地介面之間轉寄資料報。該參數非常特殊,對該參數的修改將導致其它所有相關配置參數恢複其預設值(對於主機參閱RFC1122,對於路由器參見 RFC1812)(在其他一些作業系統中,這個參數不是boolean型,而是INTEGER型,設定為0為不轉寄,1為根據介面情形決定是否轉寄,2是 始終轉寄)
ip_default_ttl :INTEGER
預設值為 64
表示IP資料報的Time To Live值(在網路傳遞中,每經過一"跳",該值減少1,當ttl為0的時候,丟棄該包.該值越大,即在網路上可以經過的路由器裝置的數量越多,但一個錯 誤的包,也會越發浪費生存周期.根據目前的實際情形而看,設定為32已經足夠普通網路訪問Internet的需求了)
ip_no_pmtu_disc :BOOLEAN
預設值為FALSE(0)
關閉路徑MTU探測(典型的瓶頸原理,一次成功的傳輸中,mtu是由網路上最"窄"的位置決定的.如果IP層有一個資料報要傳,而且資料的長度比鏈路層的MTU還大,那麼IP層就需要進行分區(fragmentation),把資料報分成若干片,這樣每一片都小於MTU。
幾種常見網路的MTU值:
超通道 65535
16Mb/ s令牌網(IBM) 17914
4Mb/ s令牌網(IEEE 802.5) 4464
FDDI 4352
乙太網路 1500
IEEE 802.3/802.2 1492
X.25 576
點對點(低延時) 296
ipfrag_high_thresh :INTEGER
預設值為262144
用來組裝分段的IP包的最大記憶體量。兩個檔案分別表示用於重組IP分段的記憶體配置最低值和最高值,一旦達到最高記憶體配置值,其它分段將被丟棄,直到達到最 低記憶體(ipfrag_low_thresh 見下文)分配值。(根據我個人理解,就是達到最高後,就"關門打狗",直到處理到最低值的時候才又開門放分段的ip包進來處理.如果最高/最低差距過小, 很可能很快又達到限制又開始丟棄包;而設定過大,又會造成某段時間丟包時間持續過久.因此需要適當地考慮,預設值中給出的最低/最高比率值為3/4.此外 補充說明, kernel中,對記憶體的使用單位,都是以byte為單位的.當TCP資料包傳輸發生錯誤時,開始磁碟重組。有效資料包保留在記憶體,同時損壞的資料包被 轉寄。我在1G記憶體的NAT機器上,分別設定最低為262144,最高為393216)
ipfrag_low_thresh :INTEGER
預設值為196608
參見ipfrag_high_thresh。
ipfrag_time :INTEGER
預設值為30
儲存一個IP分區在記憶體中的時間。
inet_peer_threshold :INTEGER
預設值為65664
INET 對端儲存空間某個合適值,當超過該閥值條目將被丟棄。該閥值同樣決定存留時間以及廢物收集通過的時間間隔。條目越多?存活期越低?GC 間隔越短(GC=Grabage Collection 廢物收集?預設值65664=65536 + 128 是怎麼得來的呢?看include/net/inetpeer.h struct inet_peer的內容,是為了IP ROUTE更快,緩衝對方IP的資訊,一個對方IP一個記錄.該值與
inet_peer_gc_maxtime
inet_peer_gc_mintime
inet_peer_maxttl
inet_peer_minttl
inet_peer_threshold
參數都是用來控制這個cache的大小的。似乎這個cache消耗比較大,在CU上有朋友提到過在一個26M的嵌入式Linux中,這個cache就用到了1M多記憶體)
inet_peer_minttl :INTEGER
預設值為120
條目的最低存活期。在重組端必須要有足夠的片段(fragment)存活期。這個最低存活期必須保證緩衝池容積是否少於 inet_peer_threshold。該值以 jiffies為單位測量。(每次整理的時候,會考慮小於inet_peer_minttl 的ip條目一定儲存,而大於inet_peer_maxttl時間設定的ip條目會被釋放)
inet_peer_maxttl :INTEGER
預設值為600
條目的最大存活期。在此期限到達之後?如果緩衝池沒有耗盡壓力的話(例如?緩衝池中的條目數目非常少)?不使用的條目將會逾時。該值以 jiffies為單位測量。
inet_peer_gc_mintime :INTEGER
預設值為10
廢物收集(GC)通過的最短間隔。這個間隔會影響到緩衝池中記憶體的高壓力。 該值以 jiffies為單位測量。(如果長期不整理,會cache很多條目,而整理的時間太頻繁,又會給系統造成壓力,這個值就是確定最小整理周期間隔的)
inet_peer_gc_maxtime :INTEGER
預設值為120
廢物收集(GC)通過的最大間隔,這個間隔會影響到緩衝池中記憶體的低壓力。 該值以 jiffies為單位測量。Jiffie: 核心使用的內部時間單位,在i386系統上大小為1/100s,在Alpha中為1/1024S。在/usr/include/asm/param.h中 的HZ定義有特定系統的值。
====================TCP 參數================
tcp_syn_retries :INTEGER
預設值是5
對於一個建立串連,核心要發送多少個 SYN 串連請求才決定放棄。不應該大於255,預設值是5,對應於180秒左右時間。(對於大負載而物理通訊良好的網路而言,這個值偏高,可修改為2.這個值僅 僅是針對對外的串連,對進來的串連,是由tcp_retries1 決定的)
tcp_synack_retries :INTEGER
預設值是5
對於遠端的串連請求SYN,核心會發送SYN + ACK資料報,以確認收到上一個 SYN串連請求包。這是所謂的三向交握( threeway handshake)機制的第二個步驟。這裡決定核心在放棄串連之前所送出的 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
系統在同時所處理的最大 timewait sockets 數目。如果超過此數的話?time-wait socket 會被立即砍除並且顯示警告資訊。之所以要設定這個限制?純粹為了抵禦那些簡單的 DoS 攻擊?千萬不要人為的降低這個限制?不過?如果網路條件需要比預設值更多?則可以提高它(或許還要增加記憶體)。(事實上做NAT的時候最好可以適當地增加 該值)
tcp_tw_recycle :BOOLEAN
預設值是0
開啟快速 TIME-WAIT sockets 回收。除非得到技術專家的建議或要求?請不要隨意修改這個值。(做NAT的時候,建議開啟它)
tcp_tw_reuse:BOOLEAN
預設值是0
該檔案表示是否允許重新應用處於TIME-WAIT狀態的socket用於新的TCP串連(這個對快速重啟動某些服務,而啟動後提示連接埠已經被使用的情形非常有協助)
tcp_max_orphans :INTEGER
預設值是8192
系統所能處理不屬於任何進程的TCP sockets最大數量。假如超過這個數量?那麼不屬於任何進程的串連會被立即reset,並同時顯示警告資訊。之所以要設定這個限制?純粹為了抵禦那些 簡單的 DoS 攻擊?千萬不要依賴這個或是人為的降低這個限制(這個值Redhat AS版本中設定為32768,但是很多防火牆修改的時候,建議該值修改為2000)
tcp_abort_on_overflow :BOOLEAN
預設值是0
當守護進程太忙而不能接受新的串連,就象對方發送reset訊息,預設值是false。這意味著當溢出的原因是因為一個偶然的猝發,那麼串連將恢複狀態。 只有在你確信守護進程真的不能完成串連請求時才開啟該選項,該選項會影響客戶的使用。(對待已經滿載的sendmail,apache這類服務的時候,這 個可以很快讓用戶端終止串連,可以給予服務程式處理已有串連的緩衝機會,所以很多防火牆上推薦開啟它)
tcp_syncookies :BOOLEAN
預設值是0
只有在核心編譯時間選擇了CONFIG_SYNCOOKIES時才會發生作用。當出現syn等候隊列出現溢出時象對方發送syncookies。目的是為了防止syn flood攻擊。
注意:該選項千萬不能用於那些沒有收到攻擊的高負載伺服器,如果在日誌中出現synflood訊息,但是調查發現沒有收到synflood攻擊,而是合法使用者的串連負載過高的原因,你應該調整其它參數來提高伺服器效能。參考:
tcp_max_syn_backlog
tcp_synack_retries
tcp_abort_on_overflow
syncookie 嚴重的違背TCP協議,不允許使用TCP擴充,可能對某些服務導致嚴重的效能影響(如SMTP轉寄)。(注意,該實現與BSD上面使用的tcp proxy一樣,是違反了RFC中關於tcp串連的三向交握實現的,但是對於防禦syn-flood的確很有用.)
tcp_stdurg :BOOLEAN
預設值為0
使用 TCP urg pointer 欄位中的主機請求解釋功能。大部份的主機都使用老舊的 BSD解釋,因此如果您在 Linux 開啟它?或會導致不能和它們正確溝通。
tcp_max_syn_backlog :INTEGER
對於那些依然還未獲得用戶端確認的串連請求?需要儲存在隊列中最大數目。對於超過 128Mb 記憶體的系統?預設值是 1024 ?低於 128Mb 的則為 128。如果伺服器經常出現過載?可以嘗試增加這個數字。警告?假如您將此值設為大於 1024?最好修改 include/net/tcp.h 裡面的 TCP_SYNQ_HSIZE ?以保持 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog ?並且編進核心之內。(SYN Flood攻擊利用TCP協議散布握手的缺陷,偽造虛假源IP地址發送大量TCP-SYN半開啟串連到目標系統,最終導致目標系統Socket隊列資源耗 盡而無法接受新的串連。為了應付這種攻擊,現代Unix系統中普遍採用多串連隊列處理的方式來緩衝(而不是解決)這種攻擊,是用一個基本隊列處理正常的完 全串連應用(Connect()和Accept() ),是用另一個隊列單獨存放半開啟串連。這種雙隊列處理方式和其他一些系統核心措施(例如Syn-Cookies/Caches)聯合應用時,能夠比較有 效的緩解小規模的SYN Flood攻擊(事實證明<1000p/s)加大SYN隊列長度可以容納更多等待串連的網路連接數,所以對Server來說可以考慮增大該值.)
tcp_window_scaling :INTEGER
預設值為1
該檔案表示設定tcp/ip會話的滑動視窗大小是否可變。參數值為布爾值,為1時表示可變,為0時表示不可變。tcp/ip通常使用的視窗最大可達到 65535 位元組,對於高速網路,該值可能太小,這時候如果啟用了該功能,可以使tcp/ip滑動視窗大小增大數個數量級,從而提高資料轉送的能力(RFC 1323)。(對普通地百M網路而言,關閉會降低開銷,所以如果不是高速網路,可以考慮設定為0)
tcp_timestamps :BOOLEAN
預設值為1
Timestamps 用在其它一些東西中?可以防範那些偽造的 sequence 號碼。一條1G的寬頻線路或許會重遇到帶 out-of-line數值的舊sequence 號碼(假如它是由於上次產生的)。Timestamp 會讓它知道這是個 '舊封包'。(該檔案表示是否啟用以一種比逾時重發更精確的方法(RFC 1323)來啟用對 RTT 的計算;為了實現更好的效能應該啟用這個選項。)
tcp_sack :BOOLEAN
預設值為1
使用 Selective ACK?它可以用來尋找特定的遺失的資料報--- 因此有助於快速恢複狀態。該檔案表示是否啟用有選擇的應答(Selective Acknowledgment),這可以通過有選擇地應答亂序接收到的報文來提高效能(這樣可以讓寄件者只發送丟失的報文段)。(對於廣域網路通訊來說這個 選項應該啟用,但是這會增加對 CPU 的佔用。)
tcp_fack :BOOLEAN
預設值為1
開啟FACK擁塞避免和快速重傳功能。(注意,當tcp_sack設定為0的時候,這個值即使設定為1也無效)
tcp_dsack :BOOLEAN
預設值為1
允許TCP發送"兩個完全相同"的SACK。
tcp_ecn :BOOLEAN
預設值為0
開啟TCP的直接擁塞通告功能。
tcp_reordering :INTEGER
預設值是3
TCP流中重排序的資料報最大數量 。 (一般有看到推薦把這個數值略微調整大一些,比如5)
tcp_retrans_collapse :BOOLEAN
預設值為1
對於某些有bug的印表機提供針對其bug的相容性。(一般不需要這個支援,可以關閉它)
tcp_wmem(3個INTEGER變數): min, default, max
min:為TCP socket預留用於發送緩衝的記憶體最小值。每個tcp socket都可以在建議以後都可以使用它。預設值為4096(4K)。
default:為TCP socket預留用於發送緩衝的記憶體數量,預設情況下該值會影響其它協議使用的net.core.wmem_default 值,一般要低於net.core.wmem_default的值。預設值為16384(16K)。
max: 用於TCP socket發送緩衝的記憶體最大值。該值不會影響net.core.wmem_max,"靜態"選擇參數SO_SNDBUF則不受該值影響。預設值為 131072(128K)。(對於伺服器而言,增加這個參數的值對於發送資料很有協助,在我的網路環境中,修改為了51200 131072 204800)
tcp_rmem (3個INTEGER變數): min, default, max
min:為TCP socket預留用於接收緩衝的記憶體數量,即使在記憶體出現緊張情況下tcp socket都至少會有這麼多數量的記憶體用於接收緩衝,預設值為8K。
default:為TCP socket預留用於接收緩衝的記憶體數量,預設情況下該值影響其它協議使用的 net.core.wmem_default 值。該值決定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win=0預設值情況下,TCP視窗大小為65535。 預設值為87380
max:用於TCP socket接收緩衝的記憶體最大值。該值不會影響 net.core.wmem_max,"靜態"選擇參數 SO_SNDBUF則不受該值影響。預設值為 128K。預設值為87380*2 bytes。(可以看出,.max的設定最好是default的兩倍,對於NAT來說主要該增加它,我的網路裡為 51200 131072 204800)
tcp_mem(3個INTEGER變數):low, pressure, high
low:當TCP使用了低於該值的記憶體頁面數時,TCP不會考慮釋放記憶體。(理想情況下,這個值應與指定給 tcp_wmem 的第 2 個值相匹配 - 這第 2 個值表明,最大頁面大小乘以最大並發請求數除以頁大小 (131072 * 300 / 4096)。 )
pressure:當TCP使用了超過該值的記憶體頁面數量時,TCP試圖穩定其記憶體使用量,進入pressure模式,當記憶體消耗低於low值時則退出 pressure狀態。(理想情況下這個值應該是 TCP 可以使用的總緩衝區大小的最大值 (204800 * 300 / 4096)。 )
high:允許所有tcp sockets用於排隊緩衝資料報的頁面量。(如果超過這個值,TCP 串連將被拒絕,這就是為什麼不要令其過於保守 (512000 * 300 / 4096) 的原因了。 在這種情況下,提供的價值很大,它能處理很多串連,是所預期的 2.5 倍;或者使現有串連能夠傳輸 2.5 倍的資料。 我的網路裡為192000 300000 732000)
一般情況下這些值是在系統啟動時根據系統記憶體數量計算得到的。
tcp_app_win : INTEGER
預設值是31
保留max(window/2^tcp_app_win, mss)數量的視窗由於應用緩衝。當為0時表示不需要緩衝。
tcp_adv_win_scale : INTEGER
預設值為2
計算緩衝開銷bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。
tcp_rfc1337 :BOOLEAN
預設值為0
這個開關可以啟動對於在RFC1337中描述的"tcp 的time-wait暗殺危機"問題的修複。啟用後,核心將丟棄那些發往time-wait狀態TCP通訊端的RST 包.
tcp_low_latency : BOOLEAN
預設值為0
允許 TCP/IP 棧適應在高輸送量情況下低延時的情況;這個選項一般情形是的禁用。(但在構建Beowulf 叢集的時候,開啟它很有協助)
tcp_westwood :BOOLEAN
預設值為0
啟用寄件者端的擁塞控制演算法,它可以維護對輸送量的評估,並試圖對頻寬的整體利用情況進行最佳化;對於 WAN 通訊來說應該啟用這個選項。
tcp_bic :BOOLEAN
預設值為0
為快速長距離網路啟用 Binary Increase Congestion;這樣可以更好地利用以 GB 速度進行操作的連結;對於 WAN 通訊應該啟用這個選項。
==============IP、ICMP===========
ip_local_port_range: (兩個INTEGER)
定於TCP和UDP使用的本地連接埠範圍,第一個數是開始,第二個數是最後連接埠號碼,預設值依賴於系統中可用的記憶體數:
> 128Mb 32768-61000
< 128Mb 1024-4999 or even less.
該值決定了活動串連的數量,也就是系統可以並發的串連數(做nat的時候,我將它設定為了1024 65530 工作正常)
ip_nonlocal_bind : BOOLEAN
預設值是0
如果您想讓應用程式能夠捆綁到一個不屬於該系統的位址?就需要設定這?。(當機器使
用非固定/動態網路連接的時候,或者離線偵錯工具的時候,當線路斷掉之後?該服務仍可?動而且捆綁到特定的位址之上。)
ip_dynaddr : BOOLEAN
預設值是0
假如甚至為非0值,那麼將支援動態地址.如果是設定為>1的值,將在動態地址改寫的時候發一條核心訊息。(如要用動態介面位址做 dail-on-demand ?那就設定它。一旦請求介面起來之
後?所有看不到回應的本地 TCP socket 都會重新捆綁(rebound)?以獲得正確的位址。
假如遇到該網路介面的連線不工作?但重新再試一次卻又可以的情形?設定這個可解決這
個問題。)
icmp_echo_ignore_all : BOOLEAN
icmp_echo_ignore_broadcasts : BOOLEAN
預設值是0
如果任何一個設定為true(>0)則系統將忽略所有發送給自己的ICMP ECHO請求或那些廣播位址的請求。(現在網路上很多病毒/木馬自動發起感染攻擊是先用icmp的echo方式判斷對方是否存活,因此開啟該值,會降低一 些被騷擾的可能性。但由于禁止了 icmp,就無法ping到該機器了,因此網路系統管理員也沒有辦法判斷機器是否存活了,所以可以考慮用netfilter/iptables來完成該工作會 更有所選擇針對性.icmp_echo_ignore_all 是禁止所有的icmp包,而icmp_echo_ignore_broadcasts是禁止了所有的廣播包)
icmp_ratelimit : INTEGER
預設值是100 Jiffie
限制發向特定目標的匹配icmp_ratemask的ICMP資料報的最大速率。0表示沒有任何限制,否則表示jiffies資料單位中允許發送的個數。 (如果在icmp_ratemask進行相應的設定Echo Request的標誌位元遮罩設定為1,那麼就可以很容易地做到ping回應的速度限制了)
icmp_ratemask : INTEGER
在這裡匹配的ICMP被icmp_ratelimit參數限制速率.
匹配的標誌位: IHGFEDCBA9876543210
預設的掩碼值: 0000001100000011000 (6168)
關於標誌位的設定,可參考 來源程式目錄/include/linux/icmp.h
0 Echo Reply
3 Destination Unreachable *
4 Source Quench *
5 Redirect
8 Echo Request
B Time Exceeded *
C Parameter Problem *
D Timestamp Request
E Timestamp Reply
F Info Request
G Info Reply
H Address Mask Request
I Address Mask Reply
* 號的被預設限速(見上表mask)
icmp_ignore_bogus_error_responses : BOOLEAN
預設值是0
某些路由器違背RFC1122標準,其對廣播幀發送偽造的響應來應答。這種違背行為通常會被以警示的方式記錄在系統日誌中。如果該選項設定為True,核心不會記錄這種警告資訊。(我個人而言推薦設定為1)
===========網路介面介面(比如lo,eth0,eth1)參數===========
/proc/sys/net/ipv4/conf/{interface}/* :
在/proc/sys/net/ipv4/conf/ 下可以發現類似 all,eth0,eth1,default,lo 等網路介面介面,每一個都是目錄,他們下屬的檔案中,每個檔案對應該介面下某些可以設定的選項設定.(all/是特定的,用來修改所有介面的設定, default/ 表示預設設定,lo/表示本地介面設定,eth0/表示第一塊網卡,eth1/表示第2塊網卡.注意:下面有的參數,是需要all和該介面下同時為 ture才生效,而某些則是只需要該介面下為true即可,注意區別!!)
log_martians : BOOLEAN
記錄帶有不允許的地址的資料報到核心日誌中。all/ 或者{interface}/ 下至少有一個為True即可生效.
accept_redirects : BOOLEAN
對於主機來說預設為True,對於用作路由器時預設值為False
收發接收ICMP重新導向訊息。all/ 和{interface}/ 下兩者同時為True方可生效.
(如果不熟悉所在網路的結構.推薦不修改,因為在有多個出口的網路的時候,如果有2個出口路由器,由於作為主機的時候預設只指認一個網關,出口路由可能有原則設定轉到另一個路由器上.)
forwarding : BOOLEAN
在該介面開啟轉寄功能 (在3塊或以上的網卡的時候很實用,有時候只想讓其中一外一內,另一塊做服務,就可以讓這塊做服務的網卡不轉寄資料進出)
mc_forwarding :BOOLEAN
是否進行多播路由。只有核心編譯有CONFIG_MROUTE並且有路由服務程式在運行該參數才有效。
medium_id :INTEGER
預設值是0
通常,這個參數用來區分不同媒介.兩個網路裝置可以使用不同的值,使他們只有其中之一接收到廣播包.預設值為0表示各個網路介質接受他們自己介質上的媒 介,值-1表示該媒介未知。通常,這個參數被用來配合proxy_arp實現roxy_arp的特性即是允許arp報文在兩個不同的網路介質中轉寄.(第 一段 Integer value used to differentiate the devices by the medium they
are attached to. Two devices can have different id values when
the broadcast packets are received only on one of them.
The default value 0 means that the device is the only interface
to its medium, value of -1 means that medium is not known.沒讀懂,去cu問人,以後更正)
proxy_arp : BOOLEAN
開啟arp代理功能。all/ 或者{interface}/ 下至少有一個為True即可生效
shared_media : BOOLEAN
預設為True
發送(路由器)或接收(主機) RFC1620 共用媒體重新導向。覆蓋ip_secure_redirects的值。all/ 或者{interface}/ 下至少有一個為True即可生效
secure_redirects : BOOLEAN
預設為True
僅僅接收發給預設閘道列表中網關的ICMP重新導向訊息,預設值是TRUE。all/ 或者{interface}/ 下至少有一個為True即可生效。 (這個參數一般情形請不要修改,可以有效地防止來自同網段的非網關機器發出惡意ICMP重新導向攻擊行為)
send_redirects : BOOLEAN
預設為True
如果是router,允許發送重新導向訊息.all/ 或者{interface}/ 下至少有一個為True即可生效。(根據網路而定,如果是做NAT,並且網內只有此一個網關的時候,其實是可以關閉掉它的,事實上目前而言,IP Redirects是TCP/IP協議產生早期為瞭解決網路持久性而提出的一種方法,後來事實證明這種措施不太實用而且具有很大的安全風險,可能引起各種 可能的網路風險產生 - 拒絕服務的攻擊,中間人攻擊,工作階段劫持等等,所以很多安全文檔是推薦關閉它.)
bootp_relay : BOOLEAN
預設為False
接收源地址為0.b.c.d,目的地址不是原生資料報。用來支援BOOTP轉寄服務進程,該進程將捕獲並轉寄該包。目前還沒有實現。
accept_source_route : BOOLEAN
對於主機來說預設為False,對於用作路由器時預設值為True
接收帶有SRR選項的資料報。all/ 和{interface}/ 下兩者同時為True方可生效.(IP 源路由選項,也是TCP/IP協議早期的一個實現缺陷,允許IP包自身攜帶路由選擇選項,這將允許攻擊者繞過某些安全檢驗的網關,或者被用來探測網路環 境。在企業網關上強烈建議設定關閉或過綠丟棄IP源路由選項資料包。這個功能在調試網路的時候很有用,但是在真正的實際應用中,有可能造成一些麻煩和危 險)
rp_filter : BOOLEAN
預設值為False
1 - 通過反向路徑回溯進行源地址驗證(在RFC1812中定義)。對於單穴主機和stub網路路由器推薦使用該選項。
0 - 不通過反向路徑回溯進行源地址驗證。
預設值為0,但某些發布在啟動時自動將其開啟。 (router預設會路由所有東西?就算該封包'顯然'不屬於我們的網路的。常見的例子?莫過於將私人 IP 泄漏到 internet 上去。假如某個介面?其上設定的網路位址區段?
195.96.96.0/24? 那麼理論上不會有212.64.94.1 這樣的位址區段封包會到達這個介面上。許多人都不想轉寄非本網段的資料包?因此核心設計者也開啟了方便之門。在 /proc ?面有些檔案?透過它們您可以讓核心?您做到這點。此方法被稱? "逆向路徑過濾(Reverse Path Filtering)"。基本上?假如對此封包作出的回應?不是循其進入的介面送出去?那它就被置之不理。)
arp_filter : BOOLEAN
預設值為False
1 -允許多個網路介質位於同一子網段內,每個網路介面依據是否核心指派路由該資料包經過此介面來確認是否回答ARP查詢(這個實現是由來源地址確定路由的時候決定的),換句話說,允許控制使用某一塊網卡(通常是第一塊)回應arp詢問。(做負載平衡的時候,可以考慮用
echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
這樣的方式就可以解決,當然 利用
echo 2 /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
兩條命令配合使用更好,因為arp_announce 和arp_ignore 似乎是對arp_filter的更細節控制的實現。)
0 -預設值,核心設定每個網路介面各自應答其地址上的arp詢問。這項看似會錯誤的設定卻經常能非常有效,因為它增加了成功通訊的機會。在Linux主機 上,每個IP地址是網路介面獨立的,而非一個複合的介面。只有在一些特殊的設定的時候,比如負載平衡的時候會帶來麻煩。
all/ 或者{interface}/ 下至少有一個為True即可生效。(簡單來說,就是同一Linux上,如果有某些原因,有2塊網卡必須設定為同一網段,那麼預設情況下,會有一塊工作,而另外一塊不工作或者核心頻繁報告錯誤,這個時候就需要開啟這個選項了)
arp_announce : INTEGER
預設為0
對網路介面上本地IP地址發出的ARP回應作出相應層級的限制:
確定不同程度的限制,宣布對來自本地源IP地址發出Arp請求的介面
0 - (預設) 在任意網路介面上的任何本地地址
1 -盡量避免不在該網路介面子網段的本地地址. 當發起ARP請求的源IP地址是被設定應該經由路由達到此網路介面的時候很有用.此時會檢查來訪IP是否為所有介面上的子網段內ip之一.如果改來訪IP 不屬於各個網路介面上的子網段內,那麼將採用層級2的方式來進行處理.
2 - 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP資料包的源地址並嘗試選擇與能與該地址通訊的本地地址.首要是選擇所有的網路介面的子網中外出 訪問子網中包含該目標IP地址的本地地址. 如果沒有合適的地址被發現,將選擇當前的發送網路介面或其他的有可能接受到該ARP回應的網路介面來進行發送
all/ 和{interface}/ 下兩者同時比較,取較大一個值生效.
提高約束層級有益於從指定的目標接受應答,而降低層級可以給予更多的arp查詢者以反饋資訊(關於arp代理這一段我普遍翻譯地不好,去啃一下tcp/ip bible的卷一,然後再翻譯吧)
arp_ignore : INTEGER
預設為0
定義對目標地址為本地IP的ARP詢問不同的接聽模式
0 - (預設值): 回應任何網路介面上對任何本地IP地址的arp查詢請求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那麼即使 eth0收到來自10.1.1.2這樣地址發起的對10.1.1.1 的arp查詢也會回應--而原本這個請求該是出現在eth1上,也該有eth1回應的)
1 - 只回答目標IP地址是來訪網路介面本地地址的ARP查詢請求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那麼即使 eth0收到來自10.1.1.2這樣地址發起的對192.168.0.1的查詢會回答,而對10.1.1.1 的arp查詢不會回應)
2 -只回答目標IP地址是來訪網路介面本地地址的ARP查詢請求,且來訪IP必須在該網路介面的子網段內(比如eth0=192.168.0.1/24, eth1=10.1.1.1/24,eth1收到來自10.1.1.2這樣地址發起的對192.168.0.1的查詢不會回答,而對 192.168.0.2發起的對192.168.0.1的arp查詢會回應)
3 - 不回應該網路介面的arp請求,而只對設定的唯一和串連地址做出回應(do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied 翻譯地似乎不好,這個我的去問問人)
4-7 - 保留未使用
8 -不回應所有(本地地址)的arp查詢
all/ 和{interface}/ 下兩者同時比較,取較大一個值生效.
tag : INTEGER
預設為0