![Wie kann ich SSH anweisen, eine Verbindung über die nicht temporäre IPv6-Adresse herzustellen?](https://rvso.com/image/1703325/Wie%20kann%20ich%20SSH%20anweisen%2C%20eine%20Verbindung%20%C3%BCber%20die%20nicht%20tempor%C3%A4re%20IPv6-Adresse%20herzustellen%3F.png)
IPv6-Schnittstellen (zumindest mit routingfähigen IPs) haben normalerweise eine temporäre IP-Adresse, die sich häufig ändert und normalerweise für ausgehende Verbindungen verwendet wird, um mehr Privatsphäre zu bieten.
Wie kann ich ssh anweisen, diese Adresse nicht zu verwenden, sondern für einen bestimmten ausgehenden Verbindungsversuch stattdessen die nicht temporäre Adresse zu verwenden?
Ich weiß, dass ich die Option zum Binden an eine bestimmte IP-Adresse verwenden kann -b
, aber das bedeutet, dass ich zuerst die IP-Adresse der ausgehenden Schnittstelle nachschlagen müsste.
Antwort1
Unter Linux müsste ssh setsockopt(IPV6_ADDR_PREFERENCES) aufrufen, um einen bestimmten Adresstyp anzufordern. (Dies wird in den Linux-Setsockopt-Dokumenten nicht erwähnt, aber der Code ist im Kernel vorhanden und scheint der RFC 5014-Spezifikation zu entsprechen.)
Da OpenSSH keine Konfigurationsoptionen hat, mit denen Sie Adresseinstellungen festlegen können, müsste es ein Hack sein wieDieses hier(nur mit einem anderen Sockopt). Sie können versuchen, die OpenSSH-Entwickler zu bitten, eine solche Option hinzuzufügen, aber sie möchten im Allgemeinen keine Betriebssystemfunktionen hinzufügen, die OpenBSD nicht auch unterstützt.
Es ist vermutlich einfacher, ein Skript zu erstellen, um die richtige Adresse für zu erhalten -b
. Unter Linux könnten Sie beispielsweise Folgendes verwenden ip | jq
:
addr=$(ip -json -6 addr ls dev eno1 scope global \
| jq -r ".[].addr_info[]|select(.local)|select(.temporary|not)|.local")
ssh -b $addr ...
Alternativ: Temporäre Adressen (Datenschutzerweiterungen) komplett deaktivieren.
Wenn Sie jedoch Ihr Glück mit versuchen möchten LD_PRELOAD
, können Sie Folgendes testen (ich habe es überhaupt nicht getestet; es könnte sehr gut sein, dass es zu spät ausgelöst wird, um irgendeinen Effekt zu haben):
/* gcc -shared -o ipv6pref.so ipv6pref.c */
/* LD_PRELOAD="$HOME/ipv6pref.so" ssh whatever */
#define _GNU_SOURCE
#include <dlfcn.h>
#include <err.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <sys/socket.h>
int setsockopt(int fd, int level, int name, const void *value, socklen_t len)
{
static int (*real_setsockopt)(int, int, int, const void *, socklen_t);
uint32_t flags = IPV6_PREFER_SRC_PUBLIC;
int r;
if (!real_setsockopt)
real_setsockopt = dlsym(RTLD_NEXT, "setsockopt");
if ((level == SOL_IP && name == IP_TOS) ||
(level == SOL_IPV6 && name == IPV6_TCLASS))
{
/* This is probably the TCP socket that will be used for SSH. */
r = real_setsockopt(fd, IPPROTO_IPV6, IPV6_ADDR_PREFERENCES, &flags, sizeof flags);
if (r != 0)
warn("Could not set address preference");
}
return real_setsockopt(fd, level, name, value, len);
}