Есть предложение обмозговать "типовой" iptables. Чтобы новичкам было проще. Потом подниму еще вопрос как подсчитывать трафик, в т.ч. по разным компам.
Что лишнее? Что можно добавить или убавить в целях повышения безопасности?
Настройкой forward еще не занимался.
Чтобы было от чего отталкиваться, кидаю "свой" скрипт (бессовестно взятый с какого-то сайте;) - ссылка дома, позже кину) для поднятия файрвола:
#!/bin/bash
OUT="ppp1" # Имя исходящего интерфейса, смотрящего в интернет.
OUTADDR="192.168.1.2" #192.168.1.2" # Адрес исходящего интерфейса (в моем случае - IP eth0, смотрящего в модем;))
IN="eth1" # Имя входящего интерфейса, смотрящего в локальную сеть
INADDR="192.168.0.1" # Адрес входящего интерфейса
NETWORK="192.168.0.0/24" # Адресация первой локальной сети
IN1="eth0" # Имя интерфейса, смотрящего во вторую сеть.
INADDR1="192.168.1.2" # Адрес интерфейса, смотрящего во вторую сеть.
NETWORK1="192.168.1.0/24" # Адресация второй локальной сети
ANYWHERE="0.0.0.0/0" # Назначение, любое.
PORTS="1024:65535" # Порты, которые считаются локальными
MULTICAST="224.0.0.0/4" # Мультикаст пакеты, если у вас не используется оставьте как есть,
# если используется IP TV тогда надо удалить этот пункт
#ADMINS="2.2.2.3 2.2.2.4" # IP адреса администраторов, имеют полный доступ на сервер, без каких либо ограничений.
ADMINS=""
##############################################################################################
# Здесь прописаны параметры запуска\остановки\статуса скрипта. лучше не трогайте =)
# Остановка скрипта
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 --flush
iptables --delete-chain
iptables --table nat --flush
iptables --table filter --flush
iptables --table nat --delete-chain
iptables --table filter --delete-chain
# Назначение глобальных политик фаервола
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#iptables -F INPUT
#iptables -F OUTPUT
#iptables -F FORWARD
# Загружаем модули, для корректной работы VPN, Active ftp, DCC in IRC которые будут идти через нат.
modprobe ip_nat_ftp
#modprobe ip_nat_pptp
modprobe ip_conntrack_ftp
#modprobe ip_conntrack_irc
# Изменение параметров SYSCTL
# Включение форвардинга
echo 1 > /proc/sys/net/ipv4/ip_forward
# Включение форвардинга для VPN
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
# Увеличение размера очередей
echo 32000000 > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
# Время ожидания до закрытия соединения
echo 14400 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
# Время ожидания до посылки FIN пакета
echo 60 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
# Время ожидания до посылки FIN пакета
echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
# Для защиты от syn флуда
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Увеличиваем размер backlog очереди
echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog
# Число начальных SYN и SYNACK пересылок для TCP соединения
echo 4 > /proc/sys/net/ipv4/tcp_synack_retries
echo 4 > /proc/sys/net/ipv4/tcp_syn_retries
#Какие порты использовать в качестве локальных TCP и UDP портов
echo "16384 61000" > /proc/sys/net/ipv4/ip_local_port_range
#Сколько секунд ожидать приема FIN до полного закрытия сокета
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
# Как часто посылать сообщение о поддержании keep alive соединения
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
# Сколько пакетов проверки keepalive посылать, прежде чем соединение будет закрыто.
echo 2 > /proc/sys/net/ipv4/tcp_keepalive_probes
# Зaпрещаем TCP window scaling
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
# Запрещаем selective acknowledgements, RFC2018
echo 0 > /proc/sys/net/ipv4/tcp_sack
# Запрещаем TCP timestamps, RFC1323
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
# Уличиваем размер буфера для приема и отправки данных через сокеты.
echo 1048576 > /proc/sys/net/core/rmem_max
echo 1048576 > /proc/sys/net/core/rmem_default
echo 1048576 > /proc/sys/net/core/wmem_max
echo 1048576 > /proc/sys/net/core/wmem_default
# Через какое время убивать соединеие закрытое на нашей стороне
echo 1 > /proc/sys/net/ipv4/tcp_orphan_retries
# Temporary eth0 completely disabled
#iptables -A INPUT -i $OUT -j DROP
# Admins - full control (even dagerous)
for admin_ips in $ADMINS; do
iptables -A INPUT -s $admin_ips -m state --state NEW -j ACCEPT
done
# все в логи
iptables -A INPUT -j LOG --log-level 7 --log-tcp-options
iptables -A OUTPUT -j LOG --log-level 7 --log-tcp-options
iptables -A FORWARD -j LOG --log-level 7 --log-tcp-options
#локальные адреса разрешаем.
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#разрешаем все входящие и исходящие с eth1
iptables -A INPUT -i $IN -j ACCEPT
iptables -A OUTPUT -o $IN -j ACCEPT
#разрешаем все входящие и исходящие с eth0
iptables -A INPUT -i $IN1 -j ACCEPT
iptables -A OUTPUT -o $IN1 -j ACCEPT
iptables -A OUTPUT -o $OUT -p icmp -m icmp -j ACCEPT
iptables -A INPUT -i $OUT -p icmp -m icmp -j ACCEPT
# Multicast - ignore
iptables -A INPUT -s $MULTICAST -j DROP
iptables -A INPUT -d $MULTICAST -j DROP
# any established or related conns are welcome
#iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Statistics and auths for customers, ping tests
for net_ips in $NETWORK; do
iptables -A INPUT -p icmp -i $IN --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp -i $OUT --icmp-type echo-request -j ACCEPT
done
############ Открываем нужные нам порты.
# FTP
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
# PASSIVE FTP
iptables -t filter -A INPUT -p tcp -m tcp --dport 50000:50500 -m state --state NEW -j ACCEPT
iptables -t filter -A INPUT -p udp -m udp --dport 50000:50500 -m state --state NEW -j ACCEPT
# APACHE
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
# SSH
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update --seconds 60 -j DROP
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --sport 22 -m recent --update --seconds 60 -j DROP
iptables -A INPUT -p tcp -m state --state NEW --sport 22 -m recent --set -j ACCEPT
#torrent
iptables -A INPUT -i $OUT -p tcp -m tcp --dport 6881 -j ACCEPT
iptables -A INPUT -i $OUT -p tcp -m tcp --sport 6881 -j ACCEPT
iptables -A INPUT -i $OUT -p tcp -m tcp --dport 3389 -j ACCEPT
iptables -A INPUT -i $OUT -p tcp -m tcp --sport 3389 -j ACCEPT
#Wesnoth
iptables -A INPUT -i $OUT -p tcp -m tcp --dport 15000 -j ACCEPT
iptables -A INPUT -i $OUT -p tcp -m tcp --sport 15000 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 15000 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --sport 15000 -j ACCEPT
########### OUTPUT
# SSH
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 23 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --sport 23 -j ACCEPT
# FTP
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 20 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --sport 20 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 445 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --sport 445 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 52378 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 81 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --sport 81 -j ACCEPT
# linux update
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 873 -j ACCEPT
# torrent
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 6881 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --sport 6881 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 3389 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --sport 3389 -j ACCEPT
#no-ip.com
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 8245 -j ACCEPT
#открываем порт аськи
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 5190 -j ACCEPT
#открываем порт atlantic
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 1234 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp --dport 11234 -j ACCEPT
#почта (начало)
iptables -A OUTPUT -o $OUT -p tcp -m tcp -d 217.197.114.149 --dport 110 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp -d 217.197.114.149 --dport 25 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp -d 217.197.114.134 --dport 110 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp -d 217.197.114.134 --dport 25 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp -d 194.67.23.102 --dport 110 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp -d 194.67.23.111 --dport 25 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp -d 82.204.219.180 --dport 110 -j ACCEPT
iptables -A OUTPUT -o $OUT -p tcp -m tcp -d 82.204.219.180 --dport 25 -j ACCEPT
#почта (конец)
#UDP
iptables -A OUTPUT -o $OUT -p udp -m udp -j ACCEPT
iptables -A OUTPUT -o $OUT -p udp -m udp -j ACCEPT
iptables -A FORWARD -o $OUT -p tcp -m tcp --dport 80 -j ACCEPT
#iptables -A FORWARD -o $OUT -p tcp -m tcp --dport 8080 -j ACCEPT
iptables -A FORWARD -o $OUT -p tcp -m tcp --dport 1755 -j ACCEPT
iptables -A FORWARD -o $OUT -p tcp -m tcp --dport 554 -j ACCEPT
iptables -A FORWARD -o $OUT -p udp -m udp --dport 7000 -j ACCEPT
iptables -A FORWARD -o $OUT -p udp -m udp --dport 7001 -j ACCEPT
iptables -A FORWARD -o $OUT -p udp -m udp --dport 7002 -j ACCEPT
iptables -A FORWARD -o $OUT -p udp -m udp --dport 7003 -j ACCEPT
iptables -A FORWARD -o $OUT -p udp -m udp --dport 7004 -j ACCEPT
iptables -A FORWARD -o $OUT -p udp -m udp --dport 7005 -j ACCEPT
iptables -A FORWARD -o $OUT -p udp -m udp --dport 7006 -j ACCEPT
iptables -A FORWARD -o $OUT -p udp -m udp --dport 7007 -j ACCEPT
iptables -A FORWARD -o $OUT -p udp -m udp --dport 53 -j ACCEPT
iptables -A FORWARD -o $OUT -p udp -m udp --dport 123 -j ACCEPT
iptables -A FORWARD -o $OUT -p udp -m udp --dport 137 -j ACCEPT
#все входящие с $OUT, кроме инициированных с моей стороны обламываем.
iptables -A INPUT -i $OUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $OUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
#iptables -A INPUT -i $OUT -j REJECT --reject-with icmp-port-unreachable
iptables -A OUTPUT -p icmp --icmp-type timestamp-reply -j DROP
########### NAT Вписываем сюда IP своих компьютеров в локальной сети.
iptables -t nat -A POSTROUTING -s 192.168.0.11 -o $OUT -j MASQUERADE
############ PORT FORWARD Сюда вписываем проброс портов локальную сеть.
#iptables -t nat -A PREROUTING -p tcp -d $OUTADDR --dport 8230 -j DNAT --to-destination 2.2.2.10:8230
#iptables -t filter -A FORWARD -i $OUT -d 2.2.2.10 -p tcp --dport 8230 -j ACCEPT
echo "...done"
echo "--> IPTABLES firewall loaded/activated <--"
##--------------------------------End Firewall---------------------------------##
;;
*)
echo "Usage: firewall (start|stop|restart|status) EXTIF INTIF"
exit 1
esac
exit 0
Заодно есть вопрос. Смотрю сейчас на домашнем компе (зашел через ssh):
$ nmap -A localhost
Starting Nmap 4.20 ( http://insecure.org ) at 2008-10-10 13:57 VLAST
Warning: Servicescan failed to fill ostype_template (subjectlen: 109). Too long?
Match string was line 160: p/$3/
Interesting ports on nick.home (127.0.0.1):
Not shown: 1690 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 5.0 (protocol 2.0)
80/tcp open http Apache httpd
111/tcp open rpcbind 2 (rpc #100000)
631/tcp open ipp CUPS 1.2
2628/tcp open dict dictd 1.9.15/rf
6000/tcp open X11 (access denied)
6881/tcp open bittorent-tracker?
В тоже время смотрю сейчас на домашний комп с рабочего:
$ nmap -A ----.no-ip.org
Starting Nmap 4.20 ( http://insecure.org ) at 2008-10-10 13:58 VLAST
Interesting ports on ----- (-----):
Not shown: 1692 filtered ports
PORT STATE SERVICE VERSION
21/tcp closed ftp
22/tcp open ssh OpenSSH 5.0 (protocol 2.0)
80/tcp open http Apache httpd
3389/tcp closed ms-term-serv
6881/tcp open bittorent-tracker?
Почему присутствуют порты 21 и 3389? Почему они не показываются при сканировании портов на localhost?