天天看點

中國最完整的sysctl.conf優化方案

###################

所有rfc相關的選項都是預設啟用的,是以網上的那些還自己寫rfc支援的都可以扔掉了:)

###############################

net.inet.ip.sourceroute=0

net.inet.ip.accept_sourceroute=0

#############################

通過源路由,攻擊者可以嘗試到達内部IP位址 --包括RFC1918中的位址,是以

不接受源路由資訊包可以防止你的内部網絡被探測。

#################################

net.inet.tcp.drop_synfin=1

###################################

安全參數,編譯核心的時候加了options TCP_DROP_SYNFIN才可以用,可以阻止某些OS探測。

##################################

kern.maxvnodes=8446

vnode 是對檔案或目錄的一種内部表達。 是以, 增加可以被作業系統利用的 vnode 數量将降低磁盤的 I/O。

一般而言, 這是由作業系統自行完成的,也不需要加以修改。但在某些時候磁盤 I/O 會成為瓶頸,

而系統的 vnode 不足, 則這一配置應被增加。此時需要考慮是非活躍和空閑記憶體的數量。

要檢視目前在用的 vnode 數量:

# sysctl vfs.numvnodes

vfs.numvnodes: 91349

要檢視最大可用的 vnode 數量:

# sysctl kern.maxvnodes

kern.maxvnodes: 100000

如果目前的 vnode 用量接近最大值,則将 kern.maxvnodes 值增大 1,000 可能是個好主意。

您應繼續檢視 vfs.numvnodes 的數值, 如果它再次攀升到接近最大值的程度,

仍需繼續提高 kern.maxvnodes。 在 top(1) 中顯示的記憶體用量應有顯著變化,

更多記憶體會處于活躍 (active) 狀态。

####################################

kern.maxproc: 964

Maximum number of processes

kern.maxprocperuid: 867

Maximum processes allowed per userid

因為我的maxusers設定的是256,20+16*maxusers=4116。

maxprocperuid至少要比maxproc少1,因為init(8) 這個系統程式絕對要保持在運作狀态。

我給它設定的2068。

kern.maxfiles: 1928

系統中支援最多同時開啟的檔案數量,如果你在運作資料庫或大的很吃描述符的程序,那麼應該設定在20000以上,

比如kde這樣的桌面環境,它同時要用的檔案非常多。

一般推薦設定為32768或者65536。

kern.argmax: 262144

maximum number of bytes (or characters) in an argument list.

指令行下最多支援的參數,比如你在用find指令來批量删除一些檔案的時候

find . -name "*.old" -delete,如果檔案數超過了這個數字,那麼會提示你數字太多的。

可以利用find . -name "*.old" -ok rm {} /;來删除。

預設的參數已經足夠多了,是以不建議再做修改。

kern.securelevel: -1

-1:這是系統預設級别,沒有提供任何核心的保護錯誤;

0:基本上作用不多,當你的系統剛啟動就是0級别的,當進入多使用者模式的時候就自動變成1級了。

1:在這個級别上,有如下幾個限制:

  a. 不能通過kldload或者kldunload加載或者解除安裝可加載核心子產品;

  b. 應用程式不能通過/dev/mem或者/dev/kmem直接寫記憶體;

  c. 不能直接往已經裝在(mounted)的磁盤寫東西,也就是不能格式化磁盤,但是可以通過标準的核心接口執行寫操作;

  d. 不能啟動X-windows,同時不能使用chflags來修改檔案屬性;

2:在 1 級别的基礎上還不能寫沒裝載的磁盤,而且不能在1秒之内制造多次警告,這個是防止DoS控制台的;

3:在 2 級别的級别上不允許修改IPFW防火牆的規則。

  如果你已經裝了防火牆,并且把規則設好了,不輕易改動,那麼建議使用3級别,如果你沒有裝防火牆,而且還準備裝防火牆的話,不建議使用。

我們這裡推薦使用 2 級别,能夠避免比較多對核心攻擊。

kern.maxfilesperproc: 1735

每個程序能夠同時打開的最大檔案數量,網上很多資料寫的是32768

除非用異步I/O或大量線程,打開這麼多的檔案恐怕是不太正常的。

我個人建議不做修改,保留預設。

kern.ipc.maxsockbuf: 262144

最大的套接字緩沖區,網上有建議設定為2097152(2M)、8388608(8M)的。

我個人倒是建議不做修改,保持預設的256K即可,緩沖區大了可能造成碎片、阻塞或者丢包。

kern.ipc.somaxconn: 128

最大的等待連接配接完成的套接字隊列大小,即并發連接配接數。

高負載伺服器和受到Dos攻擊的系統也許會因為這個隊列被塞滿而不能提供正常服務。

預設為128,推薦在1024-4096之間,根據機器和實際情況需要改動,數字越大占用記憶體也越大。

kern.ipc.nmbclusters: 4800

這個值用來調整系統在開機後所要配置設定給網絡 mbufs 的 cluster 數量,

由于每個 cluster 大小為 2K,是以當這個值為 1024 時,也是會用到 2MB 的核心記憶體空間。

假設我們的網頁同時約有 1000 個聯機,而 TCP 傳送及接收的暫存區大小都是 16K,

則最糟的情況下,我們會需要 (16K+16K) * 1024,也就是 32MB 的空間,

然而所需的 mbufs 大概是這個空間的二倍,也就是 64MB,是以所需的 cluster 數量為 64MB/2K,也就是 32768。

對于記憶體有限的機器,建議值是 1024 到 4096 之間,而當擁有海量存儲器空間時,我們可以将它設定為 4096 到 32768 之間。

我們可以使用 netstat 這個指令并加上參數 -m 來檢視目前所使用的 mbufs 數量。

要修改這個值必須在一開機就修改,是以隻能在 /boot/loader.conf 中加入修改的設定

kern.ipc.nmbclusters=32768

kern.ipc.shmmax: 33554432

共享記憶體和信号燈("System VIPC")如果這些過小的話,有些大型的軟體将無法啟動

安裝xine和mplayer提示的設定為67108864,即64M,

如果記憶體多的話,可以設定為134217728,即128M

kern.ipc.shmall: 8192

安裝xine和mplayer提示的設定為32768

kern.ipc.shm_use_phys: 0

如果我們将它設成 1,則所有 System V 共享記憶體 (share memory,一種程式間溝通的方式)部份都會被留在實體的記憶體 (physical memory) 中,

而不會被放到硬碟上的 swap 空間。我們知道實體記憶體的存取速度比硬碟快許多,而當實體記憶體空間不足時,

部份資料會被放到虛拟的記憶體上,從實體記憶體和虛拟記憶體之間移轉的動作就叫作 swap。如果時常做 swap 的動作,

則需要一直對硬碟作 I/O,速度會很慢。是以,如果我們有大量的程式 (數百個) 需要共同分享一個小的共享記憶體空間,

或者是共享記憶體空間很大時,我們可以将這個值打開。

這一項,我個人建議不做修改,除非你的記憶體非常大。

kern.ipc.shm_allow_removed: 0

共享記憶體是否允許移除?這項似乎是在fb下裝vmware需要設定為1的,否則會有加載SVGA出錯的提示

作為伺服器,這項不動也罷。

kern.ipc.numopensockets: 12

已經開啟的socket數目,可以在最繁忙的時候看看它是多少,然後就可以知道maxsockets應該設定成多少了。

kern.ipc.maxsockets: 1928

這是用來設定系統最大可以開啟的 socket 數目。如果您的伺服器會提供大量的 FTP 服務,

而且常快速的傳輸一些小檔案,您也許會發現常傳輸到一半就中斷。因為 FTP 在傳輸檔案時,

每一個檔案都必須開啟一個 socket 來傳輸,但關閉 socket 需要一段時間,如果傳輸速度很快,

而檔案又多,則同一時間所開啟的 socket 會超過原本系統所許可的值,這時我們就必須把這個值調大一點。

除了 FTP 外,也許有其它網絡程式也會有這種問題。

然而,這個值必須在系統一開機就設定好,是以如果要修改這項設定,我們必須修改 /boot/loader.conf 才行

kern.ipc.maxsockets="16424"

kern.ipc.nsfbufs: 1456

經常使用 sendfile(2) 系統調用的繁忙的伺服器,

有必要通過 NSFBUFS 核心選項或者在 /boot/loader.conf (檢視 loader(8) 以獲得更多細節) 中設定它的值來調節 sendfile(2) 緩存數量。

這個參數需要調節的普通原因是在程序中看到 sfbufa 狀态。sysctl kern.ipc.nsfbufs 變量在核心配置變量中是隻讀的。

這個參數是由 kern.maxusers 決定的,然而它可能有必要是以而調整。

在/boot/loader.conf裡加入

kern.ipc.nsfbufs="2496"

kern.maxusers: 59

maxusers 的值決定了處理程式所容許的最大值,20+16*maxusers 就是你将得到的所容許處理程式。

系統一開機就必須要有 18 個處理程式 (process),即便是簡單的執行指令 man 又會産生 9 個 process,

是以将這個值設為 64 應該是一個合理的數目。

如果你的系統會出現 proc table full 的訊息的話,可以就把它設大一點,例如 128。

除非您的系統會需要同時開啟很多檔案,否則請不要設定超過 256。

可以在 /boot/loader.conf 中加入該選項的設定,

kern.maxusers=256

kern.coredump: 1

如果設定為0,則程式異常退出時不會生成core檔案,作為伺服器,不建議這樣。

kern.corefile: %N.core

可設定為kern.corefile="/data/coredump/%U-%P-%N.core"

其中 %U是UID,%P是程序ID,%N是程序名,當然/data/coredump必須是一個實際存在的目錄

vm.swap_idle_enabled: 0

vm.swap_idle_threshold1: 2

vm.swap_idle_threshold2: 10

#########################

在有很多使用者進入、離開系統和有很多空閑程序的大的多使用者系統中很有用。

可以讓程序更快地進入記憶體,但它會吃掉更多的交換和磁盤帶寬。

系統預設的頁面排程算法已經很好了,最好不要更改。

########################

vfs.ufs.dirhash_maxmem: 2097152

預設的dirhash最大記憶體,預設2M

增加它有助于改善單目錄超過100K個檔案時的反複讀目錄時的性能

建議修改為33554432(32M)

vfs.vmiodirenable: 1

#################

這個變量控制目錄是否被系統緩存。大多數目錄是小的,在系統中隻使用單個片斷(典型的是1K)并且在緩存中使用的更小 (典型的是512位元組)。

當這個變量設定為關閉 (0) 時,緩存器僅僅緩存固定數量的目錄,即使您有很大的記憶體。

而将其開啟 (設定為1) 時,則允許緩存器用 VM 頁面緩存來緩存這些目錄,讓所有可用記憶體來緩存目錄。

不利的是最小的用來緩存目錄的核心記憶體是大于 512 位元組的實體頁面大小(通常是 4k)。

我們建議如果您在運作任何操作大量檔案的程式時保持這個選項打開的預設值。

這些服務包括 web 緩存,大容量郵件系統和新聞系統。

盡管可能會浪費一些記憶體,但打開這個選項通常不會降低性能。但還是應該檢驗一下。

####################

vfs.hirunningspace: 1048576

############################

這個值決定了系統可以将多少資料放在寫入儲存裝置的等候區。通常使用預設值即可,

但當我們有多顆硬碟時,我們可以将它調大為 4MB 或 5MB。

注意這個設定成很高的值(超過緩存器的寫極限)會導緻壞的性能。

不要盲目的把它設定太高!高的數值會導緻同時發生的讀操作的遲延。

vfs.write_behind: 1

這個選項預設為 1,也就是打開的狀态。在打開時,在系統需要寫入資料在硬碟或其它儲存裝置上時,

它會等到收集了一個 cluster 機關的資料後再一次寫入,否則會在一個暫存區空間有寫入需求時就立即寫到硬碟上。

這個選項打開時,對于一個大的連續的檔案寫入速度非常有幫助。但如果您遇到有很多行程延滞在等待寫入動作時,您可能必須關閉這個功能。

net.local.stream.sendspace: 8192

本地套接字連接配接的資料發送空間

建議設定為65536

net.local.stream.recvspace: 8192

本地套接字連接配接的資料接收空間

net.inet.ip.portrange.lowfirst: 1023

net.inet.ip.portrange.lowlast: 600

net.inet.ip.portrange.first: 49152

net.inet.ip.portrange.last: 65535

net.inet.ip.portrange.hifirst: 49152

net.inet.ip.portrange.hilast: 65535

以上六項是用來控制TCP及UDP所使用的port範圍,這個範圍被分成三個部份,低範圍、預設範圍、及高範圍。

這些是你的伺服器主動發起連接配接時的臨時端口的範圍,預設的已經1萬多了,一般的應用就足夠了。

如果是比較忙碌的FTP server,一般也不會同時提供給1萬多人通路的,

當然如果很不幸,你的伺服器就要提供很多,那麼可以修改first的值,比如直接用1024開始

net.inet.ip.redirect: 1

設定為0,屏蔽ip重定向功能

###########################

net.inet.ip.rtexpire: 3600

net.inet.ip.rtminexpire: 10

很多apache産生的CLOSE_WAIT狀态,這種狀态是等待用戶端關閉,但是用戶端那邊并沒有正常的關閉,于是留下很多這樣的東東。

建議都修改為2

net.inet.ip.intr_queue_maxlen: 50

Maximum size of the IP input queue,如果下面的net.inet.ip.intr_queue_drops一直在增加,

那就說明你的隊列空間不足了,那麼可以考慮增加該值。

##########################

net.inet.ip.intr_queue_drops: 0

Number of packets dropped from the IP input queue,如果你sysctl它一直在增加,

那麼增加net.inet.ip.intr_queue_maxlen的值。

#######################

net.inet.ip.fastforwarding: 0

如果打開的話每個目标位址一次轉發成功以後它的資料都将被記錄進路由表和arp資料表,節約路由的計算時間

但會需要大量的核心記憶體空間來儲存路由表。

如果記憶體夠大,打開吧,呵呵

net.inet.ip.random_id: 0

#####################

預設情況下,ip包的id号是連續的,而這些可能會被攻擊者利用,比如可以知道你nat後面帶了多少主機。

如果設定成1,則這個id号是随機的,嘿嘿。

net.inet.icmp.maskrepl: 0

防止廣播風暴,關閉其他廣播探測的響應。預設即是,無須修改。

net.inet.icmp.icmplim: 200

##############################

限制系統發送ICMP速率,改為100吧,或者保留也可,并不會給系統帶來太大的壓力。

net.inet.icmp.icmplim_output: 1

如果設定成0,就不會看到提示說Limiting icmp unreach response from 214 to 200 packets per second 等等了

不過禁止輸出容易讓我們忽視攻擊的存在。這個自己看着辦吧。

######################################

net.inet.icmp.drop_redirect: 0

net.inet.icmp.log_redirect: 0

設定為1,屏蔽ICMP重定向功能

net.inet.icmp.bmcastecho: 0

防止廣播風暴,關閉廣播ECHO響應,預設即是,無須修改。

net.inet.tcp.mssdflt: 512

net.inet.tcp.minmss: 216

資料包資料段最小值,以上兩個選項最好不動!或者隻修改mssdflt為1460,minmss不動。

net.inet.tcp.keepidle: 7200000

######################

TCP的套接字的空閑時間,預設時間太長,可以改為600000(10分鐘)。

net.inet.tcp.sendspace: 32768

最大的待發送TCP資料緩沖區空間,應用程式将資料放到這裡就認為發送成功了,系統TCP堆棧保證資料的正常發送。

net.inet.tcp.recvspace: 65536

最大的接受TCP緩沖區空間,系統從這裡将資料分發給不同的套接字,增大該空間可提高系統瞬間接受資料的能力以提高性能。

這二個選項分别控制了網絡 TCP 聯機所使用的傳送及接收暫存區的大小。預設的傳送暫存區為 32K,而接收暫存區為 64K。

如果需要加速 TCP 的傳輸,可以将這二個值調大一點,但缺點是太大的值會造成系統核心占用太多的記憶體。

如果我們的機器會同時服務數百或數千個網絡聯機,那麼這二個選項最好維持預設值,否則會造成系統核心記憶體不足。

但如果我們使用的是 gigabite 的網絡,将這二個值調大會有明顯效能的提升。

傳送及接收的暫存區大小可以分開調整,

例如,假設我們的系統主要做為網頁伺服器,我們可以将接收的暫存區調小一點,并将傳送的暫存區調大,如此一來,我們就可以避免占去太多的核心記憶體空間。

net.inet.udp.maxdgram: 9216

最大的發送UDP資料緩沖區大小,網上的資料大多都是65536,我個人認為沒多大必要,

如果要調整,可以試試24576。

net.inet.udp.recvspace: 42080

##################

最大的接受UDP緩沖區大小,網上的資料大多都是65536,我個人認為沒多大必要,

如果要調整,可以試試49152。

以上四項配置通常不會導緻問題,一般說來網絡流量是不對稱的,是以應該根據實際情況調整,并觀察其效果。

如果我們将傳送或接收的暫存區設為大于 65535,除非伺服器本身及用戶端所使用的作業系統都支援 TCP 協定的 windows scaling extension (請參考 RFC 1323 檔案)。

FreeBSD預設已支援 rfs1323 (即 sysctl 的 net.inet.tcp.rfc1323 選項)。

###################################################

net.inet.tcp.log_in_vain: 0

記錄下任何TCP連接配接,這個一般情況下不應該更改。

net.inet.tcp.blackhole: 0

建議設定為2,接收到一個已經關閉的端口發來的所有包,直接drop,如果設定為1則是隻針對TCP包

#####################################

net.inet.tcp.delayed_ack: 1

當一台計算機發起TCP連接配接請求時,系統會回應ACK應答資料包。

該選項設定是否延遲ACK應答資料包,把它和包含資料的資料包一起發送。

在高速網絡和低負載的情況下會略微提高性能,但在網絡連接配接較差的時候,

對方計算機得不到應答會持續發起連接配接請求,反而會讓網絡更加擁堵,降低性能。

是以這個值我建議您看情況而定,如果您的網速不是問題,可以将封包數量減少一半

如果網絡不是特别好,那麼就設定為0,有請求就先回應,這樣其實浪費的網通、電信的帶寬速率而不是你的處理時間:)

net.inet.tcp.inflight.enable: 1

net.inet.tcp.inflight.debug: 0

net.inet.tcp.inflight.rttthresh: 10

net.inet.tcp.inflight.min: 6144

net.inet.tcp.inflight.max: 1073725440

net.inet.tcp.inflight.stab: 20

限制 TCP 帶寬延遲積和 NetBSD 的 TCP/Vegas 類似。

它可以通過将 sysctl 變量 net.inet.tcp.inflight.enable 設定成 1 來啟用。

系統将嘗試計算每一個連接配接的帶寬延遲積,并将排隊的資料量限制在恰好能保持最優吞吐量的水準上。

這一特性在您的伺服器同時向使用普通數據機,千兆以太網,乃至更高速度的光與網絡連接配接 (或其他帶寬延遲積很大的連接配接) 的時候尤為重要,

特别是當您同時使用滑動窗縮放,或使用了大的發送視窗的時候。

如果啟用了這個選項,您還應該把 net.inet.tcp.inflight.debug 設定為 0 (禁用調試),

對于生産環境而言, 将 net.inet.tcp.inflight.min 設定成至少 6144 會很有好處。

然而, 需要注意的是,這個值設定過大事實上相當于禁用了連接配接帶寬延遲積限制功能。

這個限制特性減少了在路由和交換包隊列的堵塞資料數量,也減少了在本地主機接口隊列阻塞的資料的數量。

在少數的等候隊列中、互動式連接配接,尤其是通過慢速的數據機,也能用低的 往返時間操作。

但是,注意這隻影響到資料發送 (上載/服務端)。對資料接收(下載下傳)沒有效果。

調整 net.inet.tcp.inflight.stab 是 不 推薦的。

這個參數的預設值是 20,表示把 2 個最大包加入到帶寬延遲積視窗的計算中。

額外的視窗似的算法更為穩定,并改善對于多變網絡環境的相應能力,

但也會導緻慢速連接配接下的 ping 時間增長 (盡管還是會比沒有使用 inflight 算法低許多)。

對于這些情形, 您可能會希望把這個參數減少到 15, 10, 或 5;

并可能是以而不得不減少 net.inet.tcp.inflight.min (比如說, 3500) 來得到希望的效果。

減少這些參數的值, 隻應作為最後不得已時的手段來使用。

net.inet.tcp.syncookies: 1

SYN cookies是一種用于通過選擇加密的初始化TCP序列号,可以對回應的包做驗證來降低SYN'洪水'攻擊的影響的技術。

預設即是,不需修改

net.inet.tcp.msl: 30000

這個值網上很多文章都推薦的7500,

還可以改的更小一些(如2000或2500),這樣可以加快不正常連接配接的釋放過程(三次握手2秒、FIN_WAIT4秒)。

net.inet.tcp.always_keepalive: 1

幫助系統清除沒有正常斷開的TCP連接配接,這增加了一些網絡帶寬的使用,但是一些死掉的連接配接最終能被識别并清除。

死的TCP連接配接是被撥号使用者存取的系統的一個特别的問題,因為使用者經常斷開modem而不正确的關閉活動的連接配接。

net.inet.udp.checksum: 1

防止不正确的udp包的攻擊,預設即是,不需修改

net.inet.udp.log_in_vain: 0

記錄下任何UDP連接配接,這個一般情況下不應該修改。

net.inet.udp.blackhole: 0

建議設定為1,接收到一個已經關閉的端口發來的所有UDP包直接drop

net.inet.raw.maxdgram: 8192

Maximum outgoing raw IP datagram size

很多文章建議設定為65536,好像沒多大必要。

net.inet.raw.recvspace: 8192

Maximum incoming raw IP datagram size

net.link.ether.inet.max_age: 1200

調整ARP清理的時間,通過向IP路由緩沖填充僞造的ARP條目可以讓惡意使用者産生資源耗竭和性能減低攻擊。

這項似乎大家都未做改動,我建議不動或者稍微減少,比如300(HP-UX預設的5分鐘)

net.inet6.ip6.redirect: 1

設定為0,屏蔽ipv6重定向功能

net.isr.direct: 0

所有MPSAFE的網絡ISR對包做立即響應,提高網卡性能,設定為1。

hw.ata.wc: 1

這個選項用來打開 IDE 硬碟快取。當打開時,如果有資料要寫入硬碟時,硬碟會假裝已完成寫入,并将資料快取起來。

這種作法會加速硬碟的存取速度,但當系統異常關機時,比較容易造成資料遺失。

不過由于關閉這個功能所帶來的速度差異實在太大,建議還是保留原本打開的狀态吧,不做修改。

security.bsd.see_other_uids: 1

security.bsd.see_other_gids: 1

不允許使用者看到其他使用者的程序,是以應該改成0,

繼續閱讀