PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : iptables selbst gehostete webseite



debian-climber
29.04.04, 12:35
Hallo zusammen,

hab letzte Woche unseren Router mit einer neuen Kiste + neues Firewall Script ausgestattet. (damals noch ipchains).

Mein neues script sieht so aus.



# iptables-Modul
modprobe ip_tables
# Connection-Tracking-Module
modprobe ip_conntrack
# Das Modul ip_conntrack_irc ist erst bei Kerneln >= 2.4.19 verfuegbar
modprobe ip_conntrack_irc
modprobe ip_conntrack_ftp

# Tabelle flushen
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X

# Default-Policies setzen
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# MY_REJECT-Chain
iptables -N MY_REJECT

# MY_REJECT fuellen
iptables -A MY_REJECT -p tcp -m limit --limit 7200/h -j LOG --log-prefix "REJECT TCP "
iptables -A MY_REJECT -p tcp -j REJECT --reject-with tcp-reset
iptables -A MY_REJECT -p udp -m limit --limit 7200/h -j LOG --log-prefix "REJECT UDP "
iptables -A MY_REJECT -p udp -j REJECT --reject-with icmp-port-unreachable
iptables -A MY_REJECT -p icmp -m limit --limit 7200/h -j LOG --log-prefix "DROP ICMP "
iptables -A MY_REJECT -p icmp -j DROP
iptables -A MY_REJECT -m limit --limit 7200/h -j LOG --log-prefix "REJECT OTHER "
iptables -A MY_REJECT -j REJECT --reject-with icmp-proto-unreachable

# MY_DROP-Chain
iptables -N MY_DROP
iptables -A MY_DROP -m limit --limit 7200/h -j LOG --log-prefix "PORTSCAN DROP "
iptables -A MY_DROP -j DROP

# Alle verworfenen Pakete protokollieren
iptables -A INPUT -m state --state INVALID -m limit --limit 7200/h -j LOG --log-prefix "INPUT INVALID "
iptables -A OUTPUT -m state --state INVALID -m limit --limit 7200/h -j LOG --log-prefix "OUTPUT INVALID "
iptables -A FORWARD -m state --state INVALID -m limit --limit 7200/h -j LOG --log-prefix "FORWARD INVALID "

# Korrupte Pakete zurueckweisen
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP

# Stealth Scans etc. DROPpen
# Keine Flags gesetzt
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j MY_DROP

# SYN und FIN gesetzt
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j MY_DROP

# SYN und RST gleichzeitig gesetzt
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j MY_DROP

# FIN und RST gleichzeitig gesetzt
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags FIN,RST FIN,RST -j MY_DROP

# FIN ohne ACK
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,FIN FIN -j MY_DROP

# PSH ohne ACK
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,PSH PSH -j MY_DROP

# URG ohne ACK
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,URG URG -j MY_DROP

# Loopback-Netzwerk-Kommunikation zulassen
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Maximum Segment Size (MSS) für das Forwarding an PMTU anpassen
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# Connection-Tracking aktivieren
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ! eth1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A PREROUTING -i eth1 -p tcp -d 194.120.12.243 --dport 80 -jDNAT --to 192.168.2.2

# DNS
iptables -A INPUT -i eth1 -m state --state NEW -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth1 -m state --state NEW -p udp --dport 53 -j ACCEPT

# SSH
iptables -A INPUT -i eth1 -m state --state NEW -p tcp --dport 22 -j ACCEPT

# IP-Adresse des LAN-Interfaces ermitteln
LAN_IP=$(ifconfig eth0 | head -n 2 | tail -n 1 | cut -d: -f2 | cut -d" " -f 1)

# NAT fuer HTTP
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.2
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 80 -j SNAT --to-source $LAN_IP
iptables -A FORWARD -i eth1 -m state --state NEW -p tcp -d 192.168.2.2 --dport 80 -j ACCEPT
# NAT fuer ssh
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 22 -j DNAT --to-destination 192.168.1.99
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 22 -j SNAT --to-source $LAN_IP
iptables -A FORWARD -i eth1 -m state --state NEW -p tcp -d 192.168.1.99 --dport 22 -j ACCEPT


# NAT fuer HTTPS
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j DNAT --to-destination 192.168.2.2
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 443 -j SNAT --to-source $LAN_IP
iptables -A FORWARD -i eth1 -m state --state NEW -p tcp -d 192.168.2.2 --dport 443 -j ACCEPT

# NAT fuer SMTP
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 25 -j DNAT --to-destination 192.168.2.2
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 25 -j SNAT --to-source $LAN_IP
iptables -A FORWARD -i eth1 -m state --state NEW -p tcp -d 192.168.2.2 --dport 25 -j ACCEPT

# NAT fuer POP3
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 110 -j DNAT --to-destination 192.168.2.2
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 110 -j SNAT --to-source $LAN_IP
iptables -A FORWARD -i eth1 -m state --state NEW -p tcp -d 192.168.2.2 --dport 110 -j ACCEPT

# NAT fuer POP3S
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 995 -j DNAT --to-destination 192.168.2.2
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 995 -j SNAT --to-source $LAN_IP
iptables -A FORWARD -i eth1 -m state --state NEW -p tcp -d 192.168.2.2 --dport 995 -j ACCEPT

# NAT fuer IMAP
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 143 -j DNAT --to-destination 192.168.2.2
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 143 -j SNAT --to-source $LAN_IP
iptables -A FORWARD -i eth1 -m state --state NEW -p tcp -d 192.168.2.2 --dport 143 -j ACCEPT

# NAT fuer IMAPS
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 993 -j DNAT --to-destination 192.168.2.2
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 993 -j SNAT --to-source $LAN_IP
iptables -A FORWARD -i eth1 -m state --state NEW -p tcp -d 192.168.2.2 --dport 993 -j ACCEPT

# NAT fuer FTP
modprobe ip_nat_ftp
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 21 -j DNAT --to-destination 192.168.2.2
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 21 -j SNAT --to-source $LAN_IP
iptables -A FORWARD -i eth1 -m state --state NEW -p tcp -d 192.168.2.2 --dport 21 -j ACCEPT


# LAN-Zugriff auf eth0
iptables -A INPUT -m state --state NEW -i eth0 -j ACCEPT

# Default-Policies mit REJECT
iptables -A INPUT -j MY_REJECT
iptables -A OUTPUT -j MY_REJECT
iptables -A FORWARD -j MY_REJECT

# Routing
echo 1 > /proc/sys/net/ipv4/ip_forward 2> /dev/null

# Masquerading
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

# SYN-Cookies
echo 1 > /proc/sys/net/ipv4/tcp_syncookies 2> /dev/null

# Stop Source-Routing
for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/accept_source_route 2> /dev/null; done

# Stop Redirecting
for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/accept_redirects 2> /dev/null; done

# Reverse-Path-Filter
for i in /proc/sys/net/ipv4/conf/*; do echo 2 > $i/rp_filter 2> /dev/null; done

# Log Martians
for i in /proc/sys/net/ipv4/conf/*; do echo 1 > $i/log_martians 2> /dev/null; done

# BOOTP-Relaying ausschalten
for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/bootp_relay 2> /dev/null; done

# Proxy-ARP ausschalten
for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/proxy_arp 2> /dev/null; done

# Ungültige ICMP-Antworten ignorieren
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses 2> /dev/null

# ICMP Echo-Broadcasts ignorieren
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 2> /dev/null

# Max. 500/Sekunde (5/Jiffie) senden
echo 5 > /proc/sys/net/ipv4/icmp_ratelimit

# Speicherallozierung und -timing für IP-De/-Fragmentierung
echo 262144 > /proc/sys/net/ipv4/ipfrag_high_thresh
echo 196608 > /proc/sys/net/ipv4/ipfrag_low_thresh
echo 30 > /proc/sys/net/ipv4/ipfrag_time

# TCP-FIN-Timeout zum Schutz vor DoS-Attacken setzen
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

# Maximal 3 Antworten auf ein TCP-SYN
echo 3 > /proc/sys/net/ipv4/tcp_retries1

# TCP-Pakete maximal 15x wiederholen
echo 15 > /proc/sys/net/ipv4/tcp_retries2

;;

stop)
echo "Stoppe IP-Paketfilter"
# Tabelle flushen
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
echo "Deaktiviere IP-Routing"
echo 0 > /proc/sys/net/ipv4/ip_forward

# Default-Policies setzen
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
;;

status)
echo "Tabelle filter"
iptables -L -vn
echo "Tabelle nat"
iptables -t nat -L -vn
echo "Tabelle mangle"
iptables -t mangle -L -vn
;;

*)
echo "Fehlerhafter Aufruf"
echo "Syntax: $0 {start|stop|status}"
exit 1
;;

esac


sorry für copy and paste :-)

Auf meinem Router hab ich 3 Interfaces.
eth0 -> internes Netz
eth1 -> öffentliche IP -> unser internetzugang
eth2 -> direkte verbindung (cross over) zu web/mail/ftp server

Mein Problem:
Vom internen Netz kommen wir nicht mehr auf unsere Domain die wir selbst hosten. Woran liegt das? Wie kann ich das ändern?
Von aussen ist sie erreichbar.

Viele Grüsse,
Matthias

L00NIX
30.04.04, 07:51
Hallo.

Die einzige Zeile, die sich mit eth0 befasst:



...
iptables -A INPUT -m state --state NEW -i eth0 -j ACCEPT
...


Da aber von eth0 nach eth1 geroutet werden muss, wären die Regeln


iptables -A FORWARD -i eth0 -o eth2 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT


auch nicht schlecht.


Außerdem sind alle Dienste des Web/Mail/FTP-Servers aus dem Internet erreichbar. Ist ja auch sinnvoll, wenn man seine Mails von zu Hause aus lesen können soll.

debian-climber
30.04.04, 08:14
Hi,

habs jetzt selbst rausbekommen :-)...
das hier war drin


iptables -t nat -A PREROUTING -i eth1 -p tcp -d 194.120.12.243 --dport 80 -jDNAT --to 192.168.2.2

und das hier musste noch rein


iptables -t nat -A PREROUTING -i eth0 -p tcp -d 194.120.12.243 --dport 80 -jDNAT --to 192.168.2.2

Wir von intern kommen ja vom internen Interface (eth0)
Klar, die Dienste sollen/müssen von aussen erreichbar sein -> das ist schon so geplant :-).

Viele Grüsse,
Matthias