同じ端末コマンドを使用して、LANの内外からのSSHアクセス


10

Raspberry Pi(RPi)を使用していて、sshを使用してRaspberry Piにリモート接続しています。ローカルエリアネットワークとインターネットの両方から(ルーターで開いた特定のポートを使用して)RPiにアクセスできるように、sshを正しく設定できました。

ユーザー名johnと次の名前のRPiを想定しますraspi

内部LANアクセス

ssh john@192.168.2.7
ssh john@raspi
ssh raspi

外部LANアクセス

ssh -p 1234 john@12.345.67.89
ssh -p 1234 12.345.67.89

しかし、どうすれssh raspiばLANの外から簡単に実行できますか?LAN内とインターネット上の2つのIPアドレスを指すようにraspiを構成する方法はありますか?

基本的に私が望んでいるのは、家にいるか仕事に関係なく、RPiに単一の方法でアクセスすることです。


ローカルLANでDNSサーバーを実行して、ローカルLAN IPアドレスで「raspi」名の要求に応答することができます。現在、同じ名前を別の外部アドレスに解決するには、解決する方法でその名前を入力する必要があります(動的DNS)。ただし、おそらく「raspi」よりも長い名前が必要になります。
ChuckCottrill 2013

このQ&Aを参照してください:unix.stackexchange.com/questions/61655/...
SLMを

回答:


7

質問を詳しく見てみると、LANの内部と外部の両方から同じコンピューターを使用しているようです。私はそれに応じて私の答えを修正しました:

~/.ssh/config、次を追加します。

Host raspi-wan
    HostName 12.34.56.78
    User john
    Port 1234

Host raspi-lan
    HostName 192.168.1.2
    User john
    Port 22

そうすれば、DNSサーバーに手を加えたり、すべてのユーザーを編集したりせずにssh raspi-wan、LANの外側から、またはLANのssh raspi-lan内側から/etc/hosts、またはrootとして何かを実行する必要さえありません。現在のraspi場所に応じて名前を異なる方法で解決したい場合は、おそらくネットワークを検出してそれに応じて動作するシェルスクリプトマジックが必要になります。


1
おかげDopeGhotiは、私が含まれるようにあなたのソリューションで非常に快適だ-wan-lan接尾辞を。しかし、私のsshはそのUsernameフィールドが好きではありませんでした(悪い構成オプション)。それがなくても問題なく動作しています。
Aeronaelius

2
申し訳ありませんが、正しい構文はUser johnではなくUserNameです。私はこれを反映するように私の答えを修正しています。このように構成を設定したら、sshコマンドラインからユーザー名を省略できます。
DopeGhoti 2014年

5

これは、lanとwanに別のエイリアスを使用したり、追加のポート転送を作成したりすることなく、ssh構成だけで完全に実行できます。(ただし、LAN内にいるかどうかを検出する方法が当然必要です)

では~/.ssh/config、次のようなものを追加します。

Match host raspi exec "am_i_outside_of_my_lan"
    HostName 12.345.67.89
    Port 1234

代わりにam_i_outside_of_my_lan、ホームネットワークの内部にいるかどうかを判別し、外部にいる場合は0の終了コード、それ以外の場合は何かを返すコマンドを配置します。

host条件はおそらく自明ですが、execコンディションワラントいくつかの説明は:それは一致した場合にのみ、終了コード0、つまりと指定されたコマンドを返します。エラーなし。

つまり、これはhost raspi、ホストraspiに接続しようとしたときにこのルールを制限する部分であり、exec "am_i_outside_my_lan"さらに、ホームネットワークの外部から接続しているときにのみ適用されるように制限しています。したがって、ホームネットワーク内ssh user@raspiでは通常どおりに動作しますが、その外ではルールが一致し、代わりにと同等ですssh -p 1234 user@12.345.67.89

の代わりに何を使用するかについてはam_i_outside_of_my_lan、それは完全にセットアップに依存します。コマンドをインラインで記述するのではなく、別のスクリプトに配置することをお勧めします。引用を正しく行うのは少し難しいようです。

個人的に、私は次のPythonスクリプトを使用して、自分のネットワーク内にあるかどうかを検出しました(ドメイン名が自分のネットワーク内のローカルIPに解決されるため)

#! /usr/bin/env python
import socket, sys

sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))

同様の設定がない場合は、別のことをする必要があるかもしれません。(たとえば、接続しているワイヤレスネットワークの名前を確認したり、what-is-my-ipサービスをクエリして、接続しているネットワークの外部IPを取得したりできます)


これが正解です。他の人がもっと投票するのはとても悲しいことです。
ジョナサン・トマー

@JonathanTomer:さて、公平を期すために、質問されてから3年後に回答しましたが、スコアの高い回答は数時間以内に投稿されたので、「早い鳥がワームを手に入れた」だけの例です:P(私も持っています私はこの一般的なソリューションのEllis Hoagの特定のバリアントが非常に好きだと言っています-arpを使用するとかなり賢くなり、ネットワーク検出コマンドのようにすべてのネットワーク設定で調整する必要がないため、ソリューションをより汎用的にします)
Aleksi Torhamo

3

パソコン(connect-にING 1)、あなたはのためのホスト名を設定することができます12.345.67.89/etc/hostsファイルを開き、DNSエントリを設定します。

12.345.67.89    raspi

次に、ローカルDNS解決プロセスの一部として、マシンが「raspi」を「12.345.67.89」に変換します。複数のマシンを使用している場合、変更はそれらすべてに行う必要があります。問題は、編集するにはrootアクセスが必要で/etc/hostsあり、どこにでもあるとは限らないことです。

「raspi」がどこからでも自動的に認識されるようにするには、申し訳ありませんができません。これには、ドメイン名として「raspi」の登録が必要になりますが、「raspi」にはTLDがないため、DNSルートサーバーに依存しないため、これを行うことはできません。ただし、ドメイン名を登録することもできます(たとえばcfbaptista.me、をポイントしてWAN IPアドレスをポイントします。ポート転送を使用すると、次の方法でRaspberry Piにアクセスできます:

ssh (you@)(raspi.)cfbaptista.me

(それでも、それはほとんど何にもお金をかけていません ...)

user@パーツに関しては、さまざまなマシンでのログイン名によって異なります。あなたは上に同じ名前を持っている場合は接続するマシン上のリモート 1、そして必要は指定しないように。そうでない場合は、リモートマシンのユーザーを指定する必要があります。


注:他の回答で述べたように、SSH構成でホストエイリアスを作成できます。もちろん、ルートは必要ありません。
2013

確かに !ここに小さなリンクがあります:collectiveidea.com/blog/archives/2011/02/04/how-to-ssh-aliases
John WH Smith

0

目標: ssh raspi LAN内および公衆インターネット上で機能する必要があります。

これを行うには、名前がLANの内部IPおよび外部からのパブリックIPに解決されることを確認する必要があります。

まず、などのドメイン名を取得する必要がありますraspi.yourdomain.com。趣味用の無料ドメインについては、http://freedns.afraid.org/を確認してください。ドメインをパブリックIPに向ける

LANについては、DNSMasqを実行することをお勧めします。オープンなDD-WRTファームウェアは、DNSMasqと緊密に統合し、DHCPとDNSに使用します。検索ドメイン(「yourdomain.com」)を指定するだけで、各クライアントの要求名に基づいてDNS名が自動的に割り当てられます。これを機能させるには、raspiの/ etc / hostnameをにする必要がありますraspi

これがセットアップされると、raspi.yourdomain.comはLANのローカルIPに解決されます(すべてのマシンでローカルDNSを使用していることを確認してください)。

これで、ポート22を公共のインターネットに公開したくないと思います。大量のスニファトラフィックが発生するためです。したがって、raspi:22を他のポート、たとえば1234として公開しているルーターがあるとします。パブリックネットワークと内部ネットワークの両方で同じポートを使用するには、raspiにポートリダイレクトルールを追加できます。Linuxの場合:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1234 -j REDIRECT --to-port 22
sudo sh -c 'iptables-save > /etc/iptables/iptables.rules'

(eth0をip linkまたはifconfigで表示されるネットワークインターフェースの名前に、1234をパブリックポートに変更します)

これでssh -p 1234 raspi.yourdomain.com、パブリックとLANの両方からアクセスできます。

ssh raspi@DopeGhotiで言及されているように、クライアントマシンの〜/ .ssh / configにエントリを追加して、これをjustに短縮できます。

同じパブリックIPで追加のマシンのSSHポートを公開する場合は、別のDNS名とパブリックポートでこのプロセスを繰り返すだけです。乾杯!


0

これは、curlを使用して現在のパブリックIPを取得し、サーバーのパブリックIPと一致するかどうか(つまり、同じローカルネットワーク上にあるかどうか)を確認する、Aleksi Torhamoの簡潔で実用的なバージョンです。

あなたの~/.ssh/config追加で

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) == '12.345.67.89' ]]"
  User john
  HostName 192.168.2.7

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]"
  User john
  HostName 12.345.67.89
  Port 1234

私は信じている sshので、理論的にはあなたのような何かを行うことができるはず、ためには、一致するすべてのディレクティブを処理するMatch host raspi / User john / HostName 192.168.2.7ことで、その後のMatch host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]" / HostName 12.345.67.89 / Port 1234一つだけで同じ効果をしてもらうcurl、起動させる== '12.345.67.89'場合は、第二の障害によって想定されるMatchルールのexec
FeRD 2018

(最初の引数で指定したすべての引数Matchが同じか、2番目の引数でも指定されていることを確認する必要があります。最初の引数で非標準Port xxxxを指定し、2番目の引数でMatch標準ポートを使用したい場合はMatchPort 22ポートを引き続き使用しないように、明示的にaでオーバーライドして戻す必要がありますxxxx。)
FeRD

0

マシンがLANに接続されているときにIP 192.168.1。*を持っていると仮定すると、次の構成でこれを実現できます。これにより、~/.ssh/config常に同じコマンド(だけssh raspi)を使用して接続できます。

Match Originalhost raspi Exec "ifconfig | grep 192\.168\.1\."
    HostName 192.168.1.2
    User john
    Port 22

Host raspi
    HostName 12.34.56.78
    User john
    Port 1234

0

このソリューションは、ホームネットワークに単一のルーターがあることを前提としていますが、これは一般的なケースだと思います。

に追加 ~/.ssh/config

Match host raspi exec "test $(arp 192.168.1.1 | awk '{print $4}') = ROUTER_MAC_ADDRESS"
        Hostname 192.168.2.7
        User john

Host raspi
        Hostname 12.345.67.89
        Port 1234
        User john
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.