web-dev-qa-db-ja.com

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

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

ユーザー名johnおよびraspiという名前のRPiを想定します。

内部LANアクセス

ssh [email protected]
ssh john@raspi
ssh raspi

外部LANアクセス

ssh -p 1234 [email protected]
ssh -p 1234 12.345.67.89

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

私が基本的に望んでいるのは、家にいても仕事中にも、RPiに単一の方法でアクセスすることです。

10
Aeronaelius

質問を詳しく見てみると、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

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

7
DopeGhoti

これは、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 [email protected]と同等の機能を果たします。

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を取得したりできます)

5
Aleksi Torhamo

コンピューター(connect-ingone)では、12.345.67.89のホスト名を設定できます。 /etc/hostsファイルを開き、DNSエントリを設定します。

12.345.67.89    raspi

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

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

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

(それでも、それはほとんどお金を費やしていない...)

user@の部分については、さまざまなマシンでのログイン名によって異なります。 connectingマシンに同じ名前がある場合andremote1つ。指定する必要はありません。そうでない場合は、remoteマシン上のユーザーを指定する必要があります。

3
John WH Smith

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

~/.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
0
Ellis Hoag

これは、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
0
Alec Jacobson

目標: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をパブリックポートに変更します)

これで、公衆とLANの両方からssh -p 1234 raspi.yourdomain.comを実行できます。

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

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

0
Eric Drechsel

マシンが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
Cvuorinen