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に単一の方法でアクセスすることです。
質問を詳しく見てみると、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
という名前を現在の場所に応じて異なる方法で解決したい場合は、おそらくネットワークを検出してそれに応じて動作するシェルスクリプトマジックが必要になります。
これは、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を取得したりできます)
コンピューター(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マシン上のユーザーを指定する必要があります。
このソリューションは、ホームネットワークに単一のルーターがあることを前提としています。
~/.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
これは、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 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名とパブリックポートでこのプロセスを繰り返すだけです。乾杯!
マシンが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