web-dev-qa-db-ja.com

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

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

時々管理タスクを手伝ってくれるクライアントがいます。サポートが必要な場合はマシンにSSHで接続する必要がありますが、静的IPがないため、サーバーのパブリックIPは常に変化しています。 LinuxマシンのIPアドレスを報告する小さなスクリプトを作成しましたが、1日に1回正午に変更されることがわかりました。

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

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

[〜#〜]更新[〜#〜]

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

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

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

12
Richard

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

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

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

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

私が想像できることは、サーバーがルーターの背後になく、独自のPPPoE接続、およびa)特定のサーバーにバインドしている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.x.y.zまたは192.168.x.yアドレスがいくつかあるはずです。外部アドレスに接続すると、ルーターは内部アドレスへのポート転送ルールを使用します。

このポート転送は、外部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=をまったく実行していないことを意味している可能性があり、私の元のアイデアはルーターの背後でもまだ有効です。

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

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

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

11
John Keates

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

https://noip.com にアクセスし、アカウントにサインアップします(それは、エラーです... ..coff..cof ..同じネットワーク上で実行されている1〜3台のマシンは無料です(私が間違っていない場合は、ここで私を引用しないでください:iveはこれらの「無料」サービスのいずれかを信頼して以来しばらく経っています... Afraid DNS( https://freedns.afraid)などの他の代替手段もあります。 .org / そして、CiscoのOpen DNS:も利用できます(これがあなただけのクライアントではない場合に限り、包括的アカウントの試用版にサインアップして試してみて、後で使用することをお勧めします)実際の契約へのサインアップ>>>彼らは、クライアントのIPが変更されるたびにddnsのホスト名を自動的に更新するGUIのようなダウンロード可能な拡張機能の1つを手に入れました。 m知っている[クライアントの1つを呼び出して、GUIをダウンロードするように依頼する場合に備えて....])

7
dotbiggie

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?

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

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: [email protected]
       echo From: [email protected]
       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: [email protected]
   echo From: [email protected]
   echo "Content-Type: text/html; "
   echo Subject: IP address change
   echo
   echo Your IP address is: `curl -s https://api.ipify.org`
) | sendmail -t
4
karlchilders

既成概念にとらわれず、固定のIPv6アドレスを配置できますか?変更が必要なのは、通常はIPv4アドレスのみであるため、不足しているためです。

3
MSalters

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

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

import smtplib
from requests import get
import time

user = '[email protected]'
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

1

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

これを使用して、リモートマシンRに侵入するための防弾でシンプルなソリューションを確立できます。唯一の要件は、自分のローカルマシンの1つにパブリックsshアクセスを提供できることです(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
Alex O

リモートログインだけが必要な場合は、 mosh を使用します。 IPの変更(スイッチ中のレイテンシがほとんどない)にうまく対応できることとは別に、ローカル予測エコー、低レイテンシ、壊れたリンクからの回復がはるかに速いなど、プレーンsshに比べて他の利点もあります。

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

編集:

  • moshは認証にsshを必要としますが、認証されると、ログアウト(または再起動)するまで接続が維持され、sshの失敗を自由に調査できます(例:strace -f -p pid_of_sshd
  • moshなしでsshを使用することが可能です。回答は here から変更されました。

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

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

あなたはQzdRHbAWzL7eRobi75DCrzのような結果を得る

クライアントで実行:

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

$serveripはIPでなければならず、ホスト名解決ではないことに注意してください。

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

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

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

1