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.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 的設定,而無需重新開機:
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 生效了。