PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sicheres Nat mit Iptables



Ohr4u|tux
05.09.05, 16:42
Hi,

ich habe Nat für mein Lan mit Iptables gelöst:


iptables -t nat -A POSTROUTING --source 192.168.0.1/255.255.255.0 -o ppp0 -j MASQUERADE

Wie kann ich den Abschnitt "--source 192.168.0.1/255.255.255.0" auf ein Interface beziehen (z.B. eth0)?
Da ich ich mehrere Lans habe ist es möglich das man einfach in einem anderen Lan eine IP aus dem Netz eines anderen nimmt und eine Subnetmask von 255.255.0.0.

Jemand im 2. Lan nimmt einfach die IP 192.168.0.10/255.255.0.0, obwohl der Router in dem Lan die IP 192.168.1.1 hat. Jetzt kann er trotzdem auf Nat zugreifen.

Wie stelle es an als Quelle nur eth0 zu erlauben?

Danke :-)

Ohr4u|tux
05.09.05, 18:09
...-s eth0 funktioniert leider nicht. Leider findet google auch nichts dazu :(

Windoofsklicker
05.09.05, 19:18
Jemand im 2. Lan nimmt einfach die IP 192.168.0.10/255.255.0.0, obwohl der Router in dem Lan die IP 192.168.1.1 hat. Jetzt kann er trotzdem auf Nat zugreifen.

Wenn auf deinem Router die Subnetzmasken richtig eingestellt sind, dürfte das nicht funktionieren, da die Antworten an diesen Rechner dann auf das "richtige" also andere Interface geroutet werden müssten.

Ansonsten:

iptables -t nat -A POSTROUTING -o ppp0 -i eth0 -j MASQUERADE

Ohr4u|tux
05.09.05, 21:10
iptables v1.2.11: Can't use -i with POSTROUTING

Try `iptables -h' or 'iptables --help' for more information.


Ging leider nicht :(.


Gibt es noch eine andere Möglichkeit?

klemens
05.09.05, 21:47
Machs über die FORWARD - Kette, da sollte es mit -i eth0 klappen.

Ohr4u|tux
05.09.05, 22:08
Machs über die FORWARD - Kette, da sollte es mit -i eth0 klappen.

Wie müsste denn so eine Zeile aussehen?

klemens
05.09.05, 22:20
Wie müsste denn so eine Zeile aussehen?

Das kommt drauf an, was nachher alles sonst funktionieren soll ;-)

iptables -P FORWARD DROP
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -A FORWARD -o eth0 -j ACCEPT

__________________________________________________ ______
Kapier ich jetzt selber nicht
iptables -A FORWARD -i ! eth0 -j REJECT
ist in man iptables dokumentiert, ergibt aber bei mir mit iptables -L ein Ergebnis, dass das "!" ignoriert ???

Ohr4u|tux
05.09.05, 23:24
Das kommt drauf an, was nachher alles sonst funktionieren soll ;-)

iptables -P FORWARD DROP
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -A FORWARD -o eth0 -j ACCEPT

__________________________________________________ ______
Kapier ich jetzt selber nicht
iptables -A FORWARD -i ! eth0 -j REJECT
ist in man iptables dokumentiert, ergibt aber bei mir mit iptables -L ein Ergebnis, dass das "!" ignoriert ???

Ich habe schon sowas in der Richtung:


iptables -P FORWARD DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags FIN,RST FIN,RST -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,FIN FIN -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,PSH PSH -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,URG URG -j MY_DROP
iptables -A FORWARD -i ! ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -j MY_REJECT
iptables -P FORWARD ACCEPT

klemens
05.09.05, 23:35
iptables -P FORWARD ACCEPT (am Schluss)
damit öffnest aber die Forwardkette wieder, die in der ersten Zeile geschlossen wird ...


iptables -A FORWARD -i ! ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

hmm - Damit sind aber alle lokalen Netzwerkinterfaces offen - Ist es das, was Du wolltest?

--tcp-flags
Da bin ich jetzt nicht so fit, sorry; aber viel dürfte da nicht mehr übrigbleiben.


Dir gings doch darum, dass nur Pakete, die über eth0 in den Rechner kommen, geforwarded und genattet werden. - Das seh ich aber bei deinen Regeln nicht.
Du kannst auch für die anderen interfaces das FORWARDING regeln. Z.B., dass nur in die LANs geforwarded wird (falls das notwendig ist), aber nicht ins Internet. IMHO ist aber noch immer die FORWARD-Chain der richtige Ort.

Ohr4u|tux
06.09.05, 00:08
Hier ist mal mein komplettes Script:


#!/bin/bash
# ---------------------------------------------------------------------
# Linux-iptables-Firewallskript, Copyright (c) 2004 under the GPL
# Autogenerated by iptables Generator v1.17 (c) 2002 by Harald Bertram
# Please visit http://www.harry.homelinux.org for new versions of
# the iptables Generator (c).
#
# This Script was generated by request from:
# on: 2004-12-28 0:15.58 MET.
#
# If you have questions about the iptables Generator or about
# your Firewall-Skript feel free to take a look at out website or
# send me an E-Mail to webmaster@harry.homelinux.org.
#
# My special thanks are going to Lutz Heinrich (trinitywork@hotmail.com) who
# made lots of Beta-Testing and gave me lots of well qualified
# Feedback that made me able to improve the iptables Generator.
# --------------------------------------------------------------------

case "$1" in
start)
echo "Starte IP-Paketfilter"

# 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 -j REJECT --reject-with tcp-reset
iptables -A MY_REJECT -p udp -j REJECT --reject-with icmp-port-unreachable
iptables -A MY_REJECT -p icmp -j DROP
iptables -A MY_REJECT -j REJECT --reject-with icmp-proto-unreachable

# MY_DROP-Chain
iptables -N MY_DROP
iptables -A MY_DROP -j DROP

# 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

# Connection-Tracking aktivieren
iptables -A OUTPUT -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 -A FORWARD -i eth2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# LAN-Zugriff auf eth0
iptables -A INPUT -m state --state NEW -i eth2 -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 --source 192.168.0.1/255.255.255.0 -o ppp0 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o ppp0 -i eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING --source 192.168.1.5 -o ppp0 -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

# Ungltige 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 fr 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


Nat soll nur von eth2 (192.168.0.0), sowie einem pc von eth0 (192.168.1.5) aus möglich sein.

Habe die Zeile mit dem


iptables -A FORWARD -i ! ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

mal angepasst.

eth1 befindet sich in einem unsicheren Netz.

klemens
06.09.05, 00:49
iptables -t nat -A POSTROUTING --source 192.168.0.1/255.255.255.0 -o ppp0 -j MASQUERADE

192.168.0.1 ist eine Host-Adresse und keine Netzadresse ->
also:
entweder:
192.168.0.1/255.255.255.255 (Host)
oder
192.168.0.0/255.255.255.0? (Netz)

__________________________________________________ ___


# Masquerading
iptables -t nat -A POSTROUTING --source 192.168.0.1/255.255.255.0 -o ppp0 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o ppp0 -i eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING --source 192.168.1.5 -o ppp0 -j MASQUERADE

Das ist der Teil, der wohl zu ändern/ergänzen ist:

ich würde es so probieren (sorry, falls das jetzt nicht 100% ist - da muss man vielleicht noch dran schleifen)

#Mit Hilfe der Forwardregeln NAT regulieren. Durch connectiontracking s.o. braucht nur der ausgehende Verkehr beachtet werden.
#Forward verbieten
iptables -P FORWARD -j DROP
#NAT von eth2 erlauben:
iptables -A FORWARD -i eth2 -j ACCEPT
#NAT von eth0 für 192.168.1.5 erlauben - Anmerkung: Andere PC, die im selben Netz sind _und_ die IP 192.168.1.5 annehmen, könnten dann aber durch, soweit das entstehende Netzwerkchaos das nicht verhindert. Ev. könnte man das durch MAC-Filterung erschweren, aber verhindern ist IMHO so nicht möglich. Ev. ist es sinnvoll da eine Passwordidentifizierung mit einem Proxy einzubauen (squid?)... :
iptables -A FORWARD -i eth0 -s 192.168.1.5 -j ACCEPT

#Masquerading allgemein aktivieren - Verbote sollten vorher schon abgefangen sein.
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

(Tipp- und Denkfehler nicht ausgeschlossen)

Wenn eth1 ein unsicheres Netz ist, dann könnte man ev. für alle eingehenden Verbindungen eine eigene Chain bauen, die regelt und logged.

Irgendwo hab ich auch im Hinterkopf, dass man bei 192.168 das Netz 192.168.0.0 nicht verwenden soll - habs jetzt aber nicht parat - sorry, falls ich mich irre - ev. weiss da wer anderer was dazu ...

Ohr4u|tux
06.09.05, 11:14
iptables -P FORWARD -j DROP

Da het er gemeckert.


iptables v1.2.11: -P requires a chain and a policy Try `iptables -h' or 'iptables --help' for more information.

Ich habe dann einfach das -j weggelassen und es hat funktioniert.

Ohr4u|tux
06.09.05, 16:03
Wie könnte denn eine Regel zum loggen für eth1 aussehen?

klemens
06.09.05, 16:22
Wenn Du Dich näher mit iptables auseinandersetzen willst, schau doch auch nach
http://www.netfilter.org/documentation/HOWTO/de/packet-filtering-HOWTO.html
und man iptables ;-); bei netfilter.org bzw. über google findet man sicher auch eine Menge über die neueren Module.

iptables -A FORWARD -i eth1 -j LOG --log-prefix meingelogge --log-level [0-7]
Das gleiche auch für die anderen chains.

-j DROP: Mein Fehler, schlampig ;-)

cane
06.09.05, 20:54
Oder das sehr gute, frei erhältliche, Buch "Linux-Firewalls - ein praktischer Einstieg": http://www.oreilly.de/german/freebooks/linuxfireger/

Ist übrigens auch in der Linkliste dieses Unterforums enthalten ;)

mfg
cane