Leiten Sie den Verkehr in einer Kontrollgruppe außerhalb eines VPN-Tunnels weiter

Leiten Sie den Verkehr in einer Kontrollgruppe außerhalb eines VPN-Tunnels weiter

Ich versuche, einen Teil des Datenverkehrs über ein VPN laufen zu lassen, den anderen jedoch nicht.

Pakete mit einer bestimmten fwmark sollen an meine Standardschnittstelle ( wlo1) gehen und der gesamte übrige Verkehr an eine Tunnelschnittstelle ( tun0, mit OpenVPN) in der Haupttabelle. Ich habe diese Regel in nftables hinzugefügt:

table ip test {
    chain test {
        type route hook output priority mangle; policy accept;
        meta cgroup 1234 meta mark set 1
    }
}

In der Hauptroutingtabelle habe ich diese Einträge:

default via 10.11.0.1 dev tun0 
10.11.0.0/16 dev tun0 proto kernel scope link src 10.11.0.20 
[WANIP.0]/24 dev wlo1 proto kernel scope link src [WANIP] 
128.0.0.0/1 via 10.11.0.1 dev tun0 
[VPNIP] via [WANGATEWAY] dev wlo1

Pakete mit fwmark 1werden stattdessen in ihre eigene Routing-Tabelle geleitet: ip rule add from all fwmark 1 lookup test. In der testTabelle habe ich die folgende Route hinzugefügt:

default via [WANGATEWAY] dev wlo1

Wenn ich es ping 8.8.8.8von dieser Kontrollgruppe aus ausführe, bleibt es hängen. Es scheint, als könne es Pakete senden, aber nicht empfangen.

VPN-Verkehr funktioniert wie erwartet.

Was genau ist los?

Antwort1

Wenn ein Paket gesendet wird, wird eine Routing-Entscheidung getroffen: Diese Entscheidung wählt die ausgehende SchnittstelleUnddie zu verwendende passende Quell-IP-Adresse.

Wenn dasRoute/AusgabeKette setzt eine Marke, sie löst eineUmleitungsprüfung, wie in diesemschematisch(das gemacht wurde füriptablesim Hinterkopf, ist aber durchaus verwendbar fürNftables). Die Umleitungsprüfung ändert die Route, aber nicht die Quell-IP-Adresse. Es muss also noch mehr Arbeit geleistet werden.

  • Fügen Sie eine NAT-Regel hinzu, um die Quell-IP-Adresse zu ändern.

Das muss getan werdennachdie Umleitungsprüfung, also erfolgt sie innat/postroutingBeachten Sie, dass dieselbe Tabelle verschiedene Kettentypen haben kann (im Gegensatz zuiptableswobei Tabelle <=> Typ).

    nft add chain ip test testnat '{ type nat hook postrouting priority srcnat; policy accept; }'
    nft add rule ip test testnat meta mark 1 masquerade

Jetzt geht tatsächlich das richtige Päckchen raus.

  • und erlauben Sie die Annahme des Antwortflusses, auch wenn er nicht über die Standardroute eintrifft.
  1. Sie können sich entweder entspannenReverse-Path-Weiterleitungin den Loose-Modus, indem Sierp_filter:

        sysctl -w net.ipv4.conf.wlo1.rp_filter=2
    
  2. oder markieren Sie den Antwortfluss so, dass er dieselbe Routing-Tabelle wie der ausgehende Fluss verwendet. Das wird die Sicherheit zwar nicht wirklich verbessern, aber trotzdem:

        nft add chain ip test testpre '{ type filter hook prerouting priority mangle; policy accept; }'
        nft add rule ip test testpre iif "wlo1" meta mark set 1
    

Leider funktioniert dies nicht ohne eine weitere Optimierung, die notwendig ist, da ein neuerundokumentierte Funktionerschienen im Jahr 2010:

        sysctl -w net.ipv4.conf.wlo1.src_valid_mark=1

Anmerkungen:

  • Es ist möglich, die Sicherheit zu verbessern, indem man die Markierung in Conntracksconnmark( ct mark), um nur die korrekten Antwortflüsse zuzulassen und nichts anderes, um die strikte Rückwärtspfadweiterleitung zu umgehen. Im strikten Modus gelangt nichts durchwlo1mehr, es sei denn, es handelt sich um eine Antwort aus ausgehendem Datenverkehr. Hier ist die vollständige entsprechende nftables-Regeldatei hierfür (zu verwenden mit Option 2 oben beim Ersetzen von nftables-Regeln):

      table ip test {
              chain test {
                      type route hook output priority mangle; policy accept;
                      meta cgroup 1234 meta mark set 1 ct mark set meta mark
              }
    
              chain testnat {
                      type nat hook postrouting priority srcnat; policy accept;
                      meta mark 1 masquerade
              }
    
              chain testpre {
                      type filter hook prerouting priority mangle; policy accept;
                      ct mark 1 meta mark set ct mark
              }
      }
    
  • Außerdem könnte die Mark-Reroute-Prüfung in einigen Fällen die korrekte PMTU / TCP MSS beeinträchtigen, je nachdem, was ich dort imuidrangeEintrag:https://kernelnewbies.org/Linux_4.10#Networking

  • Wenn Sie die Verwendung der Kontrollgruppen stattdessen in eine begrenzte Anzahl von UIDs umwandeln können, kann dies korrekt nur mit dem Routing-Stack ohne Netfilter oder NFtables durchgeführt werden, ip rule add ... uidrange ...wie oben beschrieben. Siehe meine Antwort dazu:Weiterleiten des Datenverkehrs für einen Benutzer über eine bestimmte Schnittstelle (tum1).

verwandte Informationen