IPを定期的に変更するLinuxマシンに接続する方法は?


12

私の問題は、IPアドレスが毎日変更されるLinuxサーバー(Ubuntu 18.04)にSSHで接続する方法を見つけることです。

私は時々管理タスクを手伝ってくれるクライアントを持っています。彼らが助けを必要とするとき、私はマシンにsshする必要がありますが、彼らは静的IPを持っていないので、サーバーのパブリックIPは絶えず変化しています。LinuxマシンのIPアドレスを報告する小さなスクリプトを作成したところ、正午頃に1日1回変更されることがわかりました。

SSHをセットアップすることができ、IPアドレスが変更されるまで、ローカルでもリモートでも動作します。それが起こると、新しいIPアドレスを使用してもリモートで接続できなくなります。

  • IPアドレスが変更されるたびにSSHサービスを再起動する必要がありますか?
  • もしそうなら、なぜですか?
  • SSHアクセスを許可するためにIPアドレスが変更された場合に行う必要がある他のアクションはありますか?

更新

明確にするために、私の問題は新しいIPアドレスを見つけられないことです。既にそれを行うスクリプトがあります。問題は、新しいIPアドレスを使用して接続しようとしても、IPが変更されるとサーバーが応答しなくなることです。

ターゲットマシンでSSHサービスを再起動すると、リモートアクセスが再び可能になります。しかし、なぜこれをしなければならないのか理解できません。より良い解決策を見つけることを期待して根本原因を知りたい。

ほとんどの人は、SSHが新しいIPを知っている限り機能するはずだと考えているように思われますが、これは18.04に固有のものですか?最近、クライアント用にこのサーバーをインストールしたため、すべての構成設定はデフォルトのままです。(変更する方法がわかりません。)


8
ダイナミックDNSを使用します。
IPOR Sircer

12
ISPで叫ぶ。IPアドレスを1日に1回変更することは、ビジネス接続では不合理であり、住宅接続では比較的前例のないことです。
マイケルハンプトン

2
IPアドレスが変更されると、sshアクセスが機能しなくなると言います。しかし、再び機能するようになるのはいつかと言っていません。何らかの形で再び動作を開始する必要があると思います。そうしないと、毎日動作しなくなるのを見ることができません。また、IPアドレスが変更されたときに行うべきことは何もありません。sshサーバーは、新しいIPアドレスですぐに到達可能になります。
カスペルド

1
ListenAddress <dynamic host name>おそらく、誰かが内部ユーザーがサーバーにsshできるようにしたくないという理由で、DDNSの実行やsshd configファイルのような奇妙なことが起こっている可能性があります。実際には、IPが変更されるたびにsshサーバーを再起動する必要があります。
Guntram BlohmはMonicaを

1
@MichaelHampton:叫ぶことはおそらく助けにならず、支払うことになるでしょう。現在IPv4アドレスが不足しているため、ほとんどのプロバイダーは静的IPv4アドレスに対して追加料金を請求します(非静的パブリックIPアドレスに対して追加料金を請求する場合もあります。それ以外の場合はDual Stack Liteを取得します)。もちろん、OPがIPv6上にある場合、状況は変わります
...-sleske

回答:


21

他の答えはあなたの質問の1つのことを見落としているようです:

それが起こると、新しいIPアドレスを使用してもリモートで接続できなくなります

DDNSは新しいIPアドレスを見つけるのに役立ちますが、ここでは問題ではないようです。

残念ながら、新しいIP 取得するサーバーは、ISPがルーターを提供し、サーバーがルーターの背後に内部アドレスを持ち、ルーターがポート転送を行う標準セットアップでは問題になりません。適切な回答を得るには、ネットワークトポロジに関する詳細情報を提供する必要がある場合があります。

私が想像すると、サーバ、ルータの背後にあることと、自身のPPPoE接続をしていない、である)、サーバーの再起動の時点で特定のインタフェースアドレスに結合するSSHサーバー、B)への着信SSHを許可するマシンのファイアウォールファイアウォールを備えたサーバーのIPのみが、IPの変更時に更新されません。

最初のケースを確認するには、を実行しnetstat -nta | grep -w 22 | grep LISTENます。0.0.0.0:22と表示されていれば問題ありません。特定のIPがリストされている場合は、sshd構成ファイル(/etc/sshd.conf)を確認してくださいListenAddress

2番目のケースをチェックするにiptables -L -nは、INCOMINGチェーン内のルールの1つがサーバーのIPとポート22に一致するかどうかを確認します。

これらのいずれかが現在のサーバーアドレスを持っている場合は、それを0.0.0.0に変更する(セキュリティへの影響を確認する)か、IPが変更されるたびにルール/構成を更新する必要があります。

編集

サーバーはルーターの背後にあるため、上記のアイデアはおそらく当てはまりません(*)。この設定では、ルーターには外部IP(毎日変更されます)があり、内部デバイスには変更しないはずの10.xyzまたは192.168.xyアドレスが必要です。外部アドレスに接続すると、ルーターはポート転送ルールを内部アドレスに設定する必要があります。

外部IPの変更(既存のSSH接続はしかし、切断されます)と、このポート転送が壊れていないはずですが、多分それはそれを取得転送したときにルータがUPnPをドロップすると、あなたによってセットアップではなかったルールだが、いくつかのUPnP魔法新しいアドレス、および再起動時にのみルールを呼び出すsshd。自分でルーター内にポートフォワーダーを設定しましたか。

または、変更するのはサーバーの内部 IPです。その場合、DHCPで何かがひどく壊れています。サーバーに固定内部アドレスを与えます。

または、IPV6を使用していますか?デバイスがIPを変更し続けて追跡しにくくする構成がいくつかあります。たとえば、https://www.internetsociety.org/blog/2014/12/ipv6-privacy-addresses-provide-protection-against-surveillance-and-tracking/を参照してください -しかし、その場合は、元の投稿で言及する。これは、ルーターがNATをまったく実行していないことを意味する場合があり、私の元々のアイデアはルーターの背後でも有効です。


2
質問で尋ねられたものに実際に対処する最初の回答であることに対して+1。
カスペルド

@Guntram Blohm答えてくれてありがとう!サーバーはルーターの背後にあります。このシナリオでは、これら2つの可能性がまだ当てはまりますか?その場合は、翌日か、ターゲットマシンにローカルにアクセスできるときに、両方をチェックします。
リチャード

11

ダイナミックDNSは1つのオプションで、別のオプションはサーバーにメールを送信するか、IPを送信します。単純なHTTP呼び出し(要求を制御してログオンするエンドポイントに対して)を行います。

他の方法でパブリックネットワーク全体を解決することも可能です。サーバーにリバーストンネルまたはVPN接続をセットアップすることができますが、これはIPの変更の影響を受けません。

新しいアドレスで応答しないサービスについて:これは、ネットワークの設定に完全に依存します。例:DHCPを介した内部インターフェイス上のWAN IPと、起動時に既知のインターフェイス上のIPのみをリッスンするように設定されたSSHサーバーは、インターフェイスの変更時にsshdを再起動する必要があることを意味します。


1
質問で説明されているように、新しいIPアドレスを見つけるためのソリューションが既に用意されています。したがって、動的DNSを追加しても、実際には問題は解決しません。前述の問題は、IPアドレスが変更されるとsshサーバーが応答を停止することです。あなたはその問題に対処していません。VPN接続とリバーストンネルは、IPが変更されたときに動作を停止すると予想されるOTOHであるため、それらを自動的に再起動するための場所が必要です。
カスペルド

7

本当にddnsサービスを調べる必要があります。動的IPアドレスを使用して特定のマシンにリモートで接続できる限り。ddnsは、最も一般的に使用されるソリューションです。

オーバーヘッドhttps://noip.com同じネットワーク上で実行中の1-3機用およびアカウントのサインアップ(それはだ、errr ... supposedly..coff..cof ...無料(イム間違っていない場合は、いけないの引用ここで私:これらの「無料」サービスのいずれかを信頼してからしばらく経ちました...)。Afraid DNS(https://freedns.afraid.org/ さらに、CiscoのOpen DNSも利用できます(これがあなただけのクライアントではないことを条件に、アンブレラアカウントのトライアルにサインアップし、スピンして実際にサインアップすることをお勧めします)取引>>>彼らは、クライアントのIPが変更されるたびにddnsホスト名を自動的に更新するGUIのようなダウンロード可能な拡張機能の1つを取得しました。クライアントの1つを呼び出して、GUIをダウンロードするように頼まなければならない場合....])


3
これは、IPアドレスを変更する際にホストにアクセスするのに確かに役立ちますが、それは質問が尋ねているものではありません。問題は、IPアドレスが変更されたときにsshサーバーが応答を停止する理由とその修正方法です。動的DNSサービスはそれを解決しません。
カスペルド

4

SSHをセットアップすることができ、IPアドレスが変更されるまで、ローカルでもリモートでも動作します。それが起こると、新しいIPアドレスを使用してもリモートで接続できなくなります。

DHCPの変更が有効になるまでに時間がかかる場合があります。ターゲットマシンでDHCPクライアントをリサイクルしてみてください

$> sudo dhclient -r
$> sudo dhclient
Do I need to restart the service every time the IP address changes?
If so, why?

いいえ/etc/ssh/sshd_conf。設定が変更されたときにのみ、sshサービスをリサイクルする必要があります()。

SSHアクセスを許可するためにIPアドレスが変更された場合に行う必要がある他のアクションはありますか?

番号。

ターゲットマシンにsendmailがセットアップされていることを前提とするソリューションがあります。

このスクリプトは、世界が考えているIPアドレスを示す電子メールを送信します(ipify.orgに感謝)。メールには常に最新のIPアドレスが割り当てられます。

  1. dhcp-notify bashスクリプトを作成します(拡張子.shなし)
  2. スクリプトを入れる /etc/dhcp/dhclient-exit-hooks.d

    #!/bin/sh
    case "$reason" in (BOUND|RENEW|REBIND|REBOOT)
    (
       echo To: me@my.email
       echo From: me@my.email
       echo "Content-Type: text/html; "
       echo Subject: DHCP reason: $reason
       echo
       echo Your IP address is: `curl -s https://api.ipify.org`
    ) | sendmail -t
    ;;
    esac
    

これが機能しない場合は、常に現在のIPアドレスを送信するようにcronをセットアップできます(caseステートメントを失います)。

#!/bin/sh
(
   echo To: me@my.email
   echo From: me@my.email
   echo "Content-Type: text/html; "
   echo Subject: IP address change
   echo
   echo Your IP address is: `curl -s https://api.ipify.org`
) | sendmail -t

私はちょうどこれを提案しようとしていました、それは素晴らしいアイデアであり、質問を読んだときに頭に浮かんだ最初のものです。また、api.ipify.orgに問題がある場合(何らかの理由で学校のネットワークでブロックされています)、数か月前に作成したこの同じサイトであるfindip.win
undo

@karlchilders答えてくれてありがとう!IPアドレスを報告するcronスクリプトを既に持っていますが、dhclientフックについては知りませんでした。すごいです!IPが実際に変更されたときに報告されるようにしたいだけです。質問:このスクリプトが機能してIPアドレスを報告できる場合、dhclientをリサイクルするとSSHアクセスに影響するのはなぜですか?
リチャード

@karlchildersまたは、このスクリプトは、dhclientを手動でリサイクルする場合にのみ機能しますか?
リチャード

dhclient -r; dhclientはdhcpリースを更新して、ホストが最新になるようにします。フックは、dhcpイベントが手動またはその他で発生したときにいつでも機能します。
karlchilders

@Richard回答の1つを優先回答としてマークしてください。ありがとうございました。
karlchilders

3

枠を超えて考える-固定IPv6アドレスを手配できますか?通常、変更が必要なのはIPv4アドレスのみです。不足しているためです。


プルダウンするIPアドレスは、実際には毎回IPv6です。
リチャード

1
@リチャード:あなたのためにそれが機能しないと聞いて申し訳ありません。IPv4でこの問題を抱えている他の人たちに答えを残します。
MSalters

@Richard質問では、IPv6を扱っていることを本当に言及する必要があります。これにより、問題はまったく異なります。
ドゥブ

1
@Dubuそれは確かに問題を異なるものにします。この種の問題はIPv6で発生することは想定されていないため、誰もがIPv4であるとみなしたのかもしれません。しかし、実際には、静的アドレスではなくプライバシーアドレスを誤って使用すると、説明されている症状の一部が発生する可能性があります。たとえば、WebサイトにIPアドレスを尋ねると、静的アドレスではなくプライバシーアドレスが表示されます。そして、それをssh接続に使用するのは良い考えではありません。sshサーバーが再起動されるまで、なぜ機能しないのかについてはまだ説明していません。
カスペルド

1
@Dubu:それはかなり非標準的なアプローチです。DHCPv6-PD(プレフィックス委任)とDHCP一意ID(DUID)の組み合わせは、これを防ぐ必要があります。
-MSalters

1

私がほぼ1年間やってきたこと。私は地元の大学でスピーチをしているときに、今年1月にあなたの問題に遭遇しました。

それ以来、このスクリプトは私のマシンで実行されています://かなりわかりやすい//

import smtplib
from requests import get
import time

user = 'exampleemail@gmail.com'
psd = 'examplepassword'
msg = 'Hey, your ip has changed! Use this one from now on: '
currip = '0.0.0.0' # It'll send an email the first time you execute this aswell
while True:
    newip = get('https://api.ipify.org').text
    if currip == newip:
        print("nonewip")
        #You can just comment the line above this one if you want to
    else:
        tmpmsg = "\n"+msg + newip +" The old one used to be: "+currip
        currip = newip
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.connect('smtp.gmail.com')
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(user,psd)
        #You can change the second parameter, use ('from','to','message')
        server.sendmail(user, user, tmpmsg)

        server.quit()
        with open('/home/pi/DEV/iphistory.txt', 'a') as f:
            f.write('newip: '+currip+'\n')
            f.close()
        print('New IP Found: '+tmpmsg)
    time.sleep(7200)

Python 3.xは問題なく動作するはずです。

マシンのパブリックIPが変更されるたびに、受信ボックスにメールが届きます。

さて、あなたの質問に関して:

IPアドレスが変更されるたびにサービスを再起動する必要がありますか? サービスを再起動することでssh接続を再確立することを意味する場合、はい。

もしそうなら、なぜですか? 通信しようとしているアドレスが探しているサービスを提供しなくなった場合。もうあなたのマシンではありません。

SSHアクセスを許可するためにIPアドレスが変更された場合に行う必要がある他のアクションはありますか? 新しいアドレスにSSHするだけです。

乾杯!JSR


回答@JSRをありがとう!実際にIPアドレスを報告する同様のスクリプトを作成しました。しかし、変更後、新しいIPアドレスを知っていても、リモートマシンにSSHで接続できません。その問題に遭遇しましたか?
リチャード

正しいアドレスを取得していると確信していますか?その場合は、IPを取得したらpingを試してください。また、知らなかった場合に備えて、「python3 scriptname.py&」を使用してスクリプトをバックグラウンドで実行できます。また、ルーターの転送ポートを確認します。ローカルIPは変更はありませんが、それでもチェックする価値があります。
ハイメサトレレイ

はい、IPは正しいです。ターゲットマシンでSSHサービスを再起動すると、再び接続できます。しかし、なぜそうなるべきかはわかりません。
リチャード

@Richardここでの問題は、IPが変更されるため、認証に使用しているRSAキーが要求しているRSAキーと一致しないため、ホストがすべての接続を停止することです。私は決してこのトピックの専門家ではないので、私の言葉を事実として受け取らないでください...しかし、あなたの状況は、たった今言ったことのためにそのようなものです。
ハイメサトレレイ

1

これを別の側面から見る価値があります。通常、注意が必要なマシンから外部接続作成する方がはるかに簡単です(DNS、NAT、およびその他のファイアウォール設定はまったく関係ないか、はるかに単純です)。

これを使用して、リモートマシンに入るための防弾でシンプルなソリューションを確立できますR。唯一の要件は、sshローカルマシンの1つにパブリックアクセスを提供できることです(呼び出しましょうS)。次に、次の手順を実行します。

  1. 外向きの作成sshから接続RするSに逆トンネルバックを確立しますR

    ssh -L 22:<address-of-S>:22000

  2. S、リバーストンネルを使用sshしてリモートマシンに接続しRます。

    ssh -p 22000 127.0.0.1

手順1は、支援が必要なときにリモート側で手動でオンデマンドでトリガーできます。または、Rそのような逆トンネルを継続的に維持するサービスを作成できますS

このようなセットアップを使用して、ファイアウォール/ NATの背後にあり、DNSエントリがまったくないリモート(モバイル)システムにログインしました。


1

リモートログインのみが必要な場合は、 moshを。IPの変更に非常にうまく対応できることに加えて(スイッチ中の遅延はほとんどありません)ssh、ローカル予測エコー、低遅延、リンク切れからの高速回復など、plain よりも他の利点もあります。

特に必要な場合ssh(X11転送などが必要な場合)、できればUDPを介して、短いキープアライブでVPN(たとえばOpenVPN)をセットアップすることをお勧めします。VPN経由のTCP接続(つまり、ssh)は、IPの変更後も回復し、接続されたままになりますが、少し時間がかかります(最大1分程度)が、/proc/sys/net/ipv4/tcp_*より受け入れやすくするためにエントリを再生できます。

編集:

  • moshはssh認証を必要としますが、一度認証されると、ログアウト(または再起動)するまで接続が維持さsshれ、余暇に障害を調査できます(例:strace -f -pいつでも pid_of_sshd
  • moshなしsshで使用することができます、ここから適応され答え

サーバーで次を実行します。

mosh-server new -p $randomport -- $shellprogram

次のような結果が得られます QzdRHbAWzL7eRobi75DCrz

クライアントで次を実行します。

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

ご了承ください $serveripIPなければならず、ホスト名解決がないことにて。

鍵を一方から他方に取得する方法はあなた次第です。事前共有キーで暗号化し、インスタントメッセージング、メール送信、またはローカルユーザーに電話で指示させることをお勧めします。

  • 本当に問題がある場合は、スタンドアロンデーモンとしてではなく、そこからsshをsshインストールinetdして実行します。たとえば、「クラシック」inetd.confのこの設定行によって、ログインするたびに新しいデーモンが実行されます(すべてではないことに注意してくださいinetdフォークはipv6を処理します):

ssh stream tcp6 nowait root /usr/sbin/sshd sshd -i


1
@Radovanの回答をありがとう!Moshはおもしろそうに見えますが、認証にSSHを使用しているようです。だから私の問題の根源はまだ存在するでしょう、正しいですか?ドキュメントを誤解した場合はお知らせください。
リチャード

@リチャードはい、しかし可能性があります...私は私の答えを編集しました。
ラドヴァンガラビク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.