#!/bin/sh
#########################################
#sudo chmod 700 firewall.sh #
#sudo cp firewall.sh /etc/init.d/ #
#sudo update-rc.d firewall.sh default #
#########################################
#czyszczenie firewalla
iptables -F
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
echo "Konfiguracja firewalla rozpoczeta"
# czyscimy wszystko
iptables -F -t nat
iptables -X -t nat
iptables -F -t filter
iptables -X -t filter
################
# blokujemy #
################
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
######################
# ustawienia wstepne #
######################
# ochrona przed atakiem typu Smurf
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# wlaczamy ochrone przed blednymi pakietami ICMP error
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# wlacza logowanie dziwnych (spoofed, source routed, redirects) pakietow
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
#Blokada przed atakami typu SYN FLOODING
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
#Blokowanie błędnych pakietow
iptables -A INPUT -j DROP -m unclean
#### wlaczenie loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A FORWARD -o lo -j ACCEPT
# Dodanie do tablicy INPUT reguł wpuszczających pakiety należące do
#już nawiązanych (ESTABLISHED) połączeń.
iptables -A INPUT -p tcp -j ACCEPT -m state --state ESTABLISHED
iptables -A INPUT -p udp -j ACCEPT -m state --state ESTABLISHED
iptables -A INPUT -p icmp -j ACCEPT -m state --state ESTABLISHED
iptables -A INPUT -p icmp -j ACCEPT -m state --state RELATED
# www i DNS
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
# ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p udp --dport 22 -j ACCEPT
# http i https
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p udp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p udp --dport 443 -j ACCEPT
# ftp
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p udp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p udp --dport 21 -j ACCEPT
# smtp oraz pop3 - oba z ssl
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p udp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p udp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 465 -j ACCEPT
iptables -A INPUT -p udp --dport 465 -j ACCEPT
iptables -A INPUT -p tcp --dport 995 -j ACCEPT
iptables -A INPUT -p udp --dport 995 -j ACCEPT
#Ograniczenie maksymalnej liczby przychodzacych pingow do jednego na sekunde
iptables -A INPUT -p icmp -i eth0 -m limit --limit 1/s -j ACCEPT
#zapisywanie do logow pakietow nie wpuszczonych
iptables -A INPUT -j LOG -m limit --limit 10/hour
echo "Konfiguracja firewalla zakonczona"
Po dodaniu takich reguł serwer zamiera, ping - zero reakcji; brak połączenia przez FTP, SSH, DNS nie odpowiada, itp.
Prosiłbym o sprawdzenie powyższych reguł.
"ma zostać" ma być do póki nie nauczysz się lepszych pisać to niech będzie, ale to bardzo prymitywna konstrukcja, lecz jak na początek wystarczy. Np. dziwi mnie fakt, że w wielu miejscach podaje się regułkę:
jest niepotrzebne, bo Twój komputer wysyła zapytanie, a wychodzić może wszystko, ktoś powie no tak ale serwer DNS musi odpowiedzieć, i tu mamy przecież:
iptables -A INPUT -p udp -j ACCEPT -m state --state ESTABLISHED
Takich przykładów jest dużo. Chodzi mi o to, że firewall to nie pisanie (ich znajomość) regułek, one tylko wyrażają to co trzeba opisać. Natomiast rzeczą nad którą trzeba się naprawdę skoncentrować to usługi, ich charakterystyka. Pisanie profesjonalnych firewalli wymaga bardzo dobrej znajomości protokołów oraz usług jakie przepuszczamy. Twój skrypt opisuje jedynie porty ale od czegoś trzeba zacząć i wszystko wymaga czasu :-)