Firewall i NAT - zgodny tandem

Wstęp

Skrypt

Uwaga ! Dla prawidłowego działania sesji ftp z wewnętrznej sieci na serwerze zewnetrznym należy dla kernela 2.4 załadować moduł ip_nat_ftp a dla kernela 2.6 - nf_nat_ftp. W tym celu dopisujemy odpowiednio nazwę modułu do /etc/modules.

Poniżej skrypt zawierający zahashowane opisy. Nie służy on jednak jako skrypt startowy, tylko do wygenerowania odpowiednich reguł, które są zapisywane przez usługę iptables z pakietu iptables-init, który należy zainstalować. Jest tak spreparowany, że zmiana adresów IP jest do dokonania przez pojedynczą zmianę na początku skryptu. Kto ma ochotę, może dopisać własne objaśnienia.

#!/bin/bash
INT_LAN_IP="192.168.1.1"
INT_LAN="192.168.1.0/24"
EXT_LAN=""
EXT_LANM="${EXT_LAN}/23"
EXT_IP="11.22.123.54"
EXT_IPM="${EXT_IP}/23"
IF_LAN="eth1"
IF_WAN="eth0"
 
CRESET="\x1B[0m"
BIALY="\x1B[37;1m"
ROZOWY="\x1B[31;1m"
 
if [ -x /etc/rc.d/init.d/iptables ]; then
	echo -e "Pakiet ${BIALY}iptables-init${CRESET} jest najprawdopodobniej zainstalowany."
	service iptables status > /dev/null
	if [ ${?} -gt "0" ]; then
		echo -e "${ROZOWY}Coś tu poszło nie tak, skontaktuj się z autorem skryptu.${CRESET}"
		exit 1
	fi
else
	echo -e "${ROZOWY}Zainstaluj najpierw pakiet \"${BIALY}iptables-init${ROZOWY}\".${CRESET}"
	exit 1
fi	
iptables -F
iptables -X
iptables -F -t nat
iptables -X -t nat
iptables -F -t mangle
iptables -X -t mangle
 
# polityka domyslna
iptables -P OUTPUT ACCEPT
 
############## INPUT trafic ##############
iptables -P INPUT DROP
#Drop invalid
iptables -A INPUT -m state --state INVALID -j DROP
 
# Drop non addresed to eth0 IP packed from wan
if [ -n "${EXT_LAN}" ] ; then
	iptables -A INPUT -i ${IF_WAN} -d ! ${EXT_LAN} -s 0/0 -j DROP
elif [ -n "${EXT_IP}" ] ; then
	iptables -A INPUT -i ${IF_WAN} -d ! ${EXT_IP} -s 0/0 -j DROP
fi
 
# Przyjmij bezwarunkowo połączenia z loopback
iptables -A INPUT -i lo -j ACCEPT
 
#Ping & Flood
# Przyjmij limitowaną ilość pingów
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/s -j ACCEPT
# Przyjmij limitowaną ilość odpowiedzi na pingi z zewnątrz
iptables -A INPUT -p icmp --icmp-type echo-reply -m limit --limit 30/s -j ACCEPT
# Przyjmij limitowaną ilość pakietów rozpoczynających, potwierdzających, kończących i resetujących połączenie
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 20/s -j ACCEPT
 
# Przyjmij połączenia z ethernet już nawiązane po tcp i udp
iptables -A INPUT -i ${IF_LAN} -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ${IF_LAN} -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ${IF_WAN} -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ${IF_WAN} -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# Przyjmij nowe połączenia z LAN na ssh
iptables -A INPUT -p tcp -i ${IF_LAN} -s ${INT_LAN} --dport ssh -m state --state NEW -j ACCEPT
 
# Przyjmij nowe połączenia z LAN na ftp
iptables -A INPUT -p tcp -i ${IF_LAN} -s ${INT_LAN} --dport ftp-data -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp -i ${IF_LAN} -s ${INT_LAN} --dport ftp -m state --state NEW -j ACCEPT
 
# Przyjmij nowe połączenia z LAN na sambę porty 137, 138, 139, 445
iptables -A INPUT -p tcp -i ${IF_LAN} -s ${INT_LAN} --dport netbios-ns -m state --state NEW -j ACCEPT
iptables -I INPUT -p udp -i ${IF_LAN} --dport 137 -m udp -j ACCEPT
iptables -A INPUT -p tcp -i ${IF_LAN} -s ${INT_LAN} --dport netbios-dgm -m state --state NEW -j ACCEPT
iptables -I INPUT -p udp -i ${IF_LAN} --dport netbios-dgm -m udp -j ACCEPT
iptables -A INPUT -p tcp -i ${IF_LAN} -s ${INT_LAN} --dport netbios-ssn -m state --state NEW -j ACCEPT
iptables -I INPUT -p udp -i ${IF_LAN} --dport netbios-ssn -m udp -j ACCEPT
iptables -A INPUT -p tcp -i ${IF_LAN} -s ${INT_LAN} --dport microsoft-ds -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp -i ${IF_LAN} -s ${INT_LAN} --dport sunrpc -m state --state NEW -j ACCEPT
 
# specjalne: reject ident
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with icmp-port-unreachable
 
 
# Faster Before drop
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable 
 
############## FORWARD trafic ##############
iptables -P FORWARD DROP
#Ping & Flood
# Przepuść limitowaną ilość pingów na zewnątrz
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 30/s -j ACCEPT
# Przepuść limitowaną ilość odpowiedzi na pingi z zewnątrz
iptables -A FORWARD -p icmp --icmp-type echo-reply -m limit --limit 30/s -j ACCEPT
# Przepuść limitowaną ilość pakietów rozpoczynających, potwierdzających, kończących i resetujących połączenie
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 20/s -j ACCEPT
# Przepuść nawiązane połączenia : LAN - WAN tcp, udp
iptables -A FORWARD -i ${IF_LAN} -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ${IF_LAN} -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ${IF_WAN} -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ${IF_WAN} -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# Przepuść nawiązywanie połączenia od LAN z DNS
iptables -A FORWARD -i ${IF_LAN} -p tcp --dport domain -m state --state NEW -j ACCEPT
iptables -A FORWARD -i ${IF_LAN} -p udp --dport domain -m state --state NEW -j ACCEPT
# Przepuść nawiązywanie połączenia od LAN z http
iptables -A FORWARD -i ${IF_LAN} -p tcp --dport http -m state --state NEW -j ACCEPT
# Przepuść nawiązywanie połączenia od LAN z https
iptables -A FORWARD -i ${IF_LAN} -p tcp --dport https -m state --state NEW -j ACCEPT
# Przepuść nawiązywanie połączenia od LAN z ftp
iptables -A FORWARD -i ${IF_LAN} -p tcp --dport ftp-data -m state --state NEW -j ACCEPT
iptables -A FORWARD -i ${IF_LAN} -p tcp --dport ftp -m state --state NEW -j ACCEPT
# Przepuść nawiązywanie połączenia od LAN z usługami pocztowymi
iptables -A FORWARD -i ${IF_LAN} -p tcp --dport smtp -m state --state NEW -j ACCEPT
iptables -A FORWARD -i ${IF_LAN} -p tcp --dport smtps -m state --state NEW -j ACCEPT
iptables -A FORWARD -i ${IF_LAN} -p tcp --dport pop3 -m state --state NEW -j ACCEPT
iptables -A FORWARD -i ${IF_LAN} -p tcp --dport pop3s -m state --state NEW -j ACCEPT
 
# Zezwól na przepływ przekierowanych (DNAT) pakietów (niżej) na mysql
iptables -A FORWARD -d 127.0.0.1 -p tcp --dport mysql -m state --state NEW -j ACCEPT
 
 
# Faster Before drop
iptables -A FORWARD -p tcp -j REJECT --reject-with tcp-reset
iptables -A FORWARD -p udp -j REJECT --reject-with icmp-port-unreachable 
 
# Udostepnianie Internetu dla LAN
if [ -n "${EXT_LAN}" ] ; then
	iptables -t nat -A POSTROUTING -s ${INT_LAN} -o ${IF_WAN} -d 0/0 -j SNAT --to-source ${EXT_LAN}
elif [ -n "${EXT_IP}" ] ; then
	iptables -t nat -A POSTROUTING -s ${INT_LAN} -o ${IF_WAN} -d 0/0 -j SNAT --to-source ${EXT_IP}
else
	iptables -t nat -A POSTROUTING -s ${INT_LAN} -o ${IF_WAN} -d 0/0 -j MASQUERADE
fi
 
# Przekieruj ruch dla mysql w sieci wewnętrznej
iptables -t nat -I PREROUTING -p tcp --dport mysql -d ${INT_LAN_IP}  -j DNAT --to-destination 127.0.0.1:3306
 
# korekcja ttl dla NAT
iptables -t mangle -A PREROUTING -i ${IF_WAN} -j TTL --ttl-inc 5
iptables -t mangle -A POSTROUTING -o ${IF_WAN} -j TTL --ttl-set 128
 
# Zapisujemy reguły i spadamy... ;)
service iptables save
exit ${?}

Objaśnienia dodatkowe

Tutaj zamieszczam odpowiedzi na uwagi i pytania zadane przez użytkowników PLD, którzy się ze mną skontaktowali. Jestem dostepny na http://forum.pld-linux.org/ jako Light-I.

Skrypt jest przygotowany także na ewentualność, gdy publiczne ip jest DNAT-owane u ISP, wtedy pod EXT_LAN wpisujemy nasze statyczne IP w sieci ISP, a pod EXT_IP ten publiczny adres. Gdy nie ma publicznego adresu, skrypt zapodaje maskaradę (wtedy oczywiście IF_WAN=„pppX”). Oczywiście wtedy EXT_LAN też należy pozostawić puste.

Jeśli zaś chodzi o wzelkie kombinacje z wirtualnymi plikami /proc/sys/net/ipv4/* to wystarczy sobie sprawdzić zawartość tych plików, aby stwierdzić, ze nie musimy nic z nimi kombinować, bo całą dobrą robotę już zrobili developerzy PLD, jedyne, co trzeba zrobić na pewno, gdy chcemy mieć internet w lokalnej sieci, to zmienić w /etc/sysctl.conf :

net.ipv4.ip_forward = 0

na

net.ipv4.ip_forward = 1

Jeśli jakakolwiek z domyślnych wartości w systemie plików /proc nam nie pasuje, to lepiej nie cudaczyć poprzez echo „0” > /proc/…. w jakiejś skrypcinie startowej, tylko zmienić właśnie w tym pliku.

pl/przewodniki/firewall-nat-zgodny-tandem.txt · ostatnio zmienione: 2008/03/29 09:07 przez light-i
chimeric.de = chi`s home Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0 Powered by Lighttpd - fly light