Routing über iptables

Routing über iptables

Ich habe diesen VPN-Client, der die Routing-Tabelle berührt und sie dann überwacht, um sie zu beenden, wenn sie berührt wird. Dies ist die Art von Setup, die für einen Endpunkt wie einen Laptop erforderlich ist.

Ich möchte einen kleinen PC als VPN-Endpunkt verwenden und über ihn das Routing für andere Maschinen in meinem LAN (192.168.0.0/24) durchführen.

Da ich die Routing-Tabelle nicht berühren kann und alle Pakete durch das VPN- tun0Gerät geleitet werden, dachte ich, iptableses könnte mir helfen, die Pakete per POSTROUTE an das Netzwerk 192.168.0.0 zurück zum eth1Gerät zu schicken.

Ich bin mir jedoch nicht sicher, wie dies funktionieren soll, denn sobald es beendet wird, eth1sollte es IPtoMAC auflösen, da es sich bereits im Zielnetzwerk befindet, und ich weiß nicht, ob das Paket bereits aufgelöst wurde oder ob dies erst geschieht, wenn es das Iface erreicht.

Irgendwelche Hinweise?

Antwort1

Da Sie keine weiteren Informationen bereitgestellt haben, bin ich nicht sicher, wie ich am besten antworten soll.

Hier also mein Versuch, Ihnen einige Anweisungen zu geben, wobei ich bewusst ignoriere, dass Sie Ihre Routing-Tabelle nicht ändern können (der Grund dafür wird Ihnen beim Lesen meines Vorschlags klar):

Abhängig vom VPN-Client undWoes hängt sich an die FIB (Forward Information Base) des Kernels an. Sie haben vielleicht Glück, dass die Überwachung der FIB oder, um Ihren Ausdruck Routing-Tabelle zu verwenden, durch das VPN nur für die localund mainRegeltabellen erfolgt. Sie können Ihre Routing-Regeln überprüfen mit

ip rule show

Für jeden String hinter dem Tag "lookup" (das sind die Regeltabelleneinträge) können Sie die entsprechenden Routing-Informationen aus der FIB abfragen, indem Sie

ip route show table <name>

Mit etwas Glück können Sie versuchen, eine Regel zu konstruieren, die Ihren Anforderungen entspricht, und ihr in der Regel-Nachschlagetabelle den Vorzug geben. Fügen wir beispielsweise (ich habe mir etwas ausgedacht, um Ihnen einen Vorsprung zu verschaffen) eine neue Regel mit höherer Präferenz als mainfür bestimmte Flows hinzu:

ip rule add from 192.168.1.0/24 to 10.10.212.1/30 iif eth0 oif eth2 lookup 888 pref 12000
ip rule show
   0:   from all lookup local 
   12000:   from 192.168.1.0/24 to 10.10.212.1/30 iif eth0 oif eth2 lookup 888 
   32766:   from all lookup main 
   32767:   from all lookup default 

Auf einem Standard-Linux-System (im Fall dieses Beitrags Ubuntu) würden Sie die drei Standardregeltabellen und sehen local, von denen Sie normalerweise nur die Tabelle sehen, wenn Sie beispielsweise aufrufen.maindefaultmainnetstat -rn

Nun wollen wir die FIB-Einträge in der Lookup-Tabelle 888 mit neuen Routing-Einträgen füllen:

ip route add default via 10.37.129.4 dev eth2 table 888

Sehen wir uns an, wie unsere Routing-Einträge in Tabelle 888 aussehen:

ip route show table 888
  default via 10.37.129.4 dev eth2

Ich denke, Sie verstehen, was ich meine. Nun ist im Hinblick auf Ihre spezifischen Routing-Anforderungen unklar, was Sie genau erreichen möchten. Stellen Sie sicher, dass Sie den Routing-Cache leeren, wenn Sie mit Regeltabellen herumspielen:

ip route flush cache

Beachten Sie, dass Sie mit der iproute2-Architektur im Grunde genommen praktisch jeden FIB-Eintrag filtern und ändern können; Regeleinträge können sogar auf der Grundlage von fwmarks und/oder u32-Klassifikatoren vorgenommen werden, wie folgt (Beispiel aus derRichtlinien-Routingbuch):

tc filter add dev eth1 parent ffff: protocol ip prio 1 u32 \
    match ip src 10.1.1.0/24 classid :1
ip rule add fwmark 1 table 1 prio 15000 realms 3/4
ip route add default via 192.168.1.1 table 1 src 192.168.1.254
ip route flush cache

Für den Fall, dass in den Regeltabelleneinträgen etwas schief läuft, habe ich vor vielen Jahren einen kleinen Bash-Codeschnipsel vorbereitet, um mein System wieder in den ursprünglichen Zustand der Routing-Regeln zu versetzen:

: ${KEEP:="local main default"}
while read prio rule; do
     continue=0
     for keep in ${KEEP}; do
         if [ "${rule//lookup ${keep}/}" != "${rule}" ]; then
             continue=1
         fi
     done
     if [ ${continue} -eq 0 ]; then
         ip rule del prio ${prio%%:*} ${rule//all/0/0}
     fi
done < <(ip rule show)

Erstaunlicherweise scheint es, dass nach über 10 Jahren des iproute2Bestehens immer noch nur wenige Menschen wissen, dass es ein Universum jenseits der klassischen"gebrochen"Tools wie ifconfigoder netstat.

verwandte Informationen