Zulassen von SSH auf einem Server mit einem aktiven OpenVPN-Client

15

Ich besitze einen VPS mit CentOS 7, mit dem ich mich über SSH verbinde. Ich möchte einen OpenVPN-Client auf dem VPS ausführen, damit der Internetverkehr über das VPN geleitet wird, aber ich kann trotzdem über SSH eine Verbindung zum Server herstellen. Wenn ich OpenVPN starte, wird meine SSH-Sitzung getrennt und ich kann keine Verbindung mehr zu meinem VPS herstellen. Wie kann ich den VPS so konfigurieren, dass eingehende SSH-Verbindungen (Port 22) auf der tatsächlichen IP-Adresse des VPS (104.167.102.77) geöffnet sind, aber ausgehender Datenverkehr (wie von einem Webbrowser auf dem VPS) über das VPN weitergeleitet wird?

Der von mir verwendete OpenVPN-Dienst ist PrivateInternetAccess. Eine Beispieldatei für config.ovpn lautet:

Klient
dev tun
proto udp
remote nl.privateinternetaccess.com 1194
Resolv-Retry unendlich
nobind
persist-key
persist-tun
ca ca.crt
tls-client
Remote-Zertifikatserver
Auth-User-Pass
comp-lzo
Verb 1
Reneg-Sek. 0
crl-verify crl.pem

VPS's IP-Adresse:

1: lo: mtu 65536 qdisc noqueue state UNKNOWN
    link / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 :: 1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link / ether 00: 50: 56: be: 16: f7 brd ff: ff: ff: ff: ff: ff
    inet 104.167.102.77/24 brd 104.167.102.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80 :: 250: 56ff: febe: 16f7 / 64 scope link
       valid_lft forever preferred_lft forever
4: tun0: mtu 1500 qdisc pfifo_fast state UNBEKANNT qlen 100
    link / none
    inet 10.172.1.6 peer 10.172.1.5/32 scope global tun0
       valid_lft forever preferred_lft forever

IP-Route von VPS:

0.0.0.0/1 über 10.172.1.5 dev tun0
Standard via 104.167.102.1 dev ens33 proto static metric 1024
10.172.1.1 über 10.172.1.5 dev tun0
10.172.1.5 dev tun0 proto kernel scope link src 10.172.1.6
104.167.102.0/24 dev ens33 proto kernel scope link src 104.167.102.77
109.201.154.177 über 104.167.102.1 dev ens33
128.0.0.0/1 über 10.172.1.5 dev tun0
odie5533
quelle

Antworten:

15

Ich habe ein ähnliches Problem und habe versucht, das in diesem Forumsbeitrag beschriebene Problem zu beheben .

Die Idee ist, dass derzeit, wenn Sie eine Verbindung zu Ihrer öffentlichen IP-Adresse herstellen, die Rückpakete über das VPN weitergeleitet werden. Sie müssen erzwingen, dass diese Pakete über Ihre öffentliche Schnittstelle weitergeleitet werden.

Diese Routenbefehle werden hoffentlich den Trick machen:

IP-Regel hinzufügen aus xxxx Tabelle 128

ip route füge Tabelle 128 zu yyyy / y dev ethX hinzu

ip route add table 128 standardmäßig über zzzz

Wenn xxxx Ihre öffentliche IP-Adresse ist, sollte yyyy / y das Subnetz Ihrer öffentlichen IP-Adresse sein, ethX sollte Ihre öffentliche Ethernet-Schnittstelle sein und zzzz sollte das Standard-Gateway sein.

Beachten Sie, dass dies bei mir nicht funktioniert hat (mit Debian und PrivateInternetAccess), aber Ihnen möglicherweise weiterhelfen kann.

MrK
quelle
1
Anstatt nur auf eine Lösung zu verlinken, geben Sie hier bitte die Lösung an oder fassen sie zumindest zusammen. Auf diese Weise kann Ihr Beitrag auch in Zukunft nützlich sein, wenn der von Ihnen verknüpfte Beitrag nicht mehr angezeigt wird.
Andrew Schulman
Ich habe diese Befehle ohne Erfolg ausgeführt ... Wie würde ich dann diese Tabelle auflisten (ich kann die neuen Regeln, die ich mit routeoder hinzugefügt habe, nicht sehen ip route show) und sie löschen?
Hussain Khalil
Ich habe mein ssh auf meiner öffentlichen IP verloren, als ich openvpn auf meinem Heimserver gestartet habe. Durch Ausführen des ersten oben aufgeführten Befehls konnte ich ssh-Zugriff zurück auf den Server erlangen, wenn ich nicht im Heim-LAN war. Verwendung von PIA + OpenVPN + Ubuntu 16.04.
Boredcoding
Leitet es den SSH-Port wirklich nur an meine öffentliche IP weiter? Können Sie genauer erklären, was dies genau bewirkt? Ich sehe nirgendwo, wo Sie einen bestimmten Port oder ein bestimmtes Protokoll
festlegen
Das Routing basiert überhaupt nicht auf Ports (128 ist die Tabellennummer, kein Port). Grundsätzlich heißt es, wenn die Pakete über Ihre öffentliche IP-Adresse ankommen, sollte die Antwort über dieselbe Schnittstelle gesendet werden (ohne das VPN zu verwenden).
MrK
17

Das mag etwas spät sein, aber ...

Das Problem ist, dass das Standardgateway von OpenVPN geändert wird und die aktuelle SSH-Verbindung unterbrochen wird, es sei denn, Sie richten vor dem Start von OpenVPN entsprechende Routen ein.

Was folgt, funktioniert bei mir. Es benutzt iptables und ip (iproute2). Im Folgenden wird davon ausgegangen, dass die Standard-Gateway-Schnittstelle vor dem Start von OpenVPN "eth0" ist. Damit soll sichergestellt werden, dass beim Herstellen einer Verbindung zu eth0 die Antwortpakete für die Verbindung wieder auf eth0 zurückgehen, auch wenn eth0 nicht mehr die Standard-Gateway-Schnittstelle ist.

Sie können dieselbe Nummer für die Verbindungsmarke, die Firewallmarke und die Routingtabelle verwenden. Ich habe verschiedene Zahlen verwendet, um die Unterschiede zwischen ihnen deutlicher zu machen.

# set "connection" mark of connection from eth0 when first packet of connection arrives
sudo iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234

# set "firewall" mark for response packets in connection with our connection mark
sudo iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 table 3412

# route packets with our firewall mark using our routing table
sudo ip rule add fwmark 4321 table 3412

===

AKTUALISIEREN:

Das oben Genannte funktioniert gut für Debian Jessie. Aber auf einem älteren Wheezy-System habe ich gerade festgestellt, dass ich dem Routing-Tabelleneintrag "via" hinzufügen muss:

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 via 12.345.67.89 table 3412

Dort muss "12.345.67.89" das ursprüngliche Nicht-VPN-Gateway sein.

John Doe
quelle
1
DANKE! Ich habe seit Tagen nach einer Lösung für dieses Problem gesucht und Ihre Antwort hat es für mich gelöst. Dies sollte die akzeptierte Antwort sein.
Mike Turley
Diese Lösung hat auch bei mir funktioniert. Vielen Dank für das Teilen.
Alecov
Kann die Routing-Tabelle zwei Routen mit demselben Ziel enthalten ( ip route add default)? Ich erhalte "RTNETLINK-Antworten: Datei existiert". Ich verwende Ubuntu Xenial. "via" hilft nicht. Ich habe es gerade unter Arch Linux ausprobiert, es ip route add defaultscheint zunächst erfolgreich zu sein, aber die ip routeAusgabe ändert sich nicht. Alle nachfolgenden Ausführungen führen zur Meldung "Datei vorhanden".
X-Yuri
Ich sehe, die Route wird zur 3412-Routing-Tabelle hinzugefügt. Und um es zu bekommen Sie haben zu: ip route show table all | grep 3412. Und ohne "via" nicht hergestellte (wenn ich mich nicht irre) Verbindungen funktionieren nicht mehr (Ubuntu Xenial). Zumindest kann ich die Routing-Tabelle korrigieren. Trotzdem kann ich nicht auf den Server zugreifen, nachdem ich ausgeführt habe openvpn.
X-Yuri
Hat aus irgendeinem Grund nicht für mich gearbeitet, im Gegensatz zu diesem oder jenem oder jenem . Welches sind im Grunde die gleichen.
X-Yuri
12

Basierend auf der @ MrK-Antwort habe ich hier einen einfachen Code geschrieben, um die Arbeit zu beschleunigen, damit Sie nicht nach Schnittstellen / IP suchen müssen:

ip rule add from $(ip route get 1 | grep -Po '(?<=src )(\S+)') table 128
ip route add table 128 to $(ip route get 1 | grep -Po '(?<=src )(\S+)')/32 dev $(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
ip route add table 128 default via $(ip -4 route ls | grep default | grep -Po '(?<=via )(\S+)')

Ich habe dieses Skript auf 4 meiner VPS ausprobiert und es funktioniert einwandfrei.

Sandpocken
quelle
Ich danke dir sehr!
Jordi Goyanes
0

hmm klingt wie IP-Subnetz-Überlappung .... ohne mehr über Ihr IP-Schema zu wissen, außer der öffentlichen IP für Ihre VPN-Verbindung wie nl.privateinternetaccess.com, kann nicht sicher sagen.

Zum Beispiel, wenn das entfernte Subnetz auf der anderen Seite von nl.privateinternetaccess.com 10.32.43.0/24 ist und sich Ihre Instanz in einem aws vpc befindet, dessen Subnetz 10.32.44.0/24 ist. Ihr Source-SSH-Client läuft jedoch unter 10.32.43.0/24 (auf Ihrer Seite von AWS VPC). Dies funktioniert nicht, da der zurückgesendete SSH-Verkehr fälschlicherweise über VPN in die Niederlande geleitet wird.

Geben Sie die vollständigen IP- / Subnetz-Informationen an, um weitere Hilfe zu erhalten.

...

ok, also ... sieht so aus, als ob Ihre Standardroute im Tunnel ist, nachdem Sie eine Verbindung zu nl hergestellt haben:

0.0.0.0/1 über 10.172.1.5 dev tun0

Sie können dies also ändern, nachdem Sie eine Verbindung hergestellt haben. Viele Male geben VPN-Server Ihnen falsche Routen. speziell bei schlampigen Korps. In diesem Fall wird eine Standardroute an Sie gesendet, sodass der gesamte Datenverkehr von der vps box an nl weitergeleitet wird. Ändern Sie die Standardroute auf 104.167.102.x oder auf das Subnetz-Gateway, das sich beim ur vps-Anbieter befindet.

nandoP
quelle
Welche Befehlsausgaben würden ausreichen?
odie5533
1
Ausgabe von "ip addr" und "ip route" auf ssh client, ssh server / vpn client und nl vpn server. Stellen Sie sicher, dass vpn aktiv ist, wenn Sie eine Ausgabe erhalten.
nandoP
Ich möchte, dass der Datenverkehr standardmäßig über das VPN geleitet wird. Ich möchte jedoch, dass eingehender Datenverkehr am 104.167.102.77:22 zugelassen wird, damit ich SSH für den VPS ausführen kann.
odie5533
Sie überprüfen dies mit tcpdump, aber es hört sich so an, als ob nach dem Herstellen der Verbindung die Standardroute zum Tunnel wird. Der neue SSH-Verkehr, der von einer anderen Stelle im Internet eingeht, wird zugelassen, kehrt jedoch nicht zurück, da die Standardroute die SSH-Antwort durch den Tunnel sendet. statt zu dir zurück. Sie können dies beheben, indem Sie "ip route add [your-ip-addr] / 32 via [your vps gateway]". Um Ihr VPS-Gateway zu finden, trennen Sie es einfach vom Tunnel und sehen Sie sich die Standardroute an
nandoP 16.01.15
0

Wenn Sie das VPN aufrufen, wird Ihr Standard-Gateway ersetzt. Dies bedeutet, dass jeglicher Verkehr, der von Ihrer Box erzeugt oder durch diese geleitet wird, an das VPN-Gateway weitergeleitet wird.

Eine einfache Lösung besteht darin, den gesamten Datenverkehr zu filtern, den Sie nicht über das VPN leiten möchten, und etwas anderes damit zu tun. Eine Möglichkeit besteht darin, den von Ihrer Box erzeugten Datenverkehr mit Ihrer lokalen Quelladresse aufzunehmen und über Ihr lokales Gateway weiterzuleiten. Auf diese Weise können Dienste wie SSH ordnungsgemäß ausgeführt werden.

Das machen wir hier. Erstellen Sie zunächst eine neue Routingtabelle und fügen Sie eine Standardroute hinzu, die alles über Ihr lokales Gateway weiterleitet:

# <table> is any number between 2 and 252.
# Check /etc/iproute2/rt_tables for more info.
ip route add default via <gateway> table <table>
ip route add <lan-addr> dev <device> table <table>

Als Nächstes erstellen Sie eine neue Paketfilterregel, die den gesamten Verkehr markiert, der Ihre Box von einer bestimmten Quelladresse mit einer Kennung verlässt.

# <mark> is any number.
iptables -tmangle -AOUTPUT -s<local-addr> -jMARK --set-mark <mark>

Erstellen Sie schließlich eine Routing-Richtlinie, die den gesamten oben genannten markierten Datenverkehr auswählt und anhand der oben generierten Tabelle weiterleitet.

ip rule add fwmark <mark> table <table>

Auch hier sind die Werte von <mark>und <table>beliebige Bezeichner Ihrer Wahl.

Alecov
quelle
0

Für mich mit OpenVPN-Server selbst in pfSense war das Deaktivieren der Einstellung "Alle vom Client generierten IPv4-Daten durch den Tunnel erzwingen".

user3820047
quelle