ubuntuusers.de

Mac Filter per iptables

Status: Gelöst | Ubuntu-Version: Ubuntu 7.04 (Feisty Fawn)
Antworten |

WolfgangVogl

Anmeldungsdatum:
13. Juni 2007

Beiträge: 85

Hallo, hier kurz mein Vorhaben:
Ich hab einen Linux rechner mit Feisty (Server) der die DSL Einwahl realisiert, d.h. er hängt an einem Modem und wählt fleißig.
Die Internetverbindung soll mehreren Rechnern im Netzwerk zur Verfügung stehen, funktioniert über masquerade in den iptables auch wunderbar...
ABER es gibt natürlich auch Rechner im lokalen Netzwerk die eben nicht auf meinen Internetzugang rauf dürfen (die Anzahl der erlaubten Rechner ist begrenzt, d.h. also ich würde gerne ALLE _nicht_ ins Internet lassen und eben für diejenigen die dürfen Ausnahmen definieren.)

Meine derzeitige iptables konfiguration macht eben erstmal ein großes Scheunentor auf (damit auch ja alles funktioniert ☺)

###################################################################################################
# Loeschen aller Regeln
iptables -F
#--------------------------------------------------------------------------------------------------

###################################################################################################
# Standardpolicys
#------------------------------------------------
# [INPUT CHAIN] : DROP | ACCEPT | REJECT
iptables -P INPUT ACCEPT
#------------------------------------------------
# [OUTPUT CHAIN]
iptables -P OUTPUT ACCEPT
#------------------------------------------------
# [FORWARD CHAIN]
iptables -P FORWARD ACCEPT
#--------------------------------------------------------------------------------------------------

###################################################################################################
# NAT
#------------------------------------------------
# Daten des lokalen Netzes ins Internet schieben und maskieren
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
#--------------------------------------------------------------------------------------------------

###################################################################################################
# Interne Verbindungen
#------------------------------------------------
# Localhost ein- und ausgehend (UNBEDINGT)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#--------------------------------------------------------------------------------------------------

###################################################################################################
# Eigene Definitionen
#------------------------------------------------
# SSH ???
#iptables -A OUTPUT -o eth0  -sport 22 ACCEPT
#iptables -A INPUT -o eth0 -dport 22 ACCEPT
#--------------------------------------------------------------------------------------------------

###################################################################################################
# Fuer existierende Verbindungen eingehende Verbindungen akzeptieren
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
#--------------------------------------------------------------------------------------------------

exit 0

Kann mir jemand sagen wie ich ansetzen muss um nun die Macs die ins Internet dürfen zu filtern?
Eth0 ist die Netzwerkkarte welche mit dem DSL Modem verbunden ist,
Eth1 die Netzwerkkarte die den Server ins interne Netzwerk hängt,
ppp0 ist die aufgebaute Internetverbindung..

Ich hab diese IPTable definition eben mühsam zusammengeschraubt und auch halbswegs verstanden was es jetzt tut... aber so 100%ig sicher wie ich für die mac ansetzen soll bin ich mir nicht.

Danke schonmal,
Gruß Wolfgang

scriper

Avatar von scriper

Anmeldungsdatum:
29. März 2006

Beiträge: 395

Wohnort: Puderbach

Ging das nicht vielleicht mit einem Proxy-Server wie Squid einfacher?

WolfgangVogl

(Themenstarter)

Anmeldungsdatum:
13. Juni 2007

Beiträge: 85

Einfacher auf den ersten Blick ja, aber der Internetzugang hört ja nicht bei so sachen wie der squid überwacht auf, soweit ich weiß kann Squid ja gradmal http, https, gopher und ftp... das reicht einfach nicht.
Und zusätzlich ist es wenns mal funktioniert mit den iptables sicher elegant gelöst, den squid werd ich allerdings über kurz oder lang auch noch aufsetzen da ja auch mehr kontrolle so möglich ist.

jdw

Anmeldungsdatum:
1. Juni 2006

Beiträge: 45

Wohnort: Detmold

Morgen,

schau mal hier rein, das sollte dir weiterhelfen:

http://www.netfilter.org/documentation/HOWTO/de/packet-filtering-HOWTO-7.html

mac

Dieses Modul muss explizit mit der '-m mac' oder '--match-mac' Option bestimmt werden. Es wird verwendet, um auf die MAC-Adresse einkommender Pakete zuzutreffen, und ist somit nur nuetzlich fuer Pakete, die die PREROUTING und die INPUT-Kette durchlaufen.

  • -mac-source

Gefolgt von einem optionalen '!', dann eine Netzwerkadresse in durch Doppelpunkte getrennter Hex-Notation, zum Beispiel '--mac-source 00:60:08:91:CC:B7'.

Gruß Daniel

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: 2533

Wohnort: Dresden

Berücksichtigst Du auch die Tatsache, dass man MAC-Adressen jederzeit ersniffen und ändern kann? Insofern ist es egal, ob Du nach IP oder MAC Adressen filterst.

WolfgangVogl

(Themenstarter)

Anmeldungsdatum:
13. Juni 2007

Beiträge: 85

comm@nder, natürlich ist dies zusätzlich ein Risiko.. allerdings ist es schonmal einen Schritt weiter als einfach mal alle reinzulassen - oder?
Zusätzlich gehe ich eigentlich nicht von der bösen Absicht in dem Netzwerk aus... es soll halt kein offenes Tor sein.

Per IP war die erste Idee... allerdings hat in dem Netzwerk so ein Spaten einen DHCP Laufen der wild ip Adressen verteilt und somit immer einer geordneten zuordnung dazwischenfunkt... zusätzlich kommt man über die vom "wilden" dhcp daten verteilen Daten auch ins Internet.. allerdings nur über eine sehr langsame Vodafone box und ich hab auch kein Recht in dem Sinne deren internetverbindung zu nutzen.. er sichert sie halt nicht. Ich hab in dem Netzwerk einen DSL 6000er Anschluss und möchte natürlich den benutzen.

Danke jdw, ich werd mir das gleich mal durchlesen!

Gruß Wolfgang

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: 2533

Wohnort: Dresden

WolfgangVogl hat geschrieben:

comm@nder, natürlich ist dies zusätzlich ein Risiko.. allerdings ist es schonmal einen Schritt weiter als einfach mal alle reinzulassen - oder?
Zusätzlich gehe ich eigentlich nicht von der bösen Absicht in dem Netzwerk aus... es soll halt kein offenes Tor sein.

Kann man sich drüber streiten, ob ein Blatt Papier vor einem Loch in einer Mauer wirklich ein Sicherehitsgewinn ist, das hängt im wesentlichen davon ab, warum Du den Zugriff beschränkst.
Es wird Dir meines Erachtens mehr Ärger als Sicherheitsgewinn bringen.

WolfgangVogl

(Themenstarter)

Anmeldungsdatum:
13. Juni 2007

Beiträge: 85

Naja es ist meiner Meinung nach schon ein unterschied ob man zur fremdnutzung des Internetanschlusses eingeladen wird oder ob ob man dafür eine Mac sniffen muss etc.
...
So würde ich jetzt meine iptables anpassen:

###################################################################################################
# Loeschen aller Regeln
iptables -F
#--------------------------------------------------------------------------------------------------

###################################################################################################
# Standardpolicys
#------------------------------------------------
# [INPUT CHAIN] : DROP | ACCEPT | REJECT
iptables -P INPUT ACCEPT
#------------------------------------------------
# [OUTPUT CHAIN]
iptables -P OUTPUT ACCEPT
#------------------------------------------------
# [FORWARD CHAIN]
iptables -P FORWARD ACCEPT
#------------------------------------------------
# [PREROUTING CHAIN]
iptables -P PREROUTING DROP
#--------------------------------------------------------------------------------------------------

###################################################################################################
# NAT
#------------------------------------------------
# Daten des lokalen Netzes ins Internet schieben und maskieren
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
#--------------------------------------------------------------------------------------------------

###################################################################################################
# Interne Verbindungen
#------------------------------------------------
# Localhost ein- und ausgehend (UNBEDINGT)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#--------------------------------------------------------------------------------------------------

###################################################################################################
# Eigene Definitionen
#------------------------------------------------
# SSH
#iptables -A OUTPUT -o eth0  -sport 22 -j ACCEPT
#iptables -A INPUT -o eth0 -dport 22 -j ACCEPT
#--------------------------------------------------------------------------------------------------

###################################################################################################
# Fuer existierende Verbindungen eingehende Verbindungen akzeptieren
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
#--------------------------------------------------------------------------------------------------

###################################################################################################
# Mac Filter
#------------------------------------------------
# Intern darf immer raus!
iptables -t nat -A PREROUTING -i lo -j ACCEPT
#------------------------------------------------
# Routing innerhalb des internen Netzwerkes erlauben
iptables -t nat -A PREROUING -i eth1 -o eth1 -j ACCEPT
#------------------------------------------------
# MAC ... darf raus!
iptables -t nat -A PREROUTING -i eth1 -o eth0 -match-mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT
#--------------------------------------------------------------------------------------------------

exit 0

Sieht ja jemand gravierende Probleme, also hab ich was grundlegends falsch gemacht?
Werd das erst heute Abend ausprobieren wenn ich lokal an den Rechner ran kann... 😉

Achja, hier nochmal die Netzwerkübersicht:

eth0    (Direkt mit DSL Modem verbunden) Link encap:Ethernet
eth1    (Verbindung ins interne Netzwerk) Link encap:Ethernet
lo        Link encap:Local Loopback
ppp0    (Die Internetverbindung) Link encap:Point-to-Point Protocol

otzenpunk Team-Icon

Avatar von otzenpunk

Anmeldungsdatum:
17. Oktober 2005

Beiträge: 8691

Wohnort: Hamburg-Altona

Die Option heißt -m mac oder --match mac, (mit Leerzeichen dazwischen, weil mac einfach nur das Argument der match-Funktion ist,) nicht -match-mac.

WolfgangVogl

(Themenstarter)

Anmeldungsdatum:
13. Juni 2007

Beiträge: 85

Dankeschön, das war/ist allerdings das kleinste Problem bei der Config gewesen. Ich habe den mac Filter mittlerweile am Laufen... aber das Ganze sieht nun völlig anders aus.
Also bitte keiner den Schrott was ich gepostet hab übernehmen, das wird bös ins Auge gehn. 😀

otzenpunk Team-Icon

Avatar von otzenpunk

Anmeldungsdatum:
17. Oktober 2005

Beiträge: 8691

Wohnort: Hamburg-Altona

WolfgangVogl hat geschrieben:

Ich habe den mac Filter mittlerweile am Laufen... aber das Ganze sieht nun völlig anders aus.

Vielleicht möchtest du uns an deiner richtigen Lösung teilhaben lassen?

WolfgangVogl

(Themenstarter)

Anmeldungsdatum:
13. Juni 2007

Beiträge: 85

Hihi, selbstverfreilich... aber jetzt noch nicht.
Dafür sind meine iptables noch viel zu chaotisch und machen Sachen die so nicht passen... habe aber fest vor das noch sauber und ordentlich zusammenzufassen, dann kommt entweder hier das saubere Script oder ich mach es in das Wiki rein.
Wenn einer natürlich den bisherigen Pfusch für sich selbst sehen will geb ich ihm die Datei gerne - möchte sie nur so jetzt nicht posten damit nicht jemand auf die Idee kommt das würde sauber laufen.

Haenschen

Anmeldungsdatum:
26. Oktober 2006

Beiträge: 51

WolfgangVogl hat geschrieben:

Sieht ja jemand gravierende Probleme, also hab ich was grundlegends falsch gemacht?

Jepps, mehreres 😉

1. Die Policies

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT 

Das bedeutet - wenn es keine Regel gibt die matched ist alles in jede Richtung erlaubt.
Zumindest INPUT und FORWARD solltest du auf DROP setzen (und eine REJECT-Regel kombiniert mit limit (oder recent, je nach RAM) als letztes einrichten).
Der Ansatz sollte andersrum sein - alles, was nicht explizit erlaubt ist, sollte verboten sein.

2.

iptables -P PREROUTING DROP 


Diese Regel macht nichts, da es in PREROUTING keine Filter-Table gibt (in PREROUTING gibts nur mangle und nat).

3.

# Mac Filter
#------------------------------------------------
# Intern darf immer raus!
iptables -t nat -A PREROUTING -i lo -j ACCEPT
#------------------------------------------------
# Routing innerhalb des internen Netzwerkes erlauben
iptables -t nat -A PREROUING -i eth1 -o eth1 -j ACCEPT
#------------------------------------------------
# MAC ... darf raus!
iptables -t nat -A PREROUTING -i eth1 -o eth0 -match-mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT 

Auch hier - falsche Chain (und teilweise sinnbefreite Regeln, zB -i und -o können niemals-nicht gleich sein).
In der NAT-Table kannst du keinen Verkehr erlauben oder verbieten.
Dein Script macht nur eines - es maskiert den Traffic, der auf ppp0 rausgeht (übrigens die einzige Regel, die du so wohl absichtlich gesetzt hast und das macht, was du willst 😉), ansonsten erlaubt es *alles*, und zwar durch die Policy.

Achja, hier nochmal die Netzwerkübersicht:

eth0    (Direkt mit DSL Modem verbunden) Link encap:Ethernet
eth1    (Verbindung ins interne Netzwerk) Link encap:Ethernet
lo        Link encap:Local Loopback
ppp0    (Die Internetverbindung) Link encap:Point-to-Point Protocol

Ausgehend davon, und mit Hilfe meiner Kristallkugel versuche ich dein Vorhaben mal in ein Ruleset zu gießen (aus der freien Hand):

#! /bin/sh

# Variablendekleration

IPT='/sbin/iptables'
LAN=eth1
MODEM=eth0
INET=ppp0


# Flush (alle Regeln in allen Chains loeschen)
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F

# Loeschen (Chains selbst loeschen)
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# Policies (alles was vom Host selbst raus will darf raus, alles was rein will und nicht explizit erlaubt ist wird weggeworfen)
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

# selbst aufgebaute erlauben
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Invalid Pakete Droppen (immer ne gute Regel ;))
$IPT -N INVALID

$IPT -A INVALID -m limit --limit 3/s -j LOG --log-prefix "INVALID "
$IPT -A INVALID -j DROP

$IPT -A INPUT -m state --state INVALID -j INVALID
$IPT -A FORWARD -m state --state INVALID -j INVALID
$IPT -A OUTPUT -m state --state INVALID -j INVALID

# lo erlauben
$IPT -A INPUT -i lo -j LOIN

#127/8 von anderen IF wegschmeissen
$IPT -A INPUT -i ! lo -s 127.0.0.0/8 -j DROP
$IPT -A FORWARD -i ! lo -s 127.0.0.0/8 -j DROP

# Masquerade zum INET einschalten
$IPT -t nat -A POSTROUTING -o $INET -j MASQUERADE

# Die eine mac-adresse erlauben, rest rejecten
$IPT -A INPUT -i $LAN -o $INET -m mac --mac-source  x -j ACCEPT
$IPT -A FORWARD -i $LAN -o $INET -m mac --mac-source x -j ACCEPT

# Rest loggen, dann rejecten
$IPT -A INPUT -i $LAN -m limit --limit 3/s -j LOG --log-prefix "LAN-IN "
$IPT -A FORWARD -i $LAN -m limit --limit 3/s -j LOG --log-prefix "LAN-IN "

$IPT -A INPUT -i $LAN -p tcp -j REJECT --reject-with tcp-reset
$IPT -A FORWARD -i $LAN -p tcp -j REJECT --reject-with tcp-reset
$IPT -A INPUT -i $LAN -p ! tcp -j REJECT --reject-with icmp-admin-prohibited
$IPT -A FORWARD -i $LAN -p ! tcp -j REJECT --reject-with icmp-admin-prohibited

# globale Logregel (alles was hier ankommt plumpst in die default-Policy und wird weggeworfen)
$IPT -A INPUT -m limit --limit 3/s -j LOG --log-prefix "INPUT " 
$IPT -A FORWARD -m limit --limit 3/s -j LOG --log-prefix "FORWARD "

otzenpunk Team-Icon

Avatar von otzenpunk

Anmeldungsdatum:
17. Oktober 2005

Beiträge: 8691

Wohnort: Hamburg-Altona

Haenschen hat geschrieben:

# lo erlauben
$IPT -A INPUT -i lo -j LOIN

Die Kette LOIN wird nirgendwo definiert. ❓

Haenschen

Anmeldungsdatum:
26. Oktober 2006

Beiträge: 51

otzenpunk hat geschrieben:

Haenschen hat geschrieben:

# lo erlauben
$IPT -A INPUT -i lo -j LOIN

Die Kette LOIN wird nirgendwo definiert. ❓

Ups, mein Fehler. Wollte edas Ruleset erst etwas umfangreicher gestalten und für jedes If auch eine Chain einrichten, habs dann aber gelassen (FORWARD geht schnlecht bei lo, und OUTPUT wäre implizit durch die Policy).

Ich änder das Ziel eben in ACCEPT um (wie gesagt - kam so aus der freien Hand 😉).

EDIT:
Hmm, irgendwie kann ich den Beitrag nicht bearbeiten ☹

Richtig wäre jedenfalls

$IPT -A INPUT -i lo -j ACCEPT 
Antworten |