環境:centos7.4 核心版本3.10
核心引數net.ipv4.tcp_max_syn_backlog定義了處於syn_recv的tcp最大連線數,當處於syn_recv狀態的tcp連線數超過tcp_max_syn_backlog後,會丟棄後續的syn報文。
為了測試上述結論,首先將tcp_syncookies設定為0,並將net.ipv4.tcp_max_syn_backlog設定為2,測試拓撲為:1.1.1.1(client)------1.1.1.2:19090(server),在client端新增如下iptables規則,在傳送完syn報文後,底層丟棄接收到的syn/ack報文
iptables -t filter -i input -p tcp -m tcp --sport 19090 --tcp-flag syn,ack syn,ack -j drop
但在實際測試中發現處於syn_recv狀態的連線數可以大於設定的值2,且如果此時觸發新的連線,該連線也能正常建鏈。難道tcp_max_syn_backlog沒有生效?通過查詢文件,發現在這篇文章中給出了原因。在核心net/core/request_sock.c中的實現如下,紅色字型**給出了計算tcp_max_syn_backlog的最小值。sysctl_max_syn_backlog的值對應手動設定的net.ipv4.tcp_max_syn_backlog的值。
int reqsk_queue_alloc(struct request_sock_queue *queue,unsigned
intnr_table_entries)
可以看到當sysctl_max_syn_backlog=2時,計算過程如下:
使用如下指令碼模擬syn flood攻擊,當watch 'netstat -antp|grep syn_recv|wc -l'等於16時,換一台機器連線server發現連線超時;設定tcp_syncookies=1,重複上面測試,當watch 'netstat -antp|grep syn_recv|wc -l'等於16時,換一台機器連線server發現此時連線成功。
#!/bin/shinitport=10000
for ((i=1; i<=200; i ++))
doinitport=$[initport+1
] sendip -v -p ipv4 -is
1.1.1.1 -p tcp -ts $initport -td 19090 -tfs -tots 1.1.1.2
sleep
0.5done
linux 核心引數
sysctl命令可以檢視和 動態地修改核心的執行引數,可用的核心引數在目錄 proc sys 中。sysctl命令對核心引數的修改僅在當前生效,重啟系統後引數丟失。如果希望引數永久生效可以修改配置檔案 etc sysctl.conf,修改後使用sysctl p生效。例子 net.ipv4.tcp s...
linux核心引數
net.ipv4.ip local port range 當核心版本小於3.2,決定的是客戶端的乙個 ip 可用的埠數量,即乙個 ip 最多只能建立 60k 多一點的連線 1025 65535 如果要突破這個限制需要客戶端 機器繫結多個 ip。當核心版本大於等於3.2,決定的是 socket 四元組...
Linux核心引數修改
由於linux的核心引數資訊都存在記憶體中,因此可以通過命令直接修改,並且修改後直接生效。但是,當系統重新啟動後,原來設定的引數值就會丟失,而系統每次啟動時都會自動去 etc sysctl.conf檔案中讀取核心引數,因此將核心的引數配置寫入這個檔案中,是乙個比較好的選擇。首先開啟 etc sysc...