1

В общем не так давно писал скрипт для небольшого сервера, думаю сгодиться кому-нибудь.

#!/bin/bash
IPT=iptables 
EC=echo
#############################################
$IPT -F
$IPT -X
$IPT -t filter -F
$IPT -t mangle -F
$IPT -t nat -X
$IPT -t filter -X
$IPT -t mangle -X
##############################################
$EC 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all #отключаем пинг
$EC 1 > /proc/sys/net/ipv4/tcp_syncookies #Для защиты от syn флуда
$EC 30 > /proc/sys/net/ipv4/tcp_fin_timeout #Сколько секунд ожидать приема FIN до полного закрытия сокета
$EC 14400 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established # Время ожидания до закрытия соединения
$EC 0 > /proc/sys/net/ipv4/tcp_sack # Запрещаем selective acknowledgements, RFC2018
$EC 0 > /proc/sys/net/ipv4/tcp_timestamps # Запрещаем TCP timestamps, RFC1323
################################################
$IPT -P INPUT DROP #Что не разрешенно, то запрещенно
$IPT -t filter -A INPUT -i lo -j ACCEPT #Loop-back accept all
$IPT -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #any established or related conns are welcome
#Молчать на сканирование
$IPT -t filter -A INPUT -p icmp --icmp-type timestamp-request -j DROP 
$IPT -t filter -A OUTPUT -p icmp --icmp-type timestamp-reply -j DROP
$IPT -t filter -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # All of the bits are cleared
$IPT -t filter -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # SYN and FIN are both set
$IPT -t filter -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP # SYN and RST are both set
$IPT -t filter -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP # FIN and RST are both set
$IPT -t filter -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP #FIN is the only bit set,without the expected accompanying ACK
$IPT -t filter -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP #PSH is the only bit set,without the expected accompanying ACK
$IPT -t filter -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP #URG is the only bit set,without the expected accompanying ACK
$IPT -t filter -A INPUT -p tcp -m multiport --dports 137:139 -j DROP # netbios - ignore
$IPT -t filter -A INPUT -p udp -m multiport --dports 137:139 -j DROP # netbios - ignore
$IPT -t filter -A INPUT -p tcp -m tcp --dport 111 -j DROP #rpcbind - ignore
$IPT -t filter -A INPUT -p tcp -m tcp --dport 135 -j DROP #msrpc - ignore
$IPT -t filter -A INPUT -p tcp -m tcp --dport 136 -j DROP #profile - ignore
$IPT -t filter -A INPUT -p tcp -m tcp --dport 445 -j DROP #microsoft-ds - ignore
#Открытые порты
$IPT -t filter -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #апач
$IPT -t filter -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT #фтп
$IPT -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #ssh
$IPT -t filter -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT #bind

Debian GNU/Linux

2

Спасибо. Полезно.

3

Мой скрипт. Написан на основе найденных правил, потому все правила разъяснить не могу (ленюсь).

#!/bin/sh

ipt="/sbin/iptables -v"
ip6t="/sbin/ip6tables -v"

# Непривилегированные порты
upp="1024:65535"
# Исходящие порты, которые надо открыть
acp="21 22 25 80 443 587 993 873"
# Входящие порты, которые надо открыть
acip="21 22 80"

# Интерфейс, смотрящий наружу
eif="eth1"
eip="`ifconfig $eif | grep 'inet addr' | awk '{print $2}' | sed 's/^\w\+://g'`"

# Интерфейс, смотрящий в сеть
iif="br0"
iip="`ifconfig $iif | grep 'inet addr' | awk '{print $2}' | sed 's/^\w\+://g'`"

# Удалить все существующие правила
$ipt -F
$ipt -t nat -F
$ipt -t mangle -F
$ipt -X
$ipt -t nat -X
$ipt -t mangle -X

# По-умолчанию выбрасывать все пакеты
$ipt -P INPUT DROP
$ipt -P OUTPUT DROP
$ipt -P FORWARD DROP

# Включить NAT.
# Предварительно нужно включить net.ipv4.ip_forward в /etc/sysctl.conf
$ipt -t nat -A POSTROUTING -o $eif -j MASQUERADE
$ipt -A FORWARD -i $iif -o $eif -m state --state NEW,ESTABLISHED -j ACCEPT

# Разрешить любой трафик внутри сети и по обратной петле
$ipt -A INPUT -i $iif -j ACCEPT
$ipt -A OUTPUT -o $iif -j ACCEPT
$ipt -A INPUT -d $iip -j ACCEPT
$ipt -A OUTPUT -d $iip -j ACCEPT
$ipt -A INPUT -i lo -j ACCEPT
$ipt -A OUTPUT -o lo -j ACCEPT

# Разрешить пакеты, идущие по установленному соединению
$ipt -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
$ipt -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Защита системы, не вникал
$ipt -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$ipt -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
$ipt -A INPUT -p UDP -s 0/0 --destination-port 138 -j DROP 
$ipt -A INPUT -p UDP -s 0/0 --destination-port 113 -j REJECT 
$ipt -A INPUT -p UDP -s 0/0 --source-port 67 --destination-port 68 -j ACCEPT  
$ipt -A INPUT -p UDP -j RETURN 
$ipt -A OUTPUT -p UDP -s 0/0 -j ACCEPT 
$ipt -A INPUT --fragment -p ICMP -j DROP 
$ipt -A OUTPUT --fragment -p ICMP -j DROP 
$ipt -A INPUT   -m state --state INVALID -j DROP
$ipt -A FORWARD -m state --state INVALID -j DROP

# Разрешить исходящие эхо-сообщения
$ipt -A INPUT -p icmp -m icmp -i $eif --icmp-type source-quench -j ACCEPT
$ipt -A OUTPUT -p icmp -m icmp -o $eif --icmp-type source-quench -j ACCEPT
$ipt -A INPUT -p icmp -m icmp -i $eif --icmp-type echo-reply -j ACCEPT
$ipt -A OUTPUT -p icmp -m icmp -o $eif --icmp-type echo-request -j ACCEPT
# Разрешить входящий ICMP-трафик
#$ipt -A INPUT -p icmp -j ACCEPT
#$ipt -A OUTPUT -p icmp -j ACCEPT

# Разрешить сообщения об ошибках через ICMP
$ipt -A INPUT -p icmp -m icmp -i $eif --icmp-type parameter-problem -j ACCEPT
$ipt -A OUTPUT -p icmp -m icmp -o $eif --icmp-type parameter-problem -j ACCEPT

$ipt -A INPUT -p icmp -m icmp -i $eif --icmp-type source-quench -j ACCEPT
$ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 113 --sport $upp -j ACCEPT
$ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 113 -j ACCEPT ! --syn
$ipt -A INPUT -p tcp -m tcp -i $eif --dport 113 -j DROP

# Открыть исходящие порты
for outp in $acp; do
    $ipt -A OUTPUT -p tcp -m tcp -o $eif --dport $outp --sport $upp -j ACCEPT
    $ipt -A FORWARD -p tcp -m tcp -i $iif -o $eif --dport $outp -j ACCEPT
    $ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport $outp -j ACCEPT ! --syn
done

# finger, whois, gorper, wais, traceroute
$ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 20 -j ACCEPT
$ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 20 --sport $upp -j ACCEPT ! --syn
$ipt -A OUTPUT -p tcp -m tcp -o $eif --dport $upp --sport $upp -j ACCEPT
$ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport $upp -j ACCEPT ! --syn
$ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 23 --sport $upp -j ACCEPT
$ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 23 -j ACCEPT ! --syn
$ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 79 --sport $upp -j ACCEPT
$ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 79 -j ACCEPT ! --syn
$ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 43 --sport $upp -j ACCEPT
$ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 43 -j ACCEPT ! --syn
$ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 70 --sport $upp -j ACCEPT
$ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 70 -j ACCEPT ! --syn
$ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 210 --sport $upp -j ACCEPT
$ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 210 -j ACCEPT ! --syn
$ipt -A OUTPUT -p udp -m udp -o $eif --dport 33434:33523 --sport 32769:65535 -j ACCEPT

# Открыть входящие порты
for inp in $acip; do
    $ipt -A INPUT -p tcp -m tcp --dport $inp --sport $upp -i $eif -d $eip -j ACCEPT
    $ipt -A OUTPUT -p tcp -m tcp --sport $inp --dport $upp -o $eif -s $eip -j ACCEPT
done

# Разрешить IPv6-трафик
$ipt -I INPUT  -p ipv6 -j ACCEPT
$ipt -I OUTPUT -p ipv6 -j ACCEPT

# Очистить таблицы ip6tables
$ip6t -F

# Разрешить все ICMPv6 
$ip6t -A INPUT -p icmpv6 -j ACCEPT
$ip6t -A OUTPUT -p icmpv6 -j ACCEPT

# И прочие разрешения. Пока IPv6 поддерживают полтора хоста,
# о безопасности можно сильно не беспокоится.
$ip6t -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ip6t -A INPUT -i $iif -j ACCEPT
$ip6t -A INPUT -i lo -j ACCEPT
$ip6t -A INPUT -j REJECT

$ip6t -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$ip6t -A FORWARD -i $iif -j ACCEPT
$ip6t -A FORWARD -j REJECT

$ip6t -A OUTPUT -j ACCEPT

Эти правила используются на домашнем роутере-сервере. Интернет с eth1 раздается в сеть через br0, открыты порты для ssh, ftp и http.