SSH의 ControlPath가 IPv4와 IPv6를 구별하도록 만드는 방법은 무엇입니까?

SSH의 ControlPath가 IPv4와 IPv6를 구별하도록 만드는 방법은 무엇입니까?

나는 그것을 사용하고 있다

ControlMaster   auto
ControlPath     ~/.ssh/tmp/%l_%r@%h:%p

내에서는 ~/.ssh/configSSH를 통해 호스트에 액세스할 때 동일한 연결을 사용하여 여러 세션이 열립니다.

이는 대부분의 사용 사례에서 잘 작동하지만 IPv4와 IPv6를 통해 동시에 동일한 호스트 이름에 연결할 수는 없습니다. 다른 모든 연결은 IPv4와 IPv6를 ControlPath구별 할 수 없기 때문에 첫 번째 연결에서 생성된 제어 소켓을 사용합니다. IPv6 연결.

IPv4 및 IPv6 연결에 대해 별도의 제어 소켓을 제공하는 방법이 있습니까(아마도 소켓 경로에서 원격 호스트 이름 대신 원격 IP를 사용하는 방법을 찾는 것)?


편집 #1

Match방금 및 파일에서 사용할 수 있는 옵션을 기억 하고 다음을 시도했습니다.ssh_configsshd_config

Match AddressFamily inet
    ControlPath     ~/.ssh/tmp/%l_%r@%h:%p.inet

Match AddressFamily inet6
    ControlPath     ~/.ssh/tmp/%l_%r@%h:%p.inet6

불행히도 이것은 실패합니다."일치 속성 AddressFamily는 지원되지 않습니다."호스트에 연결하려고 하면 다시 원점으로 돌아가게 됩니다...

답변1

이는 일반적인 사용 사례가 아니므로 이를 수행할 수 있는 직접적인 방법은 없습니다. 그러나 너무 많은 원격 호스트가 필요하지 않은 경우 사용자 프로필을 사용하여 이 문제를 해결할 수 있습니다.

Host hostname-4
    Hostname hostname
    AddressFamily inet
    ControlPath ~/.ssh/master4-%l%h%p%r
Host hostname-6
    Hostname hostname
    AddressFamily inet6
    ControlPath ~/.ssh/master6-%l%h%p%r

답변2

"래퍼" 및 "패치" 방법을 개별적으로 찬성/반대 투표할 수 있도록 내 답변을 두 개의 개별 답변으로 나누었습니다.

해결 방법 1: 래퍼 함수 작성

ssh ()
{
    controlpath=""
    for argument in $@
    do
        if [[ "$argument" = "-"*"4"* ]]
        then
            controlpath="~/.ssh/tmp/%l_%r@%h:%p.inet"
        fi
        if [[ "$argument" = "-"*"6"* ]]
        then
            controlpath="~/.ssh/tmp/%l_%r@%h:%p.inet6"
        fi
    done

    if [ -n "$controlpath" ]
    then
        /usr/bin/ssh -o "ControlPath=$controlpath" $@
    else
        /usr/bin/ssh $@
    fi
}

ssh이 래퍼 함수는 , 및 에 대해 별도의 제어 소켓을 생성하도록 지시합니다 . 이와 같은 내용을 올바르게 구문 분석하지 못할 수도 있지만(기술적으로 허용되는 경우에도) 간단한 시나리오에 대한 가장 간단한 해결 방법이어야 합니다.ssh hostssh -4 hostssh -6 host
ssh -464466 host

답변3

"래퍼" 및 "패치" 방법을 개별적으로 찬성/반대 투표할 수 있도록 내 답변을 두 개의 개별 답변으로 나누었습니다.

해결 방법 2:출처를 이용하세요, 루크!

내 답변 업데이트에서 언급했듯이 OpenSSH는 Match AddressFamily하지만. 구문 분석 시
해당 절을 추가하는 것은 매우 쉽습니다.Matchconf.c 읽기. 내 개념 증명 패치는 작동하지만 하드코딩된 문자열이 많이 포함되어 있으므로 고려를 위해 OpenSSH 유지 관리 담당자에게 제출하기 전에 확실히 더 많은 작업이 필요합니다.

%aControlPath예를 들어 계산 결과를 any, 또는 으로 정의하기 위해 다른 자리 표시자를 추가할 수 없다면 사용된 주소 계열에 따라 inet살펴볼 가치가 있을 수도 있습니다 . 그러나 옵션이 평가되고 저장되는 순서에 inet6따라 문제가 발생할 수 있으므로 이 기능이 작동하려면 상당히 광범위한 변경이 필요할 수 있습니다.
플레이스홀더를 연결에 사용되는 실제 주소 계열로 확장하려는 나의 원래 아이디어에도 동일한 문제가 적용됩니다. 주소 계열은 적합한 제어 소켓이 존재할 때에도 발생하지 않는 호출에 의존합니다.AddressFamilyControlPath
gethostbyname()

관련 정보