- سه شنبه ۲۳ آذر ۹۵
- ۱۶:۰۲
Iptables یک برنامه فایروال است که مدیر سرور مجازی می تواند با کامنت ترافیک های ورودی را کنترل کرده و ای پی های مشکوک را ببندید
در این مقاله نمی توانیم بیشتر از این در مورد iptables توضیح دهیم اما می توانیم یک راه بسیار ساده به شما پیشنهاد کنیم که بتوانید بدون دانش فنی زیاد جداول و rueles را مدیریت کنید
برای از کار انداختن یا فعال کردن قوانین فایروال لازم است که شما قبل از هر rules علامت # را برای غیر فعال کردن قرار دهید یا برای فعال کرده این علامت را بردارید
دقت داشته باشید که ممکن است با فعال کردن فایروال دسترسی شما به سرور مجازی از طریق ssh قطع شود بنابراین شما باید یک دسترسی کنسول یا kvm به سرور مجازی داشته باشید
همچنین این آموزش بر روی سرور مجازی سنت او اس ۶ تست شده و به درستی کار کرده اما این دلیل نمی شود که برای شما هم به درستی کار کند اما حداقل به کلیات این اسکریپت آشنا می شوید
منبع : اسکریپت iptables در سرور مجازی سنت او اس | وبلاگ گروه وب پویان
من معمولا اسکریپت ها را در شاخه روت قرار می دهم اما شما می توانید هر جا که دلتان می خواهد آن را نگه دارید
خوب بریم سراغ آموزش
ابتدا یک دایرکتوری ایجاد می کنیم
mkdir /root/ips
سپس یک فایل برای آی پی های Witelist اضافه می کنیم
nano /root/ips/akismet_ips.txt
سپس آی پی هایی که می خواهیم همیشه بتوانند به سرور دسترسی داشته باشند را به این فایل اضافه می کنیم
حالا اسکریپت iptables را ایجاد می کنیم
nano /root/iptables.sh
عبارت زیر را عینا کپی می کنیم در فایل
#####################################
#!/bin/bash
# www.webpouyan.org 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
منبع : اسکریپت iptables در سرور مجازی سنت او اس | وبلاگ گروه وب پویان
- ۴۱۶