在 Linux 伺服器管理中,防止單一 IP 佔用過多連線資源是維護服務穩定的關鍵手段之一。iptables 的 connlimit 模組專為此設計,能精確限制每個來源 IP 對特定埠的並發連線數。然而,許多發行版預設未編譯此模組,需手動安裝編譯。本文將完整記錄從下載原始碼、打補丁、編譯核心模組到最終載入測試的完整流程,助您快速部署連線數限制策略。
首先取得 iptables 核心原始碼與 patch-o-matic-ng 補丁工具。建議在 /usr/src 或自訂目錄下操作:
# wget ftp://ftp.netfilter.org/pub/iptables/iptables-1.4.0.tar.bz2
# wget ftp://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20080214.tar.bz2
# tar xjf iptables-1.4.0.tar.bz2
# tar xjf patch-o-matic-ng-20080214.tar.bz2
進入 patch-o-matic-ng 目錄,指定核心與 iptables 原始碼路徑,執行 runme -download 取得外部補丁(含 connlimit):
# cd patch-o-matic-ng-20080214
# KERNEL_DIR=/usr/src/kernels/2.6.18-128.el5-x86_64 \
IPTABLES_DIR=/usr/iptablestest/iptables-1.4.0 \
./runme -download
輸出中會顯示 Successfully downloaded external patch connlimit 等訊息。接著應用補丁:
# KERNEL_DIR=/usr/src/kernels/2.6.18-128.el5-x86_64 \
IPTABLES_DIR=/usr/iptablestest/iptables-1.4.0 \
./runme connlimit
提示 Do you want to apply this patch [N/y/t/f/a/r/b/w/q/?] 時輸入 y 確認。
進入核心原始碼目錄,啟用 CONFIG_IP_NF_MATCH_CONNLIMIT 選項:
# cd /usr/src/kernels/2.6.18-128.el5-x86_64
# make oldconfig
在互動式配置中,遇到 Connections/IP limit match support (IP_NF_MATCH_CONNLIMIT) [N/m/?] (NEW) 時輸入 m 將其編譯為模組。亦可使用 make menuconfig 在 Networking → Networking options → Network packet filtering → IP: Netfilter Configuration 中找到同樣選項設為 M。
備份原有 Makefile 並建立新的模組編譯規則:
# mv net/ipv4/netfilter/Makefile net/ipv4/netfilter/Makefile.bak
# cat > net/ipv4/netfilter/Makefile <<'EOF'
obj-m := ipt_connlimit.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
EOF
執行編譯:
# make M=net/ipv4/netfilter/
成功後會產生 ipt_connlimit.ko,複製至模組目錄並設定權限:
# cp net/ipv4/netfilter/ipt_connlimit.ko /lib/modules/2.6.18-128.el5/kernel/net/ipv4/netfilter/
# chmod 744 /lib/modules/2.6.18-128.el5/kernel/net/ipv4/netfilter/ipt_connlimit.ko
# depmod -a
# modprobe ipt_connlimit
# lsmod | grep ipt_connlimit
若輸出顯示模組已載入,即代表安裝成功。此後即可使用 iptables -m connlimit --connlimit-above N -j REJECT 等規則限制單 IP 連線數。
# iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
# iptables-save > /etc/sysconfig/iptables
搭配 --connlimit-mask 可針對 IPv4 /24 或 IPv6 /64 網段整體限制,彈性應對 NAT 環境或網吧用戶群。