여러 IP 주소에 대한 SSH 구성(라운드 로빈 또는 무작위)

여러 IP 주소에 대한 SSH 구성(라운드 로빈 또는 무작위)

나는 각각 자체 IP 주소(만일 경우에 대비해 192.168.1.22 및 192.168.1.178)를 가진 여러 이더넷 포트가 있는 SSH 점프 호스트로 사용하는 시스템을 가지고 있습니다. 저는 많은 일, 특히 대용량 파일 전송에 SSH를 사용합니다. 이 두 이더넷 포트 간에 SSH 트래픽을 균등하게 분배하고 싶습니다. 라운드 로빈 구성인지, 트래픽이 어느 정도 균등하게 분산되어 있다면 연결할 때마다 두 개의 IP 주소 중 하나를 무작위로 선택하는지는 상관하지 않습니다.

이 외에도 점프 호스트는 SSH를 통해 외부 세계에서 액세스할 수 있으며 두 개의 포트 전달 구성, 즉 첫 번째 IP 주소를 가리키는 한 포트(22라고 가정)와 다른 IP 주소를 가리키는 다른 포트(2222라고 가정)를 사용합니다. IP 주소 . 아마도 두 개의 IP 주소 사이보다는 두 개의 포트 사이를 "루프"하는 방법을 알아내는 것이 더 중요합니다. 왜냐하면 네트워크 외부에 있을 때 호스트를 점프하는 것이 가장 중요하기 때문입니다.

비슷한 것에 대한 SSH 구성 예가 있습니까? 나는 하나를 찾을 수 없습니다. 어쩌면 Match 키워드를 사용할까요? "호스트" 필드에 여러 IP 주소를 추가하려고 시도했지만 첫 번째 주소만 사용하고 나머지는 무시합니다.

답변1

글쎄, 약간의 조사 끝에 해결책을 찾았습니다.

나는 두 개의 스크립트를 작성했는데, 하나는 이라는 이름 on_lan이고 다른 하나는 이라는 이름이었습니다 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)

이 두 스크립트는 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 요새에 있는 두 가지 가능한 인터페이스 사이를 전환합니다.

관련 정보