linux 核心引數tcp max syn

2022-01-10 06:51:00 字數 1315 閱讀 7091

環境: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/sh

initport=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...