اسکریپت iptables در سرور مجازی سنت او اس
Iptables یک برنامه فایروال است که مدیر سرور مجازی می تواند با کامنت ترافیک های ورودی را کنترل کرده و ای پی های مشکوک را ببندید
در این مقاله نمی توانیم بیشتر از این در مورد iptables توضیح دهیم اما می توانیم یک راه بسیار ساده به شما پیشنهاد کنیم که بتوانید بدون دانش فنی زیاد جداول و rueles را مدیریت کنید
برای از کار انداختن یا فعال کردن قوانین فایروال لازم است که شما قبل از هر rules علامت # را برای غیر فعال کردن قرار دهید یا برای فعال کرده این علامت را بردارید
دقت داشته باشید که ممکن است با فعال کردن فایروال دسترسی شما به سرور مجازی از طریق ssh قطع شود بنابراین شما باید یک دسترسی کنسول یا kvm به سرور مجازی داشته باشید
همچنین این آموزش بر روی سرور مجازی سنت او اس 6 تست شده و به درستی کار کرده اما این دلیل نمی شود که برای شما هم به درستی کار کند اما حداقل به کلیات این اسکریپت آشنا می شوید
من معمولا اسکریپت ها را در شاخه روت قرار می دهم اما شما می توانید هر جا که دلتان می خواهد آن را نگه دارید
خوب بریم سراغ آموزش
ابتدا یک دایرکتوری ایجاد می کنیم
mkdir /root/ips
سپس یک فایل برای آی پی های Witelist اضافه می کنیم
nano /root/ips/akismet_ips.txt
سپس آی پی هایی که می خواهیم همیشه بتوانند به سرور دسترسی داشته باشند را به این فایل اضافه می کنیم
حالا اسکریپت iptables را ایجاد می کنیم
nano /root/iptables.sh
عبارت زیر را عینا کپی می کنیم در فایل
##################################### #!/bin/bash # www.webpouyan.com iptables script # # make .sh executable # chmod +x iptables.sh # # to run iptables script # ./iptables.sh ##################################### if [ $(id -u) != "0" ]; then echo "You must be the root to run this script" >&2 exit 1 fi iptables="/sbin/iptables" ip6tables="/sbin/ip6tables" # Flush old iptables iptables -F # Drop everything IPv4 by default iptables -P OUTPUT DROP iptables -P INPUT DROP iptables -P FORWARD DROP # Disable IPv6 if test -x ip6tables; then ip6tables -P INPUT DROP ip6tables -P OUTPUT DROP ip6tables -P FORWARD DROP ip6tables-save > /etc/sysconfig/ip6tables fi # block WordPress spammer # BANNED_IPS="./ips/banned_ips.txt" # for i in `cat $BANNED_IPS`; do # iptables -A INPUT -s $i -j DROP # done # WordPress Akismet Anti Spam Service AKISMET_IPS="./ips/akismet_ips.txt" for i in `cat $AKISMET_IPS`; do iptables -A OUTPUT -p tcp -d $i --dport 80 -j ACCEPT done # allow ipcapsula IP range INCAPSULA_IPS="./ips/incapsula_ips.txt" for i in `cat $INCAPSULA_IPS`; do iptables -A INPUT -p tcp -m tcp --dport 80 -s $i -j ACCEPT done # allow cloudflare IP range INCAPSULA_IPS="./ips/cloudflare_ips.txt" for i in `cat $INCAPSULA_IPS`; do iptables -A INPUT -p tcp -m tcp --dport 80 -s $i -j ACCEPT done # allow newrelic # NEWRELIC_IPS="./ips/newrelic_ips.txt" # for i in `cat $NEWRELIC_IPS`; do # iptables -A INPUT -s $i -j ACCEPT # iptables -A OUTPUT -d $i -j ACCEPT # done # Allow backup server for ftp backup # replace 127.0.0.1 with the remote backup server iptables -A INPUT -s 127.0.0.1/32 -j ACCEPT iptables -A OUTPUT -d 127.0.0.1/32 -j ACCEPT # Allow IP to IP to connect to server # replace 127.0.0.1 with your home or IP you connect from iptables -A INPUT -s 127.0.0.1 -j ACCEPT iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT # drop venet0:1 iptables -A INPUT -i venet0:1 -p all -j DROP iptables -A OUTPUT -o venet0:1 -p all -j DROP # block udp flood iptables -A INPUT -p udp -m length --length 5 -j DROP iptables -A INPUT -p udp -m udp --dport 20100:65535 -m state --state NEW -m recent --update --seconds 30 --hitcount 10 --name DEFAULT --rsource -j DROP iptables -A INPUT -p udp -m udp --dport 20100:65535 -m state --state NEW -m recent --set --name DEFAULT --rsource # force syn packets check, make sure new incoming tcp connections are syn packets; otherwise we need to drop them iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP # force syn packets check, make sure new outgoing tcp connections are syn packets; otherwise we need to drop them iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP # drop all invalid packets iptables -A INPUT -m state --state INVALID -j DROP iptables -A OUTPUT -m state --state INVALID -j DROP iptables -A FORWARD -m state --state INVALID -j DROP # Drop excessive RST packets to avoid smurf attacks iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT # drop all null packets iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP iptables -A OUTPUT -p tcp --tcp-flags ALL NONE -j DROP # drop packets with incoming fragments. this attack result into linux server panic such data loss iptables -A INPUT -f -j DROP iptables -A OUTPUT -f -j DROP # drop xmas packets iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP iptables -A OUTPUT -p tcp --tcp-flags ALL ALL -j DROP # drop all invalid packets iptables -A INPUT -m state --state INVALID -j DROP iptables -A OUTPUT -m state --state INVALID -j DROP iptables -A FORWARD -m state --state INVALID -j DROP # Drop bogus TCP packets iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP # iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK SYN,ACK -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags ALL ACK,RST,SYN,FIN -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags ALL FIN,URG,PSH -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags ACK,FIN FIN -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags ACK,PSH PSH -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP # stop Smurf attacks iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP iptables -A INPUT -p icmp -m icmp -j DROP # drop all fragmented ICMP packaets (almost always malicious) iptables -A INPUT -p icmp --fragment -j DROP iptables -A OUTPUT -p icmp --fragment -j DROP iptables -A FORWARD -p icmp --fragment -j DROP # drop all IMCP traffic iptables -A INPUT -p icmp -j DROP iptables -A OUTPUT -p icmp -j DROP iptables -A FORWARD -p icmp -j DROP # Reject Invalid networks (Spoof) iptables -A INPUT -s 10.0.0.0/8 -j DROP iptables -A INPUT -s 192.0.0.1/24 -j DROP iptables -A INPUT -s 169.254.0.0/16 -j DROP iptables -A INPUT -s 172.16.0.0/12 -j DROP iptables -A INPUT -s 224.0.0.0/4 -j DROP iptables -A INPUT -d 224.0.0.0/4 -j DROP iptables -A INPUT -s 240.0.0.0/5 -j DROP iptables -A INPUT -d 240.0.0.0/5 -j DROP iptables -A INPUT -s 0.0.0.0/8 -j DROP iptables -A INPUT -d 0.0.0.0/8 -j DROP iptables -A INPUT -d 239.255.255.0/24 -j DROP iptables -A INPUT -d 255.255.255.255 -j DROP # drop 23 telnet, 25 SMTP, 110 POP3, 139 NETBIOS, 445 Windows file sharing, 1433 M$ SQL server, 1521 Oracle database, # drop 1723 VPN (PPTP), 3306 MySQL database, 3389 M$ remote desktop, 5900 VNC, 8080 firewall remote login iptables -A INPUT -p tcp -m multiport --dports 22,23,25,110,139,445,1433,1521,1723,3306,3389,5900 -j DROP iptables -A OUTPUT -p tcp -m multiport --dports 22,23,25,110,139,445,1433,1521,1723,3306,3389,5900 -j DROP # Attempt to block portscans # Anyone who tried to portscan us is locked out for an entire day. iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP # Once the day has passed, remove them from the portscan list iptables -A INPUT -m recent --name portscan --remove iptables -A FORWARD -m recent --name portscan --remove # These rules add scanners to the portscan list, and log the attempt. iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:" iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:" iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP # allow loopback iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Enable stateful inspection iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Limit established traffic iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 500/second --limit-burst 400 -j ACCEPT # allow 888 ssh server iptables -A INPUT -p tcp --dport 888 -m state --state NEW -m recent --set --name SSH iptables -A INPUT -p tcp --dport 888 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP iptables -A INPUT -p tcp -m tcp --dport 888 -j ACCEPT iptables -A OUTPUT -p tcp --sport 888 -m state --state ESTABLISHED -j ACCEPT # allow 80,443 web server iptables -A INPUT -p tcp -m tcp -m multiport --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp -m tcp -m multiport --sports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT # allow 587 mail server SMTP iptables -A OUTPUT -p tcp -m tcp --dport 587 -m state --state NEW,ESTABLISHED -j ACCEPT # allow 80,443 for yum update iptables -A INPUT -p tcp -m multiport --sports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # limit udp hitcount for dns server # iptables -A INPUT -p udp --dport 53 -m state --state NEW -m recent --set --name DNSDDOS --rsource # iptables -A INPUT -p udp --dport 53 -m state --state NEW -m recent --update --seconds 1 --hitcount 5 --name DNSDDOS --rsource -j DROP # allow 53 dns lookups (domain name service) iptables -I INPUT -p udp -s 8.8.8.8/32 --sport 53 -m state --state ESTABLISHED --dport 1024:65535 -j ACCEPT iptables -I INPUT -p udp -s 8.8.4.4/32 --sport 53 -m state --state ESTABLISHED --dport 1024:65535 -j ACCEPT iptables -I OUTPUT -p udp -d 8.8.8.8/32 --dport 53 -m state --state NEW,ESTABLISHED --sport 1024:65535 -j ACCEPT iptables -I OUTPUT -p udp -d 8.8.4.4/32 --dport 53 -m state --state NEW,ESTABLISHED --sport 1024:65535 -j ACCEPT # Drop all TCP and UDP iptables -A INPUT -p tcp -j DROP iptables -A OUTPUT -p tcp -j DROP # Drop all UDP iptables -A INPUT -p udp -j DROP iptables -A OUTPUT -p udp -j DROP # Save iptables iptables-save > /etc/sysconfig/iptables # Display iptables # iptables -nvL # iptables-save | tee /etc/sysconfig/iptables # ip6tables-save | tee /etc/sysconfig/ip6tables ################################## # KERNEL PARAMETER CONFIGURATION # ################################## # PREVENT YOU SYSTEM FROM ANSWERING ICMP ECHO REQUESTS echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # DROP ICMP ECHO-REQUEST MESSAGES SENT TO BROADCAST OR MULTICAST ADDRESSES echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # DONT ACCEPT ICMP REDIRECT MESSAGES echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects # DONT SEND ICMP REDIRECT MESSAGES echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects # DROP SOURCE ROUTED PACKETS echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route # ENABLE TCP SYN COOKIE PROTECTION FROM SYN FLOODS echo 1 > /proc/sys/net/ipv4/tcp_syncookies # ENABLE SOURCE ADDRESS SPOOFING PROTECTION echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter # LOG PACKETS WITH IMPOSSIBLE ADDRESSES (DUE TO WRONG ROUTES) ON YOUR NETWORK echo 1 > /proc/sys/net/ipv4/conf/all/log_martians # DISABLE IPV4 FORWARDING echo 0 > /proc/sys/net/ipv4/ip_forward #################### # Exit iptables.sh # #################### exit 0
سپس سطح دسترسی را برای این فایل باز می کنیم
chmod +x iptables.sh
و در آخر اسکریپت را اجرا می کنیم
./iptable.sh