Road to Intermediate Linux: Network Edition

Une suite de Linux Beginners-Qiita. Depuis le 5 avril 2020, l'infection mondiale par [COVID-19](coronavirus du syndrome respiratoire aigu sévère 2) a bloqué les villes et exigé de s'abstenir de sortir. Le télétravail est recommandé autant que possible pour le travail, je vais donc résumer les éléments nécessaires pour accéder à distance à l'environnement réseau du laboratoire depuis l'extérieur du laboratoire, en gardant à l'esprit l'environnement qui semble être un laboratoire scientifique d'une université.

Accès à l'intranet depuis Internet

De l'intranet (par exemple, le réseau dans le laboratoire) à Internet (par exemple, le réseau en dehors du laboratoire), il y a généralement peu de restrictions et vous pouvez partir librement. Pour le moment, il est sorti via le serveur de passerelle et la structure de l'intranet ne peut pas être vue directement depuis Internet. Cela ressemble à un accès depuis l'adresse IP globale de la passerelle. Au contraire, nous expliquons ici quel type de commande et quel genre de chose peut être fait en entrant dans l'intranet à partir d'une adresse spécifique sur Internet. Ici, nous abordons essentiellement l'accès à l'aide de ssh.

Accédez au serveur Intranet Bastion avec ssh

Puisque l'adresse IP globale / le nom d'hôte est donné à la passerelle, vous pouvez accéder avec ssh en vous basant sur cette adresse IP / nom d'hôte. L'adresse IP / le nom d'hôte est requis pour l'accès, alors vérifiez auprès de la personne qui gère l'intranet. Si cette adresse IP est www.xxx.yyy.zzz et que le nom d'hôte est host.gate, lorsque user est le nom d'utilisateur

ssh [email protected]
ssh [email protected]

Vous pouvez y accéder avec (voir ci-dessous si vous avez besoin d'une clé). Peut-être que vous ne pouvez pas y accéder tel quel. La raison est que le numéro de port diffère généralement de 22 et n'est pas spécifié. Veuillez attendre un peu plus longtemps pour la connexion réelle car cela est nécessaire pour la commodité de l'explication. </ font> Si le numéro de port est 22 par défaut et que vous ne pouvez pas y accéder ici, il est probable que vous n’ayez pas été ajouté en tant qu’utilisateur en premier lieu, ou que le mot de passe que vous avez défini était incorrect.

Ici, je vais vous expliquer un peu plus ce qui se passe réellement. Normalement, la passerelle est souvent doublée en tant que routeur de machine dédié, et ce routeur de machine dédié ne dispose généralement pas d'informations utilisateur. Alors où es-tu connecté? La réponse est un serveur bastion. Le serveur pas à pas est un serveur qui gère tous les accès au routeur lors de l'accès à l'intranet depuis Internet. Lorsque vous entrez dans l'intranet de l'extérieur, vous devez d'abord vous connecter à ce serveur.

Décalez le numéro de port -p

Normalement, le numéro de port du protocole ssh de la passerelle ou du serveur pas à pas s'écarte du nombre par défaut de 22. La raison en est que ces serveurs faisant face à Internet essaient constamment de se connecter à partir d'ordinateurs non spécifiés, et le numéro 22 est le port par défaut pour ssh, ce qui en fait une cible prometteuse pour les attaques. Par conséquent, le numéro de port est dévié de 22 lors de l'accès avec ssh d'un ordinateur qui fait normalement face à Internet.

Par exemple, supposons que le numéro de port soit 31415 (seulement les cinq premiers chiffres de la circonférence). À ce moment-là, l'accès avec ssh devrait être le suivant:

ssh -p 31415 [email protected]
ssh -p 31415 [email protected]

Spécifier la clé -i

Par défaut, ssh vous permet de vous connecter avec votre nom d'utilisateur et le mot de passe correspondant. Si le numéro de port est 22, un nom d'utilisateur commun et un mot de passe facile à deviner permettront facilement une connexion humaine / ordinateur malveillante. Vous pouvez utiliser la méthode d'authentification par clé de ssh pour rendre cette intrusion encore plus difficile. En plaçant la clé publique à l'emplacement spécifié de la destination de connexion et en plaçant la clé privée dans l'ordinateur de la source de connexion, vous ne pouvez vous connecter que lorsque cette paire de clés correspond. Ici, avec la clé RSA à l'esprit, nous avons décrit comment accéder au serveur à l'aide de la clé. Vous pouvez en savoir plus en regardant autour de "l'authentification par clé ssh". La commande de connexion peut être spécifiée avec l'option -i comme suit lorsque la clé se trouve dans ~ / .ssh / id_rsa:

ssh -p 31415 -i ~/.ssh/id_rsa [email protected]
ssh -p 31415 -i ~/.ssh/id_rsa [email protected]

Il vous sera demandé la phrase de passe que vous avez spécifiée lorsque vous avez généré la clé, alors entrez-la.

Je veux utiliser le système X Window -X, -Y

L'accès à distance avec ssh permet à la plupart des applications d'afficher une fenêtre à portée de main. Vous pouvez ignorer la plupart des écrans GUI tels que gnuplot, firefox à partir de quelque chose comme xterm, xpdf, xdvi qui ressemble à un système X Window. (Cependant, notez qu'il existe de nombreuses applications qui laissent un démon étrange à la fin.) Si vous souhaitez lancer une application sur un serveur contenant des données que vous souhaitez analyser, ou si l'application est uniquement sur un serveur spécifique en raison de l'effet, l'installation de l'application est extrêmement gênante ( Il est efficace lorsqu'il est installé uniquement sur un ordinateur spécifique en raison de la dépendance du système d'exploitation, de la bibliothèque, etc.). Si vous souhaitez utiliser ces fonctionnalités, ajoutez l'option -X ou -Y. Je ne connais pas la différence, mais si vous utilisez un Mac, le premier se déconnecte dans un laps de temps relativement court et le second est plus stable. Un exemple de commande est le suivant

ssh -X [email protected]
ssh -X [email protected]
ssh -Y [email protected]
ssh -Y [email protected]

Si la vitesse de communication est lente (comme un réseau de téléphonie mobile), comme un serveur dans un emplacement distant, vous pouvez économiser de la bande passante en compressant le contenu de la communication. En regardant man ssh, il est plutôt lent lors de l'utilisation d'un réseau rapide.

ssh -XC [email protected]
ssh -YC [email protected]

Après m'être connecté au serveur de la plateforme, je souhaite passer automatiquement à un autre ordinateur de l'intranet -t

Sur l'intranet, le serveur de la plateforme y est généralement préparé et n'a généralement pas d'autre fonction. Habituellement, après la connexion au serveur de la plate-forme, il y aura une forte demande de connexion à un ordinateur en cluster, à un serveur de fichiers ou à un ordinateur géré personnellement pour afficher les données. Si vous voulez atteindre ces objectifs, une façon est de vous connecter au serveur de la plateforme puis de vous connecter au serveur suivant sous la forme ssh -XC user @ 192.168.xxx.yyy. Mais je pense que cela doit être ridicule et automatisé de faire cela à chaque fois. Quelqu'un pratique presque toujours "N'est-il pas possible de faire cela?" Un amateur peut penser et des informations peuvent être trouvées sur le Web. Dans ce cas, cela peut être réalisé avec l'option par défaut -t fournie par ssh. Spécifiez l'option -t et écrivez la commande sur le terminal que vous souhaitez exécuter sur le terminal connecté à droite du nom d'hôte.

ssh -p 31415 -t [email protected] ssh [email protected]
ssh -p 31415 -t [email protected] ssh [email protected]

Même s'il n'y a pas de -t, la commande écrite à droite du nom d'hôte sera exécutée, mais dans ce cas, l'option -t est requise. Lorsque cette commande est exécutée, le mot de passe suivant doit vous être demandé pour 192.268.xxx.yyy / linux.intra.

La commande n'est pas une variable qui a reçu l'option -t séparément, elle peut donc être séparée, mais personnellement, je préfère l'écrire ensemble comme suit:

ssh -p 31415 [email protected] -t ssh [email protected]
ssh -p 31415 [email protected] -t ssh [email protected]

De plus, si vous voulez ignorer X de la dernière destination de connexion, vous pouvez utiliser ssh -p 31415 -X [email protected] -t ssh -X user @ 192.168.xxx.yyy. La fenêtre lancée avec 192.168.xxx.yyy volera vers vous.

Application de commandes utilisant -t

Comme vous pouvez le voir, la commande à droite du nom d'hôte ne doit pas nécessairement être ssh. Si vous avez une commande que vous souhaitez exécuter immédiatement sur l'ordinateur auquel vous vous êtes connecté, pas seulement sur le serveur de la plate-forme, vous devez l'écrire ici. Par exemple, si vous souhaitez vérifier l'état d'exécution des travaux du super ordinateur et le budget restant

ssh -t [email protected] qstat
ssh -t [email protected] point

Si vous écrivez, etc., vous serez déconnecté immédiatement après avoir affiché l'état d'exécution et le nombre de points restants. De plus, il existe de nombreux cas où vous pouvez vous passer de l'option -t. Cependant, notez que certaines options attachées à la commande (peut-être en fonction du fichier de configuration chargé) peuvent être ignorées à ce stade.

Je souhaite remplacer l'accès à un port spécifique par l'accès à mon port -L

Il existe une fonction appelée redirection de port qui remplace / convertit l'accès au port à un ordinateur spécifique sur l'intranet du laboratoire vers le port de l'ordinateur qui est la source d'accès. A titre d'exemple, l'accès à distance au notebook jupyter décrit ci-dessous et l'accès à ssh seront pratiques.

Jupyter notebook -L 8888:192.168.xxx.yyy:8888 Par défaut, le notebook Jupyter lance un navigateur sur l'appareil lancé. En fait, en paramétrant l'accès à distance (par exemple, Démarrer jupyter notebook sur un serveur distant et l'utiliser dans un environnement local-Qiita), c'est sur l'intranet. Depuis un ordinateur sans restriction d'accès, vous pouvez y accéder en saisissant 192.168.xxx.yyy: 8888 depuis le navigateur. La signification de cette chaîne de caractères est adresse IP: numéro de port, ce qui signifie que le numéro de port est 8888. Lorsque vous lancez le notebook Jupyter plusieurs fois, le numéro de port augmente généralement de un, 8888, 8889, 8890. Puisque le serveur de plate-forme existe sur l'intranet, la redirection de port peut être effectuée à partir d'ici pour faire passer le port de l'ordinateur spécifique sur l'intranet au port spécifique de la source de connexion. Par exemple, si vous souhaitez ignorer 8888 de 192.168.xxx.yyy sur l'intranet vers 8888 ou 18888 de la source de connexion, la méthode d'écriture est la suivante:

# -L [Numéro de port source de connexion]:[IP de l'ordinateur intranet]:[Port informatique intranet]
ssh -p 31415 [email protected] -L 8888:192.168.xxx.yyy:8888 -t ssh [email protected]
ssh -p 31415 [email protected] -L 18888:192.168.xxx.yyy:8888 -t ssh [email protected]

La commande ssh user @ 192.168.xxx.yyy à droite de -t n'est pas requise pour la redirection de port elle-même, mais il est généralement nécessaire de se connecter une fois à l'ordinateur cible lors du lancement du notebook Jupyter, elle est donc décrite. C'est fait. Si vous disposez déjà d'un notebook Jupyter accessible à 8888, vous n'avez pas besoin de cette commande. En ce qui concerne le numéro de port de la source de connexion, n'importe quel numéro peut être préparé. Cependant, 0-1023 est réservé aux services existants fréquemment utilisés, il est donc préférable de ne pas le spécifier.

Accès ssh / sftp -L 10022: 192.168.xxx.yyy: 22

Comme mentionné ci-dessus, l'état de l'intranet ne peut pas être vu directement à partir d'Internet. En préparant un serveur de plateforme sur l'intranet et en vous y connectant via la passerelle, vous pourrez accéder à l'intranet. Une fois que vous vous êtes connecté au serveur de la plate-forme, la redirection de port vous permettra d'accéder plus facilement à votre intranet. La méthode est expliquée ici en utilisant la connexion ssh / sftp comme exemple. Si vous mappez le port 22 de l'ordinateur (192.168.xxx.yyy) dans l'intranet à la source de connexion 10022 sur le serveur de plate-forme, spécifiez votre propre 10022 comme destination de connexion de ssh pour les connexions suivantes. Ensuite, cela devient le comportement d'accéder au n ° 22 de l'intranet. La première commande pour cela est

ssh -p 31415 [email protected] -L 10022:192.168.xxx.yyy:22 

Ensuite, vous pouvez accéder à 192.168.xxx.yyy sur l'intranet avec ssh / sftp avec la commande suivante:

ssh -p 10022 user@localhost
sftp -P 10022 user@localhost

Notez que le numéro de port sftp est spécifié comme «-P», et P est une lettre majuscule. En outre, selon la version de sftp, il peut être défini sur -Port = 10022. Vérifiez avec «man sftp». Pour être honnête, sftp est plus avantageux pour les paramètres ici que ssh. Lors du téléchargement d'un fichier sur l'ordinateur souhaité, si l'ordinateur est sur l'intranet, si vous voulez le faire simplement, "Placez d'abord le fichier sur le serveur de la plateforme avec sftp" → "Connectez-vous au serveur de la plateforme avec ssh" → "sftp sur le serveur de la plateforme" Cela devient une procédure extrêmement fastidieuse consistant à "exécuter et déplacer le fichier vers l'ordinateur souhaité". En utilisant la redirection de port, cet effort peut être réduit à la fois. Il y a une critique selon laquelle "puisque vous vous connectez au serveur de plate-forme avec ssh, l'effort peut être réduit." Puisque sftp est une application interactive, vous pouvez charger / télécharger tout en regardant à la fois votre environnement et l'environnement auquel vous êtes connecté. Par contre, si vous suivez la procédure de mise en place du fichier sur le serveur de la plateforme une fois, par exemple, si le fichier uploadé / téléchargé est erroné, vous devrez refaire toutes les procédures. Si vous utilisez la redirection de port et que vous vous connectez directement avec sftp, ce type de problème ne peut pas se produire.

Je souhaite parcourir des pages Web accessibles uniquement depuis l'intranet avec mon navigateur -D

À différentes couches, il existe des pages Web accessibles à partir de l'intranet, bien que l'accès soit restreint ou ne soit pas accessible à partir d'Internet en général pour des raisons d'authentification. Comment y accéder en utilisant la redirection de port. Le transfert de port utilisé ci-dessus est appelé transfert local, et ici nous utilisons le transfert dynamique. L'option est -D pour spécifier le numéro de port:

ssh -p 31415 -D 10080 [email protected]

Si vous l'écrivez ainsi, il devient un serveur proxy SOCKS avec le numéro de port 10080. En spécifiant localhost pour l'hôte SOCKS et 10080 pour le port dans l'élément du paramètre de serveur proxy du navigateur, il se comporte comme s'il était accédé par le navigateur depuis le serveur de la plateforme.

Récapitulez le serveur pas à pas et accédez aux paramètres via le fichier de configuration

Jusqu'à présent, nous avons décrit la procédure permettant d'activer diverses fonctions sur l'intranet en utilisant pleinement les options ssh. Mais il est fastidieux de taper ces commandes à chaque fois. Ce serait cool si cela pouvait être rassemblé dans un fichier de paramètres. Le fichier de configuration est ~ / .ssh / config. Je vais expliquer les fichiers qui ont été décrits jusqu'à présent et refléter les fonctions (le "fichier .ssh / config" de mes pensées).

La grammaire de base est

Host [Nom préféré]
    Hostname [IP/nom d'hôte}
    IdentityFile [Chemin clé]
    Port [numéro de port]
    LocalForward [Port source de connexion] [IP de l'ordinateur intranet]:[Port informatique intranet]
    DynamicForward [Numéro de port utilisé pour le transfert dynamique]
    ForwardX11 [Si oui, utilisez le système X Window] 
    Compression [Si oui, le contenu de la communication sera compressé]
    ProxyCommand [Commandes exécutées après la connexion]

Se sentir comme ça. Le résumé est le suivant:

~.ssh/config


#
Host Bastion
    HostName 192.168.xxx.zzz
    IdentityFile /home/user/.ssh/id_rsa
Host linux
    HostName 192.168.xxx.yyy
Host Bastionout
    HostName www.xxx.yyy.zzz
    IdentityFile /home/user/.ssh/id_rsa
    Port 31415
Host linuxout
    HostName 192.168.xxx.yyy
    ProxyCommand ssh -XCW %h:%p Bastionout
Host linuxtunnelout
    HostName 192.168.xxx.yyy
    ProxyCommand ssh -XCW %h:%p Bastionout
    LocalForward 10022 localhost:22
    LocalForward 8888 localhost:8888
    LocalForward 8889 localhost:8889
    LocalForward 8890 localhost:8890
    LocalForward 8891 localhost:8891
    DynamicForward 10080
    GatewayPorts yes
Host linuxsecondout
    HostName localhost
    Port 10022
#
HOST *out
    ServerAliveInterval 60
    TCPKeepAlive yes
    Compression yes
HOST *
    User user
    ForwardX11 yes
    ForwardX11Trusted yes

Les derniers SeverAliveInterval et TCPKeepAlive sont des options pour atténuer le phénomène de déconnexion lorsque la connexion ssh est connectée via Internet. Pas expliqué ici. Je m'attendais à ce qu'environ quatre ordinateurs portables Jupyter soient lancés en même temps, j'ai donc transféré quatre numéros de série de 8888 à 8891. Comme il semble que le notebook Jupyter ne sera pas utilisé en même temps à la source de connexion, le numéro de port est le même que celui de l'intranet. La redirection de port crache un avertissement lorsqu'elle est lancée deux fois, ce qui est très désagréable. Par conséquent, nous avons préparé linuxout simple, linuxtunnelout pour la redirection de port et linuxsecondout pour un accès continu dans l'état de redirection de port. Si vous entrez «Ports de passerelle oui» pendant le transfert de port, l'accès au port transféré est autorisé à partir d'ordinateurs autres que l'ordinateur de transfert de port. Des caractères génériques (*) peuvent être utilisés dans le nom de la partie Host. Ici, je voulais utiliser le système X window pour toutes les connexions, je l'ai donc répertorié dans la section Host *. Ici, tous les accès depuis Internet sont nommés \ * out, et tous ont des paramètres pour ne pas déconnecter ssh et des paramètres pour la compression des communications. En regardant le manuel avec man ssh_config

Since the first obtained value for each parameter is used, more host-spe‐ cific declarations should be given near the beginning of the file, and general defaults at the end.

Par conséquent, il est nécessaire d'écrire les variables que vous souhaitez modifier en raison de problèmes environnementaux en haut du fichier et les variables générales en bas autant que possible.

Commandes fréquemment utilisées pour l'accès à distance

Fichier de téléchargement de commande sur un ordinateur distant: wget

Parfois, vous avez un fichier que vous souhaitez télécharger et que vous souhaitez le placer sur une machine connectée à distance. Pour le moment, il semble trop stupide de le télécharger sur votre ordinateur puis de le transférer avec sftp. Si vous connaissez l'URL qui spécifie le fichier à télécharger

wget [URL]

Le but peut être atteint avec.

FAQ Où nous nous réunissons

Recommended Posts

Road to Intermediate Linux: Network Edition
Une route vers Python intermédiaire
[Road to Intermediate] Comprendre les propriétés Python
[Route vers Python intermédiaire] Utiliser des opérateurs ternaires
Outils utilisés pour vérifier la communication réseau Linux
[Route vers Python intermédiaire] Utiliser des expressions lambda
[Route vers Python intermédiaire] Résumé du lien de l'article
Commandes réseau Linux
[Linux] Introduction à Linux
Espace de noms réseau Linux
[Road to Intermediate] Python semble être tous des objets
[Road to Intermediate] Que sont les * args, ** kwargs de Python?
Présentation de serverspec à Linux
[Route vers Python intermédiaire] Définir la fonction __getattr__ dans la classe
Commandes Linux à retenir
La route vers Pythonista
[Road to Intermediate Python] Définissez dans votre propre classe
La route vers Djangoist
[Road to Intermediate] Utiliser les variables de fonction intégrées de Python
En route vers l'acquisition de LPIC-1
Mémo réseau (principalement Linux)
[Road to Intermediate Python] Installer des packages en masse avec pip
[Route vers Python intermédiaire] Utiliser l'instruction if dans la notation d'inclusion de liste
[Road to Intermediate Python] Permet des opérations de comparaison pour des classes uniques
[Windows] RDP vers Windows via Linux
Une super introduction à Linux
La route pour télécharger Matplotlib
[Linux] Bienvenue en mode d'urgence!
J'ai essayé de réintroduire Linux
E-Cell 4 Intermédiaire facile à utiliser
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__
Obtenez l'adresse IPv4 attribuée à l'interface réseau dans le code (Linux)