সার্ভারে DDOS Protection দিন সহজেই ! মাথার উপর দিয়ে গেলে অামি দ্বায়ী না ;)
কয়েকজন বললেন সার্ভার অপটিমাইজেশান নিয়ে লিখতে, অাসলে এই জিনিস গুলো খুবই জটিল । কম্পিউটারে যদি বলেন সব থেকে কঠিন কি ? অামি বলবো নেটওয়ার্কিং করা । বিশ্বাস না হয় একটি ছোট সার্ভারের ক্যাবলিং করার ভিডিও দেখুন ইউটিউবে ধারনা পাবেন । যাইহোক, অাজকে অামরা সার্ভারের DDOS Protection নিয়ে অালোচনা করবো ।
কিভাবে প্রোটেকশান দেওয়া যাবে?
১. অ্যাটাক মাইগ্রেট করে : সাধারনত সব বড় বড় হোস্টিং কোম্পানীই এটা করে যাদের একাধিক সার্ভার অাছে । গ্রিনওয়েবেও এই সিস্টেম চালু করা অাছে । এর সুবিধা হলো অ্যাটাক কারীর অ্যাটাককে প্রিভেন্ট করার চেস্টা করা হয় কিন্তু যদি প্রিভেন্ট করা সম্ভব না হয় কোনো কারনে তবে অন্য কোনো একটি অব্যবহৃত সার্ভারে তার অ্যাটাক কে মাইগ্রেট করা হয় । এটি অনেক ব্যয়বহুল, অনেকে বিভিন্ন তৃতীয় পক্ষ থেকে এই সার্ভিস গ্রহন করে ।
২. IP Tables ব্যবহার করে: netfilter iptables হলো এক ধরনের কমান্ড লাইন ইউটিলিটি যা kernal এ প্যাকেট ফিল্টারিং রুল তৈরী করে । অাজকে মূলত অামরা kernal configure করা এবং iptables ব্যবহার করে অ্যাটাক প্রিভেন্ট করাই শিখবো । তবে একটা জিনিস মাথায় রাখবেন এটি ছোট খাট মানে (৫০-১০০ জনের ডিডস কে সামলানোর জন্য) বড় মাপের ডিডস এর জন্য অবশ্যই অ্যাটাক মাইগ্রেট করতে হবে ।
Warning:
অামরা সার্ভারের সবথেকে সেন্সিটিভ জায়গাতে হাত দিবো যদি না বুঝে কিছু করেন তবে সার্ভার এ সমস্যা হতে পারে ।
যারা লিনাক্সের ব্যবহার করেছেন তারা জানেন iptables কে লিনাক্সে ফায়ারওয়াল হিসাবে ডিফল্টভাবে বিবেচনা করা হয় । এর কাজ destination Ip এবং পোর্টকে ব্লক করা, ফিল্টার করা, সুইচিং করা সহ অনেক কিছু । এটাকে বাড়ির সদর দরজা ধরতে পারেন যার কাজ কে কোথায় যাবে ঠিক করে দেওয়া ।
যাইহোক, centos 7 ই বেস্ট OS এবং অামরা এটা ব্যবহার করি তাই এই টিউটোরিয়ালে এর উপর ভিত্তি করে kernal settings দেওয়া হবে ।
সেটিং:
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
এখানে উপরে যে সেটিংস টা দেওয়া হয়েছে এটি ইউনিভার্সাল সেটিংস যা অাপনারা ব্যবহার করতে পারেন । কিন্তু অামি এটাকে এখন অার একটু ভালো করবো কারন এটার কিছু রুলস মোটেও শেয়ার্ড সার্ভারের জন্য ভালো না ।
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 = 10
net.ipv4.neigh.default.gc_stale_time = 90
net.netfilter.nf_conntrack_max = 1000000
net.netfilter.nf_conntrack_tcp_loose = 0
net.netfilter.nf_conntrack_tcp_timeout_established = 1400
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 15
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 = 15
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.ip_local_port_range = 80 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 = 90
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
অাপনারা চাইলে অাপনাদের সার্ভার ক্যাপাসিটি অনুযায়ী অার একটু অপটিমাইজ করতে পারেন । তবে সাবধানে করবেন ভুল হলে সব প্যাকেট ব্লক কিংবা প্যাকেট লস হতে পারে ।
উপরের সেটিংস টি TCP Based অ্যাটাক কে অাটকাতে পারবে কিন্তু যদি ACK and SYN-ACK অ্যাটাক হয় ? সমস্যা নেই এবার অামরা IP Tables নিয়ে কাজ করবো ।
SYN নয় এমন প্যাকেট ব্লক করবো প্রথমে :
iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
এবার অামরা uncommon mss value কে ব্লক করবো যা dumb syn floods কে অাটকাবে
iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
Invalid Packet ব্লক করবো এখন:
iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP
এখন Bogus TCP Flag কে প্রিভেন্ট করবো সাধারনত টুল ব্যবহার করে যে অ্যাটাক গুলো করা হয় তার ৯৯% ই এটা অাটকাতে পারে :
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
নিচের রুলস দিয়ে স্পুফিং অ্যাটাক কে ব্লক করা হবে :
iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP
iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP
iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP
iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP
iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP
iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP
iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP
iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP
iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP
এবার দরকারী দুইটা রুল সেট করা হবে :
১. হোস্ট ম্যাক্স কানেকশন :
iptables -A INPUT -p tcp -m connlimit --connlimit-above 100 -j REJECT --reject-with tcp-reset
এখানে ১০০ টা কানেকশন দেওয়া হয়েছেতবে সার্ভার ক্যাপাসিটি অনুযায়ী এটাকে সঠিক ভ্যালু দিতে হবে তবে বেস্ট রেজাল্ট অাসবে ।
২. ম্যাক্স কানেকশন প্রতি মিনিটে:
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP
UDP Based অ্যাটাকের জন্য এটি:
iptables -t mangle -A PREROUTING -f -j DROP
এবার TCP RST packet কে লিমিট করে দিবো :
iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT iptables -A INPUT -p tcp --tcp-flags RST RST -
j DROP
সর্বশেষে SYN FLood কে SYN Proxy ব্যবহার করে জালে অাটকাতে হবে ;)
iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack
iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
এইতো এইগুলাই এর বাহিরে কিভাবে DDOS অ্যাটাক হয় অামি জানি না অামার মনে হয় না কেউ জানে ;) জানলে জানাবেন নতুন কোনো রুলস্ বের করা কিংবা অনুসন্ধান করা যাবে ।
অাগামি পর্বে পোর্ট স্ক্যান বন্ধ করা এবং পিং বন্ধ করার টিউটোরিয়াল দিবো । এটা লিখতে অামার ২ ঘন্টা লেগেছে অাসা করি ২মিনিট সময় অপচয় করে কেমন লেগেছে জানাতে ভুলবেন না ;)
লিখেছেন -
মো: জোবায়ের অালম
ফাউন্ডার, গ্রিনওয়েব ।