• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

2 mal Bridge und Iptables

Beppo

Member
Hallo zusammen,

ich könnte etwas Unterstützung gebrauchen, bei meinem Versuch über 4 Netzwerkinterfaces mit iptables zu filtern.

Ich habe folgenden Aufbau Server:

eth0 <-- LAN
|----br0 192.168.12.0/24
tap0 <-- VPN

ath0 <-- WLAN
|----br1 192.168.11.0/24
eth1 <-- WLAN über AP direkt per Kabel angeschlossen

Ich wollte erreichen, dass man sich per WLAN anmelden kann und durch den Server ins Internet geroutet wird. Das läuft auch, der Server maskiert
die Anfragen aus dem WLAN und routet die WLAN-Klienten über meinen eigentlichen Router ins Internet. Da für die WLAN Teilnehmer die selben Richtlinien gelten wie für den Server, ist das weites gehend OK.
Um jetzt als WLAN Klient ins lokale Netz zu kommen kann man sich per VPN mit dem Server verbinden und wird dann getunnelt.
Für mich die einzige Lösung um das WLAN vom LAN zu lösen, jedenfalls halbwegs.
Da ich dem MAC Filter nicht an zwei Stellen pflegen will, also auf dem AP und unter hostap, dachte ich mir das kann ja auch iptables für mich machen und wo wir gerade dabei sind auch noch etwas mehr filtern ;-)
Aber was ich auch angestellt habe, mein Regelwerk funzt überhaupt nicht.
Code:
#!/bin/bash

TAP=tap0
I2_IF=eth0                                      # Tap Device
I_IF=br0                                        # internes interface (lokales/privates Netz)
E_IF=br1                                        # externes interface (WLAN  Netz)
E_WLAN_3OG_IF=eth1                              # externes interface (WLAN Netz 3 OG)
I_IP=192.168.12.200                             # IP-Adresse an I_IF
E_IP=192.168.11.1                               # IP-Adresse an E_IF
LOC_IP=192.168.12.0/24                          # lokale Subnetz
WLAN_IP=192.168.11.0/24                         # wlan Subnetz
E_WLAN_IF=ath0                                  # externes interface (WLAN Netz)
VPN_SERVER_IP=192.168.12.200                    # IP-Adresse VPN_SERVER_IP
route del -net $WLAN_IP gw $E_IP                # Route löschen falls vorhanden
route add -net $WLAN_IP gw $E_IP                # Route hinzufügen

IPTABLES=/usr/sbin/iptables

# Module laden
/sbin/modprobe ip_tables
/sbin/modprobe iptable_filter
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ipt_state
/sbin/modprobe ipt_LOG
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ipt_mac

# alle chains entleeren
# filter

$IPTABLES -F
# nat
$IPTABLES -t nat -F
# mangle
$IPTABLES -t mangle -F

# Drop Chain "KICKIT" loeschen und neu aufbauen
$IPTABLES -X KICKIT
$IPTABLES -N KICKIT

# Drop Chain loeschen und neu aufbauen
$IPTABLES -X WLAN
$IPTABLES -X MACFILTER
$IPTABLES -X MACFILTER_3OG
$IPTABLES -X WLANVPNROUTING

$IPTABLES -N WLAN
$IPTABLES -N MACFILTER
$IPTABLES -N MACFILTER_3OG
#$IPTABLES -N WLANVPNROUTING

$IPTABLES -F WLAN
$IPTABLES -F MACFILTER
$IPTABLES -F MACFILTER_3OG
#$IPTABLES -F WLANVPNROUTING

# Richtlinien (policies) setzen
# filter
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
# nat
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
# mangle
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT


#Forwarding aktivieren
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "0" > /proc/sys/net/ipv4/ip_dynaddr
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

#DHCP an eth1 und ath0 
$IPTABLES -A INPUT -m physdev --physdev-in $E_WLAN_IF -p UDP --destination-port 67:68 --source-port 67:68 -j ACCEPT
$IPTABLES -A INPUT -m physdev --physdev-in $E_WLAN_3OG_IF -p UDP --destination-port 67:68 --source-port 67:68 -j ACCEPT

#Umleiten EG
$IPTABLES -A FORWARD -m physdev --physdev-in $E_WLAN_IF -j MACFILTER
$IPTABLES -A INPUT -m physdev --physdev-in $E_WLAN_IF -j MACFILTER

#Umleiten  3 OG
$IPTABLES -A FORWARD -m physdev --physdev-in $E_WLAN_3OG_IF -j MACFILTER_3OG
$IPTABLES -A INPUT -m physdev --physdev-in $E_WLAN_3OG_IF -j MACFILTER_3OG

#Openvpn
$IPTABLES -A INPUT -m physdev --physdev-in $E_WLAN_3OG_IF -p udp -m udp --dport 1194 -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -m physdev --physdev-in $E_WLAN_3OG_IF -d $VPN_SERVER_IP -p udp -m udp --dport 1194 -j ACCEPT

$IPTABLES -A INPUT -m physdev --physdev-in $E_WLAN_IF -p udp -m udp --dport 1194 -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -m physdev --physdev-in $E_WLAN_IF -d $VPN_SERVER_IP -p udp -m udp --dport 1194 -j ACCEPT

# LAN und VPN erlauben
$IPTABLES -A INPUT -m physdev --physdev-in $I2_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m physdev --physdev-in $I2_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A INPUT -m physdev --physdev-in $TAP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m physdev --physdev-in $TAP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#Loggen von
$IPTABLES -A INPUT -i $E_IF -j LOG
$IPTABLES -A OUTPUT -o $E_IF -j LOG
$IPTABLES -A FORWARD -i $E_IF -j LOG

# Loopback-Device aktivieren
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# NAT/Masquerading aktivieren
$IPTABLES -t nat -A POSTROUTING -o $I_IF -j MASQUERADE

# MAC-Filter an ath0 für WPA WLAN
let ANZAHL_mac=$(grep ^mac /etc/firewall/mac_wlan | wc -l | tr -d " ")
echo $ANZAHL_mac

# Schleife x mal Durchlaufen, fuer alle moegliche IP's in /etc/firewall/ips_wlan

for ((I_mac=1; $I_mac <= $ANZAHL_mac; I_mac++)) ; do
        # DNS-IP's ermitteln
WLANMAC=$(grep ^mac /etc/firewall/mac_wlan | head -n $I_mac | tail -n 1 | cut -d " " -f 2)

# IP's fürs WLAN in die chains schreiben
$IPTABLES -A MACFILTER -m mac --mac-source $WLANMAC -j WLAN
echo "MAC $WLANMAC von EG erlaubt!"
# Schleifenabbruch
        if [ $I_mac -eq $ANZAHL_mac ] ; then
      break
    fi
done

$IPTABLES -A MACFILTER -j LOG --log-prefix "MAC gefiltert EG"
$IPTABLES -A MACFILTER -j KICKIT

# MAC-Filter an eth1 für WPA WLAN
let ANZAHL_mac_3OG=$(grep ^mac /etc/firewall/mac_wlan | wc -l | tr -d " ")
echo $ANZAHL_mac_3OG

# Schleife x mal Durchlaufen, fuer alle moegliche IP's in /etc/firewall/ips_wlan

for ((I_mac_3OG=1; $I_mac_3OG <= $ANZAHL_mac_3OG; I_mac_3OG++)) ; do
        # DNS-IP's ermitteln
WLANMAC_3OG=$(grep ^mac /etc/firewall/mac_wlan | head -n $I_mac_3OG | tail -n 1 | cut -d " " -f 2)

# IP's fürs WLAN in die chains schreiben
$IPTABLES -A MACFILTER_3OG -m mac --mac-source $WLANMAC_3OG -j WLAN
echo "MAC $WLANMAC_3OG von 3.OG erlaubt!"
# Schleifenabbruch
        if [ $I_mac_3OG -eq $ANZAHL_mac_3OG ] ; then
      break
    fi
done

$IPTABLES -A MACFILTER_3OG -j LOG --log-prefix "MAC gefiltert 3. OG"
$IPTABLES -A MACFILTER_3OG -j KICKIT

#Platz für weitere Filterregeln
$IPTABLES -A WLAN -j ACCEPT


$IPTABLES -A INPUT -m physdev --physdev-in $E_IF --physdev-out $I2_IF -s $WLAN_IP -d ! $LOC_IP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m physdev --physdev-in $E_IF --physdev-out $I2_IF -s $WLAN_IP -d ! $LOC_IP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -m physdev --physdev-in $E_WLAN_3OG_IF --physdev-out $I2_IF -s $WLAN_IP -d ! $LOC_IP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m physdev --physdev-in $E_WLAN_3OG_IF --physdev-out $I2_IF -s $WLAN_IP -d ! $LOC_IP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -m physdev --physdev-in $E_WLAN_IF --physdev-out $I2_IF -s $WLAN_IP -d ! $LOC_IP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m physdev --physdev-in $E_WLAN_IF --physdev-out $I2_IF -s $WLAN_IP -d ! $LOC_IP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


# Openvpn-Routing
$IPTABLES -t nat -A PREROUTING -m physdev --physdev-in $E_WLAN_IF -d $E_IP -p udp -m udp --dport 1194 -j DNAT --to-destination 192.168.12.200
$IPTABLES -t nat -A PREROUTING -m physdev --physdev-in $E_WLAN_3OG_IF -d $E_IP -p udp -m udp --dport 1194 -j DNAT --to-destination 192.168.12.200

$IPTABLES -A KICKIT -j DROP

Vielleicht hat ja jemand mehr Erfahrung damit und kann mir sagen wo der Fehler liegt oder ob es überhaupt geht.
Danke!

Grüße Beppo
 
OP
B

Beppo

Member
Hmm,

hat keiner nen Schimmer wieso die Filter nicht funktionieren?
Die Regeln werden sauber gesetzt aber greifen nicht...

Stören sich vielleicht Module ?

Grüße Beppo
 

TomcatMJ

Guru
Das dürfte daran liegen,daß für Bridge-Interfaces nicht iptables allein sondern hauptsächlich ebtables zuständig ist ;-)
Allerdings kann man durchaus auch beides kombinieren....(z.B. durch Paketweiterreichung im Userpace)

Bis denne,
Tom
P.S.:In deinem Fall würde ich für die Filertung innerhalb der einzelnen br-Interfaces ebtables nutzen und für die Filterung zwischen beiden br-Interfaces dann iptables...
 
-m physdev hat nur Effekt, wenn das Paket auch wirklich durch ein br* reingekommen ist. Am besten du reduzierst deine Regeln soweit bis der Fehler erkennbar wird. (Oder umgekehrt: starte mit einem leeren Ruleset und bau es Regel-per-Regel auf, und schau, ob jede Regel das tut was sie soll.)
 
OP
B

Beppo

Member
Ich denke ich weiß wo die Pakete verloren gehen,
im MACFILTER_3OG...
Obwohl die Regeln stimmen, laufen sie sofort durch und landen in der
Chain "KICKIT" und werden dort dann verworfen.
Nur wenn die sie da nicht verwerfen lasse kommt die Verbindung zustande.

Ich versuche mal auf ebtables um zustellen und berichte dann...

Danke!

Grüße Beppo
 
OP
B

Beppo

Member
Ich wollte nen MAC Filter mit ein paar zusätzlichen Regeln aufsetzten, um zwei AP vom internen Netz ab zuschotten.
Das ist doch dann Layer 2 oder hab ich nen Denkfehler drin?
 
Oben