#!/bin/bash
#Autor: Mal`cev Aleksander
#e-mail: skyinfo@ya.ru
case "$1" in
stop)
echo "Shutting down firewall..."
iptables --flush
iptables --delete-chain
iptables --table nat --flush
iptables --table filter --flush
iptables --table nat --delete-chain
iptables --table filter --delete-chain
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
echo "...done"
;;
status)
echo $"Table:filter"
iptables --list
echo $"Table:nat"
iptables -t nat --list
;;
restart|reload)
$0 stop
$0 start
;;
#############################################################################
start)
echo "Starting Firewall..."
echo ""
# Политики по умолчанию.
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT DROP
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
# Загрузка дополнительных модулей
modprobe ip_nat_ftp
modprobe ip_nat_pptp
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
# Разрешаем прохождение любого трафика по интерфейсу обратной петли, eth1, eth0.
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j ACCEPT
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
# Запрещаем любые новые подключения с любых интерфейсов, кроме lo к компьютеру.
iptables -A INPUT -m state ! -i lo --state NEW -j DROP
iptables -A INPUT -m state ! -i eth1 --state NEW -j DROP
iptables -A INPUT -m state ! -i eth0 --state NEW -j DROP
# Если интерфейс не lo, то запрещаем входить в список его адресов.
iptables -A INPUT -s 127.0.0.1/255.0.0.0 ! -i lo -j DROP
# Отбрасывать все пакеты, которые не могут быть идентифицированы и поэтому не могут иметь определенного статуса.
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
# Принимать все пакеты, которые инициированы из уже установленного соединения, и имеющим признак ESTABLISHED.
# Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
########### Защита от скрытого сканирования ##################################
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 15/minute -d any/0 -j QUEUE
########### Черезмерное большое кол-во icmp запросов ########################
iptables -t filter -A FORWARD -p icmp -m limit --limit 250/sec --limit-burst 500 -j QUEUE
iptables -t filter -A FORWARD -p icmp -j DROP
# SYN наводнение.
# Приводит к связыванию системных ресурсов, так что реальных обмен данными становится не возможным.
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
# UDP наводнение
# Службы использующие UDP, очень часто становятся мишенью для атак с целью вывода системы из строя.
iptables -A INPUT -p UDP -s 0/0 --destination-port 138 -j DROP
iptables -A INPUT -p UDP -s 0/0 --destination-port 113 -j REJECT
iptables -A INPUT -p UDP -s 0/0 --source-port 67 --destination-port 68 -j ACCEPT
iptables -A INPUT -p UDP -j RETURN
iptables -A OUTPUT -p UDP -s 0/0 -j ACCEPT
# ICMP - перенаправление
# ICMP - сообщение указывает системе изменить содержимое таблиц маршрутизации с тем, что бы направлять
# пакеты по более короткому маршруту. Может быть использовано взломщиком для перенаправления вашего трафика через свою машину.
iptables -A INPUT --fragment -p ICMP -j DROP
iptables -A OUTPUT --fragment -p ICMP -j DROP
# Разрешаем ICMP соединение. Значительная часть ICMP используется для передачи сообщений о
# том, что происходит с тем или иным UDP или TCP соединением.
# INET_IFACE_IUNLIM
iptables -A INPUT -p icmp -m icmp -i ppp0 --icmp-type source-quench -j ACCEPT
iptables -A OUTPUT -p icmp -m icmp -o ppp0 --icmp-type source-quench -j ACCEPT
# INET_IFACE_LUNLIM
iptables -A INPUT -p icmp -m icmp -i ppp1 --icmp-type source-quench -j ACCEPT
iptables -A OUTPUT -p icmp -m icmp -o ppp1 --icmp-type source-quench -j ACCEPT
# Разрешаем себе ping наружу - нас же не попингуешь - пакеты отбрасываются.
#INET_IFACE_IUNLIM
iptables -A INPUT -p icmp -m icmp -i ppp0 --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp -m icmp -o ppp0 --icmp-type echo-request -j ACCEPT
#INET_IFACE_LUNLIM
iptables -A INPUT -p icmp -m icmp -i ppp1 --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp -m icmp -o ppp1 --icmp-type echo-request -j ACCEPT
# Разрешаем передачу пакета - некорректный параметр - используется, если в заголовке пакета содержится недопустимая запись,
# или если контрольная сумма заголовка не соответствует контрольной сумме, указанной передающим узлом.
#INET_IFACE_IUNLIM
iptables -A INPUT -p icmp -m icmp -i ppp0 --icmp-type parameter-problem -j ACCEPT
iptables -A OUTPUT -p icmp -m icmp -o ppp0 --icmp-type parameter-problem -j ACCEPT
#INET_IFACE_LUNLIM
iptables -A INPUT -p icmp -m icmp -i ppp1 --icmp-type parameter-problem -j ACCEPT
iptables -A OUTPUT -p icmp -m icmp -o ppp1 --icmp-type parameter-problem -j ACCEPT
# Запрещаем подключение к X серверу через сетевые интерфейсы.
#INET_IFACE_IUNLIM
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 6000:6063 -j DROP --syn
#INET_IFACE_LUNLIM
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 6000:6063 -j DROP --syn
# Прописываем порты, которые открыты в системе, но которые не должны быть открыты на сетевых интерфейсах:
# $IPT -A INPUT -p tcp -m tcp -m multiport -i $INET_IFACE -j DROP --dports #порта
#INET_IFACE_IUNLIM
iptables -A INPUT -p tcp -m tcp -m multiport -i ppp0 -j DROP --dports 783
iptables -A INPUT -p tcp -m tcp -m multiport -i ppp0 -j DROP --dports 3310
iptables -A INPUT -p tcp -m tcp -m multiport -i ppp0 -j DROP --dports 10000
#INET_IFACE_LUNLIM
iptables -A INPUT -p tcp -m tcp -m multiport -i ppp1 -j DROP --dports 783
iptables -A INPUT -p tcp -m tcp -m multiport -i ppp1 -j DROP --dports 3310
iptables -A INPUT -p tcp -m tcp -m multiport -i ppp1 -j DROP --dports 10000
# DNS сервер имен разрешаем.
#
iptables -A OUTPUT -p udp -m udp -o ppp0 --dport 53 --sport 1024:65535 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp -o ppp0 --dport 53 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p udp -m udp -i ppp0 --dport 1024:65535 --sport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 1024:65353 --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp -m udp -o ppp1 --dport 53 --sport $UNPRIPORTS -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 53 --sport $UNPRIPORTS -j ACCEPT
iptables -A INPUT -p udp -m udp -i ppp1 --dport $UNPRIPORTS --sport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65353 --sport 53 -j ACCEPT
# Разрешаем AUTH-запросы на удаленные сервера, на свой же компьютер - запрещаем.
iptables -A OUTPUT -p tcp -m tcp -o ppp0 --dport 113 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 1024:65535 --sport 113 -j ACCEPT ! --syn
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 113 -j DROP
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 113 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65535 --sport 113 -j ACCEPT ! --syn
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 113 -j DROP
# Открываем некоторые порты:
# SSH клиент (22)
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 22 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65535 --sport 22 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 22 --sport 1020:1023 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1020:1023 --sport 22 -j ACCEPT ! --syn
# DC server (Verlihub)
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 411 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65535 --sport 411 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp0 --dport 411 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 1024:65535 --sport 411 -j ACCEPT ! --syn
# Teamspeak server
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 51534 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65535 --sport 51534 -j ACCEPT ! --syn
iptables -A OUTPUT -p udp -m udp -o ppp1 --dport 8767 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p udp -m udp -i ppp1 --dport 1024:65535 --sport 8767 -j ACCEPT ! --syn
# HTTP/HTTPS клиент (80, 443)
iptables -A OUTPUT -p tcp -m tcp -m multiport -o ppp0 --sport 1024:65535 -j ACCEPT --dports 80,443
iptables -A INPUT -p tcp -m tcp -m multiport -i ppp0 --dport 1024:65535 -j ACCEPT --sports 80,443 ! --syn
iptables -A OUTPUT -p tcp -m tcp -m multiport -o ppp1 --sport 1024:65535 -j ACCEPT --dports 80,443
iptables -A INPUT -p tcp -m tcp -m multiport -i ppp1 --dport 1024:65535 -j ACCEPT --sports 80,443 ! --syn
# Разрешаем finger, whois, gorper, wais. Traceroute - разрешаем себе, к нам не проломятся - запрещено. Telnet
# запретил, чтобы соблазна не было передавать пароли прямым текстом.
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 1024:65535 --sport 20 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp -o ppp0 --dport 20 --sport 1024:65535 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp0 --dport 1024:65535 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 1024:65535 --sport 1024:65535 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp0 --dport 23 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 1024:65535 --sport 23 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp0 --dport 79 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 1024:65535 --sport 79 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp0 --dport 43 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 1024:65535 --sport 43 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp0 --dport 70 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 1024:65535 --sport 70 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp0 --dport 210 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp0 --dport 1024:65535 --sport 210 -j ACCEPT ! --syn
iptables -A OUTPUT -p udp -m udp -o ppp0 --dport 33434:33523 --sport 32769:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65535 --sport 20 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 20 --sport 1024:65535 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 1024:65535 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65535 --sport 1024:65535 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 23 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65535 --sport 23 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 79 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65535 --sport 79 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 43 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65535 --sport 43 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 70 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65535 --sport 70 -j ACCEPT ! --syn
iptables -A OUTPUT -p tcp -m tcp -o ppp1 --dport 210 --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i ppp1 --dport 1024:65535 --sport 210 -j ACCEPT ! --syn
iptables -A OUTPUT -p udp -m udp -o ppp1 --dport 33434:33523 --sport 32769:65535 -j ACCEPT
# Разрешаем прохождение DHCP запросов через iptables. Нужно, если IP адрес динамический.
iptables -A OUTPUT -p udp -m udp -o ppp0 --dport 67 --sport 68 -j ACCEPT
iptables -A INPUT -p udp -m udp -i ppp0 --dport 68 --sport 67 -j ACCEPT
iptables -A OUTPUT -p udp -m udp -o ppp1 --dport 67 --sport 68 -j ACCEPT
iptables -A INPUT -p udp -m udp -i ppp1 --dport 68 --sport 67 -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! ppp0 -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! ppp1 -j ACCEPT
iptables -A FORWARD -i ppp0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ppp1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow outgoing connections from the LAN side.
iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp1 -j ACCEPT
# Masquerade.
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE
# Don't forward from the outside to the inside.
iptables -A FORWARD -i ppp0 -o ppp0 -j REJECT
iptables -A FORWARD -i ppp1 -o ppp1 -j REJECT
echo "...done"
echo "--> IPTABLES firewall loaded/activated <--"
#########################################################################################
;;
*)
echo "Usage:firewall (start|stop|restart|status) EXTIF INTIF"
exit 1
esac
exit 0
iptables v1.4.3: invalid port/service `-j' specified
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.4.3: invalid port/service `-j' specified
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.4.3: invalid port/service `--sport' specified
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.4.3: unknown option `--syn'
Try `iptables -h' or 'iptables --help' for more information.
Using intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`).
Using intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`).