複数のIPアドレスのSSH設定(ラウンドロビンまたはランダム)

複数のIPアドレスのSSH設定(ラウンドロビンまたはランダム)

私はそれぞれ独自のIPアドレス(192.168.1.22と192.168.1.178)を持つ複数のイーサネットポートを持つSSHジャンプホストとして使用するシステムを持っています。私は多くの仕事、特に大容量ファイル転送にSSHを使用しています。これら2つのイーサネットポート間でSSHトラフィックを均等に分散したいと思います。ラウンドロビン構成であるか、トラフィックがある程度均等に分散している場合は、接続するたびに2つのIPアドレスのうちの1つをランダムに選択するかどうかは関係ありません。

これに加えて、ジャンプホストはSSHを介して外部の世界からアクセスでき、2つのポート転送構成、つまり最初のIPアドレスを指す1つのポート(22と仮定)と別のIPアドレスを指す別のポート(2222と仮定)を使用します。します。 IPアドレス。おそらく、2つのIPアドレス間ではなく2つのポート間を「ループ」する方法を見つけることが重要です。これは、ネットワークの外にいるときにホストをジャンプすることが最も重要であるためです。

同様のもののSSH設定例はありますか?私は一つが見つかりません。たぶんMatchキーワードを使用しますか? 「ホスト」フィールドに複数のIPアドレスを追加しようとしましたが、最初のアドレスのみを使用し、残りは無視します。

ベストアンサー1

まあ、少し調査の最後に解決策を見つけました。

私は2つのスクリプトを書いたが、1つはという名前でon_lan、もう1つはという名前でしたseconds_are_even。その後、このスクリプトを実行して、使用する接続パラメータを決定しました。

スクリプトはPythonで書かれており、非常に簡単です。

ラン

#!/usr/bin/env python3                                                                                                       
from ipaddress import ip_address, ip_network
from itertools import chain
from sys import exit

from psutil import net_if_addrs

def ip_addr(candidate: str):
    try:
        return ip_address(candidate)
    except Exception:
        return None

def on_lan() -> bool:
    IPS = {ip_addr(a.address) for a in chain.from_iterable(addrs for addrs in net_if_addrs().values()) if ip_addr(a.address)}
    return any(ip in ip_network('192.168.XXX.0/24') for ip in IPS) # note that for this to work well, you don't wanna use a common LAN IP address range like 192.168.1.0/24

exit(0 if on_lan() else 1)

偶数秒

#!/usr/bin/env python3
from time import time
from sys import exit

T = int(time())

exit(0 if T % 2 else 1)

これら2つのスクリプトは4つの方法で組み合わせることができます。私たちは、LANにいるかどうかにかかわらず、同じかどうかにかかわらず、どちらかです。私のSSH設定は次のとおりです。

Host myserver.b
     ...

Match host *.b !exec ~/.ssh/scripts/on_lan !exec ~/.ssh/scripts/seconds_are_even
     Hostname <DOMAIN NAME>
     Port 2222

Match host *.b !exec ~/.ssh/scripts/on_lan exec ~/.ssh/scripts/seconds_are_even
     Hostname <DOMAIN NAME>
     Port 2222

Match host *.b exec ~/.ssh/scripts/on_lan !exec ~/.ssh/scripts/seconds_are_even
     Hostname 192.168.1.22
     Port 22

Match host *.b exec ~/.ssh/scripts/on_lan exec ~/.ssh/scripts/seconds_are_even
     Hostname 192.168.1.178
     Port 22

Host *.b
     ServerAliveInterval 30
     ServerAliveCountMax 2
     IdentityFile ~/.ssh/keys.d/id_ed2551

これは、実行時にssh server.b最初にLANにあることを確認し、現在の時刻(秒)が偶数であることを確認します。 LANにはローカルIPを使用し、それ以外の場合はパブリックドメイン名を使用します。次に、現在の時間(秒)をランダムに使用して、SSH要塞の2つの可能なインターフェイスを切り替えます。

おすすめ記事