Linux 下用 iptables 預防 DDOS

DDOS 是十分常見的攻擊,即使是一般使用者,下載一套 DDOS 軟體,或者直接安裝 kali linux, 便可以很簡單發動 DDOS 攻擊,除了遇到 DDOS 攻擊才採取攔截外,也可以透過 iptables 或一些 Linux 設定來預防 DDOS 攻擊,以下會列出一些預防 DDOS 的設定及 iptables 規則。

Linux Kernel
透過修改 Linux Kernel 的設定,同樣可以有效減低 DDOS 的威脅,RHEL 7 及 CentOS 7 支援 SYNPROXY 設定,以下會以 CentOS 7 為例,透過修改 Kernel 的參數來減低 DDOS 的威脅。

開啟檔案 /etc/sysctl.conf,加入以下設定:

kernel.printk = 4 4 1 7
kernel.panic = 10
kernel.sysrq = 0
kernel.shmmax = 4294967296
kernel.shmall = 4194304
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
vm.swappiness = 20
vm.dirty_ratio = 80
vm.dirty_background_ratio = 5
fs.file-max = 2097152
net.core.netdev_max_backlog = 262144
net.core.rmem_default = 31457280
net.core.rmem_max = 67108864
net.core.wmem_default = 31457280
net.core.wmem_max = 67108864
net.core.somaxconn = 65535
net.core.optmem_max = 25165824
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 8192
net.ipv4.neigh.default.gc_thresh3 = 16384
net.ipv4.neigh.default.gc_interval = 5
net.ipv4.neigh.default.gc_stale_time = 120
net.netfilter.nf_conntrack_max = 10000000
net.netfilter.nf_conntrack_tcp_loose = 0
net.netfilter.nf_conntrack_tcp_timeout_established = 1800
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 10
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 20
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 20
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 20
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 10
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_no_pmtu_disc = 1
net.ipv4.route.flush = 1
net.ipv4.route.max_size = 8048576
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_mem = 65536 131072 262144
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.udp_rmem_min = 16384
net.ipv4.tcp_wmem = 4096 87380 33554432
net.ipv4.udp_wmem_min = 16384
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 400000
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_ecn = 2
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 10
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.rp_filter = 1

儲存檔案後,重新開機會自動載入新參數設定,也可以輸入以下指令重新載入 /etc/sysctl.conf 的設定,而無需重新開機:

# sysctl –system

iptables 規則
DDOS 有很多不同的方法,要用 iptables 預方全部的攻擊幾乎不可能,幸好透過 connection tracking (nf_conntrack 核心模組),可以攔截大部份基於 TCP 的非 SYN packets 攻擊,以下的 iptables 規則也可以攔截大部份的 TCP DDOS 攻擊。

攔截 Invalid Packets:

以下 iptables 規則會攔截所有不是 SYN packet,及不會放到 established TCP 連線。

限制每個 ip 連線數量:

這個規則可以限制每個 ip 最多建立的 established connections, 以下設定為每個 ip 最多 80 個連線:

以下 iptables 規則會對指定埠號,限制每個 ip 的連線數量,以下例子會限制每個 ip 在 port 25 建立 4 個連線;對 port 80 建立 20 個連線:

限制每個 ip 每秒建立連線數量:

RHEL 7 / CentOS 7 使用的 Kernel 及 iptables 已經支援 SYNPROXY, SYNPROXY 的作用是檢查收到的 SYN packet 是真實連線,還是傳送 SYN packet 後甚麼都不做,即達到霸佔連線 DDOS 的目的,如果甚麼都不做,便會將 packet 取消,將 DDOS 的影響減都最低。

以下是用使用 SYNPROXY 預防 SYN Floods 的 iptables 規則,以下的規則會對所有埠號生效,如果只想對指定的埠號生劾,可以在規則後面加上 “- -dport xx”

要檢查 SYNPROXY 是否生效,可以用以下指令監測檔案 /proc/net/stat/synproxy, 如果當建立新 TCP 連線時,該檔案的數值有轉變,那便表示 SYNPROXY 生效了。




Leave a Reply