一個程序經過編譯連接后形成的地址空間是一個虛擬地址空間,而Linux在內存尋址時簡化了分段
機制,使得虛擬地址與線性地址是一致的,比如程序test_wait.c代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int i;
unsigned char *buff;
buff = (char *)malloc(sizeof(char)*1024);
printf("pid is :%d\n", getpid());
for (i = 0; i < 60; i++) {
sleep(60);
}
return 0;
}
經過編譯后形成的文件是test_wait,然后用命令objdump反匯編后如下(只取部分代碼):
$ objdump -d test_wait
test_wait: file format elf32-i386
Disassembly of section .init:
08048304 <_init>:
8048304: 55 push %ebp
8048305: 89 e5 mov %esp,%ebp
8048307: 53 push %ebx
8048308: 83 ec 04 sub $0x4,%esp
804830b: e8 00 00 00 00 call 8048310 <_init+0xc>
8048310: 5b pop %ebx
8048311: 81 c3 e4 1c 00 00 add $0x1ce4,%ebx
8048317: 8b 93 fc ff ff ff mov -0x4(%ebx),%edx
804831d: 85 d2 test %edx,%edx
8048301: e8 2e 00 00 00 call 8048334 <__gmon_start__@plt>
8048306: e8 15 01 00 00 call 8048420
可以看到,其中的地址就是虛擬地址,整個虛擬地址空間大小為3GB,再加上可以通過系統調用進入
內核的1GB空間,于是每個進程可以擁有4GB的虛擬地址空間(也叫虛擬內存)。某個進程的虛擬地
址空間可以通過/proc文件系統看到:
$ ./test_wait
pid is :9840
重新開一個終端:
cat /proc/9840/maps
08048000-08049000 r-xp 00000000 08:01 212891 /home/chen/mem/test_wait
08049000-0804a000 r--p 00000000 08:01 212891 /home/chen/mem/test_wait
0804a000-0804b000 rw-p 00001000 08:01 212891 /home/chen/mem/test_wait
096d5000-096f6000 rw-p 096d5000 00:00 0 [heap]
b7dee000-b7def000 rw-p b7dee000 00:00 0
b7def000-b7f47000 r-xp 00000000 08:01 409724 /lib/tls/i686/cmov/libc-2.8.90.so
b7f47000-b7f49000 r--p 00158000 08:01 409724 /lib/tls/i686/cmov/libc-2.8.90.so
b7f49000-b7f4a000 rw-p 0015a000 08:01 409724 /lib/tls/i686/cmov/libc-2.8.90.so
b7f4a000-b7f4d000 rw-p b7f4a000 00:00 0
b7f59000-b7f5c000 rw-p b7f59000 00:00 0
b7f5c000-b7f76000 r-xp 00000000 08:01 392460 /lib/ld-2.8.90.so
b7f76000-b7f77000 r-xp b7f76000 00:00 0 [vdso]
b7f77000-b7f78000 r--p 0001a000 08:01 392460 /lib/ld-2.8.90.so
b7f78000-b7f79000 rw-p 0001b000 08:01 392460 /lib/ld-2.8.90.so
bf964000-bf979000 rw-p bffeb000 00:00 0 [stack]
關于此文件的詳細信息可以參看:
http://www.kerneltravel.net/?p=287
由上面的信息可以看到
08048000-08049000地址段的標志是r-xp(讀,執行)是代碼段,
08049000-0804a000的標志是rw-p(讀寫)是數據段
096d5000-096f6000是堆也叫空洞,只有當程序中調用malloc()申請空間時才有堆段。
bf964000-bf979000 是堆棧段
這樣我們可以看到進程的用戶空間的分配了。如下圖:
可以看出代碼段在最低地址依次往上是數據段,空洞、堆棧段在最高地址,棧指針向下移動。
進程的虛擬地址在保存在內核中的task_struct(PCB)結構中,定義如下:
struct task_struct { //進程結構體
//……
struct mm_struct *mm;//描述進程的整個用戶空間
}
而stuct mm_struct 結構中包含了虛擬空間的結構體字段
mmap(struct vm_area_struct * mmap),所以可以通過模塊編程來查看進程的虛擬地址空間。
關于模塊編程可以看這里:
http://www.kerneltravel.net/?p=80,程序清單如下:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
static int pid;
module_param(pid,int,0644);
static int __init memtest_init(void)
{
struct task_struct *p;
struct vm_area_struct *temp;
printk("My module worked!\n");
p = find_task_by_vpid(pid);
temp = p->mm->mmap;
while(temp) {
printk("start:%p\tend:%p\n", (unsigned long *)temp->vm_start,
(unsigned long *)temp->vm_end);
temp = temp->vm_next;
}
return 0;
}
static void __exit memtest_exit(void)
{
printk("Unloading my module.\n");
return;
}
module_init(memtest_init);
module_exit(memtest_exit);
MODULE_LICENSE("GPL");
編譯模塊,運行剛才的程序test_wait,然后帶參數插入模塊,如下:
$ ./test_wait &
pid is :9413
$ sudo insmod mem.ko pid=9413
[ 2690.715913] My module worked!
[ 2690.715992] start:08048000 end:08049000
[ 2690.716005] start:08049000 end:0804a000
[ 2690.717029] start:0804a000 end:0804b000
[ 2690.717065] start:096d5000 end:096f6000
[ 2690.717096] start:b7dee000 end:b7def000
[ 2690.717126] start:b7def000 end:b7f47000
[ 2690.717157] start:b7f47000 end:b7f49000
[ 2690.717187] start:b7f49000 end:b7f4a000
[ 2690.717217] start:b7f4a000 end:b7f4d000
[ 2690.717248] start:b7f59000 end:b7f5c000
[ 2690.717304] start:b7f5c000 end:b7f76000
[ 2690.717334] start:b7f76000 end:b7f77000
[ 2690.717364] start:b7f77000 end:b7f78000
[ 2690.717395] start:b7f78000 end:b7f79000
[ 2690.717425] start:bf964000 end:bf979000
可以看出和剛才/proc文件系統中的地址是一樣的。
在任意一個時刻,一個CPU只有一個進程在運行,所以雖然有時候很多進程的虛擬地址值有相同的
,但是由于每次只有一個進程運行,在當某個進程運行時cpu就將其虛擬地址也切換進來,這樣就保
證了每個進程都擁有4GB的地址空間。
----------------------------------------------------------------------------------------------------------------------------
大
多數 Linux 發布版都定義了適當的緩沖區和其他 Transmission Control
Protocol(TCP)參數。可以修改這些參數來分配更多的內存,從而改進網絡性能。設置內核參數的方法是通過 proc 接口,也就是通過讀寫
/proc 中的值。幸運的是,sysctl 可以讀取 /etc/sysctl.conf 中的值并根據需要填充
/proc,這樣就能夠更輕松地管理這些參數。清單 2 展示在互聯網服務器上應用于 Internet 服務器的一些比較激進的網絡設置。
# Use TCP syncookies when needed
net.ipv4.tcp_syncookies = 1
# Enable TCP window scaling
net.ipv4.tcp_window_scaling: = 1
# Increase TCP max buffer size
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# Increase Linux autotuning TCP buffer limits
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Increase number of ports available
net.ipv4.ip_local_port_range = 1024 65000
將這些設置添加到 /etc/sysctl.conf 的現有內容中。第一個設置啟用 TCP SYN cookie。當從客戶機發來新的
TCP 連接時,數據包設置了 SYN 位,服務器就為這個半開的連接創建一個條目,并用一個 SYN-ACK
數據包進行響應。在正常操作中,遠程客戶機用一個 ACK 數據包進行響應,這會使半開的連接轉換為全開的。有一種稱為 SYN 泛濫(SYN
flood) 的網絡攻擊,它使 ACK 數據包無法返回,導致服務器用光內存空間,無法處理到來的連接。SYN cookie
特性可以識別出這種情況,并使用一種優雅的方法保留隊列中的空間(細節參見 參考資料
一節)。大多數系統都默認啟用這個特性,但是確保配置這個特性更可靠。
啟用 TCP 窗口伸縮使客戶機能夠以更高的速度下載數據。TCP 允許在未從遠程端收到確認的情況下發送多個數據包,默認設置是最多 64 KB,在與延遲比較大的遠程客戶機進行通信時這個設置可能不夠。窗口伸縮會在頭中啟用更多的位,從而增加窗口大小。
后面四個配置項增加 TCP 發送和接收緩沖區。這使應用程序可以更快地丟掉它的數據,從而為另一個請求服務。還可以強化遠程客戶機在服務器繁忙時發送數據的能力。
最后一個配置項增加可用的本地端口數量,這樣就增加了可以同時服務的最大連接數量。
在下一次引導系統時,或者下一次運行 sysctl -p /etc/sysctl.conf 時,這些設置就會生效。
----------------------------------------------------------------------------------------------------------------------------
磁盤子系統的調優
磁盤在 LAMP 架構中扮演著重要的角色。靜態文件、模板和代碼都來自磁盤,組成數據庫的數據表和索引也來自磁盤。對磁盤的許多調優(尤其是對于數據庫)集中于避免磁盤訪問,因為磁盤訪問的延遲相當高。因此,花一些時間對磁盤硬件進行優化是有意義的。
首先要做的是,確保在文件系統上禁用 atime 日志記錄特性。atime
是最近訪問文件的時間,每當訪問文件時,底層文件系統必須記錄這個時間戳。因為系統管理員很少使用
atime,禁用它可以減少磁盤訪問時間。禁用這個特性的方法是,在 /etc/fstab 的第四列中添加 noatime 選項。
演示如何啟用 noatime 的 fstab 示例
/dev/VolGroup00/LogVol00 / ext3 defaults,noatime 1 1
LABEL=/boot /boot ext3 defaults,noatime 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
LABEL=SWAP-hdb2 swap swap defaults 0 0
LABEL=SWAP-hda3 swap swap defaults 0 0
有多種磁盤硬件組合,而且 Linux 不一定能夠探測出訪問磁盤的最佳方式。可以使用 hdparm 命令查明和設置用來訪問
IDE 磁盤的方法。hdparm -t /path/to/device
執行速度測試,可以將這個測試結果作為性能基準。為了使結果盡可能準確,在運行這個命令時系統應該是空閑的。
在 /dev/hd 上執行的速度測試
# hdparm -t /dev/hda
/dev/hda:
Timing buffered disk reads: 182 MB in 3.02 seconds = 60.31 MB/sec
hdparm 的常用選項
選項 描述
-vi 向磁盤查詢它支持的設置以及它正在使用的設置。
-c 查詢/啟用 (E)IDE 32 位 I/O 支持。hdparm -c 1 /dev/hda 啟用這個設置。
-m 查詢/設置每中斷多扇區模式。如果設置大于零,設置值就是每個中斷可以傳輸的最大扇區數量。
-d 1 -X 啟用直接內存訪問(DMA)傳輸并設置 IDE 傳輸模式。hdparm 手冊頁詳細說明了在 -X 后面可以設置的數字。只有在 -vi 說明目前并未使用最快速的模式的情況下,才需要進行這個設置。
不幸的是,對于 Fiber Channel and Small Computer Systems Interface(SCSI)系統,調優依賴于具體的驅動器。
必須將有幫助的設置添加到啟動腳本中,比如 rc.local。
----------------------------------------------------------------------------------------------------------------------------
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
----------------------------------------------------------------------------------------------------------------------------
文件子系統的調優
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 unlimited
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
----------------------------------------------------------------------------------------------------------------------------
內存子系統的調優
內存子系統的調優不是很容易,需要不停地監測來保證內存的改變不會對服務器的其他子系統造成負面影響。如果要改變虛擬內存參數(在/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
----------------------------------------------------------------------------------------------------------------------------
網絡子系統的調優
操作系統安裝完畢,就要對網絡子系統進行調優。對其它子系統的影響:影響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
----------------------------------------------------------------------------------------------------------------------------
網絡安全設置:
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
----------------------------------------------------------------------------------------------------------------------------
暫定步驟:
修改/etc/profile文件,加入:
ulimit -u 10240
ulimit -n 4096
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
ulimit -t unlimited
ulimit -v unlimited
修改/etc/rc.d/rc.local,加入:
echo ‘131072′ > /proc/sys/fs/file-max
echo ‘131072′ > /proc/sys/fs/inode-max
(1G內存值修改成:65535 2G內存值修改成:131072 4G內存值修改成:262144)
修改/etc/sysctl.conf文件,加入:
net.core.rmem_default = 8388608
net.core.rmem_max = 8388608
net.core.wmem_default = 8388608
net.core.wmem_max = 8388608
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack =1
net.ipv4.tcp_window_scaling = 1
net.core.netdev_max_backlog=3000
#Modify i-node
sys.fs.file-max= 65535
sys.fs.inode-max= 65535
#Set System Memory
vm.bdflush="30 500 0 0 500 3000 60 20 0"
vm.kswapd="1024 32 64"
#Disable HackAttack!
net.ipv4.conf.eth0.accept_source_route=0
net.ipv4.conf.lo.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.lo.secure_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.eth0.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.lo.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.tcp_syncookies=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_responses=1
#Web Servers
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_keepalive_time=1800
net.ipv4.core.wmem_max=16777216
net.ipv4.core.rmem_max=16777216
net.ipv4.tcp_rmem="4096 87380 8388608"
net.ipv4.tcp.wmem="4096 87380 8388608"
net.ipv4.tcp_max_syn_backlog=8192
防火墻安全:
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
備注說明:(相對比較激進的網絡參數調整)
# Use TCP syncookies when needed
net.ipv4.tcp_syncookies = 1
# Enable TCP window scaling
net.ipv4.tcp_window_scaling: = 1
# Increase TCP max buffer size
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# Increase Linux autotuning TCP buffer limits
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 65536 8388608
# Increase number of ports available
net.ipv4.ip_local_port_range = 1024 65000
----------------------------------------------------------------------------------------------------------------------------
LINUX安全設置步驟:
刪除所有那些不能在你系統上使用的默認用戶和組賬戶: lp,sync,shutdown,halt, news, uucp, operator, games, gopher
ROOT自動從shell注銷
編輯你的配置文件”vi /etc/profile”,在某個地方加入如下行,
“HISTFILESIZE=”
TMOUT=3600
我們為變量”TMOUT=”輸入的這個值使用秒表示的、代表一個小時(60*60=3600秒)。如果你將此行加入你的 “/etc/profile” 文件,那么在一小時的非活動狀態之后將要系統里的所有用戶自動注銷。你可以在用戶私人的”.bashrc”文件里面
設置這個變量,可以在一個確定的時間以后自動注銷他們。
禁止并且卸載所有沒有用的服務
你必須禁止別切卸載所有你不用的的服務,那樣的話,你就能少擔心一些。看看你的”/etc/inetd.conf”文件, 用注釋的方法禁用(在一行的開始加個#),然后給inetd進程發送一個SIGHUP命令去更新到當前的”inetd.conf”文件。這樣做:
第一步把”/etc/inetd.conf”更改許可權限成600,那樣的話,就只有root可以讀和寫。
[Root@kapil /]# chmod 600 /etc/inetd.conf
第二步確保”/etc/inetd.conf”的所有者是root。
第
三步編輯inetd.conf文件(vi /etc/inetd.conf),并且禁止一些服務,就像:ftp, telnet, shell,
login, exec, talk, ntalk, imap, pop-2, pop-3, finger,
auth等等,除非你打算用它。關閉這些服務就降低一些風險。
第四步給你的inetd進程發送一個HUP信號[root@kapil /]# killall -HUP inetd
第五步設置”/etc/inetd.conf”文件為不可更改,使用 chattr 命令,這樣的話,沒人能修改那個文件。*簡單的設置文件為不可更改,執行如下命令:
[root@kapil /]# chattr +i /etc/inetd.conf
這將防止對”inetd.conf”文件的任何更改(意外的更改或者其他更改)。只有超級用戶root能設置或者清除這個文件屬性。修改inetd.conf *簡單的取消不可更改的設置,執行如下命令:
[root@kapil /]# chattr -i /etc/inetd.conf
免疫”/etc/services”文件
你必須免疫 “/etc/services” 文件,防止未經授權的刪除、增加服務。
免疫 “/etc/services” 文件,使用命令:
[root@kapil /]# chattr +i /etc/services
禁止Control-Alt-Deletc鍵盤關機命令
在你的”/etc/inittab”文件里面注釋掉如下的行(用一個”#”)。
這樣做,編輯inittab文件(vi /etc/inittab),更換:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
讀入:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
現在,按照如下提示輸入,讓更改生效:
[root@kapil /]# /sbin/init q
為腳本文件整理”/etc/rc.d/init.d”下的權限
整理腳本文件的許可權限,可靠的開始和結束所有你需要在引導時運行的常態進程,這樣做:
[root@kapil/]# chmod -R 700 /etc/rc.d/init.d/*
這意味著只有root可以被允許讀,寫,和執行目錄里面的腳本文件。
隱藏你的系統信息
默認狀態下,當你登錄到linux機器時,他告訴你Linux分布商的名字,版本,核心版本和服務器名字。這對一個駭客來說從你的服務器得到這些信息足夠了以必須立刻用一個”Login:”提示符提示用戶。
第一步
這樣做,編輯”/etc/rc.d/rc.local”文件,放置”#”在如下行的前面。
# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo “” >; /etc/issue
#echo “$R” >;>; /etc/issue
#echo “Kernel $(uname -r) on $a $(uname -m)” >;>; /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >;>; /etc/issue
第二步
然后,刪除如下文件:在”/etc/”目錄下的”issue.net” 和 “issue”:
[root@kapil /]# rm -f /etc/issue
[root@kapil /]# rm -f /etc/issue.net
禁止未用的 SUID/SGID 程序
一個常規用戶如果設置為SUID root,將能夠作為root運行程序。一個系統管理員必須最小化使用這些 SUID/GUID程序, 而且禁止那些不需要的程序。
第1步
從root擁有的程序里發現所有有`s’ 位的程序,用此命令:
[root@kapil]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls -lg {} \;
* 在被選中的程序上禁止suid 位,鍵入如下命令:
[root@kapil /]# chmod a-s [program]
關閉ipv6
vi /etc/modprobe.conf,在文件中添加以下兩行
alias net-pf-10 off
alias ipv6 off
----------------------------------------------------------------------------------------------------------------------------