اسکریپت iptables در سرور مجازی سنت او اس

اسکریپت 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