Arch Linux(GUI 없음)를 실행하는 Raspberry Pi가 여러 개 있고 모두 액세스해야 합니다. 이러한 파이는 각 고유 위치의 방화벽 뒤에 있습니다. 현재 저는 openvpn을 사용하여 이에 연결하지만 시스템의 라이센스당 비용이 비쌉니다. 나는 그들의 액세스 서버를 사용합니다.
그래서 저는 VPN 서버(vps)에 로그인하고 특정 이름(OfficeDevice1991)을 검색하는 명령을 실행할 수 있는 시스템을 설계하고 설정하려고 합니다. 예를 들어 다음과 customcommandsearch "OfficeDevice1991"
같이 시스템의 IP 주소를 반환합니다. 또는 SSH를 통해 연결하는 데 사용할 수 있는 것입니다. 또한 연결된 모든 활성 장치를 나열하는 명령을 실행하는 기능도 찾고 있습니다. IP, 이름 및 활성화된 시간이 나열됩니다.
이 목표를 위해서는 물론 장치 이름(이 경우 OfficeDevice1991)이 포함된 항목을 만들어야 하며 그러면 pi가 내 vps 공용 서버에 연결할 수 있습니다. 공용 서버에서 로그인하여 연결된 모든 장치를 검색하고 SSH에 필요한 정보를 다시 얻을 수 있습니다.
나는 역방향 SSH를 조사해 왔으며 지금까지 테스트 파이를 연결하고 다음을 사용하여 vps에서 액세스했습니다.
PI:
ssh -fN -R 12345:localhost:22 -i /publickeyfile useraccount@ip //Pi's command to connect to vpn
가상 사설 서버:
ssh -p 12345 useraccount@localhost //command for vpn to connect to pi
이것은 훌륭하게 작동하지만 이 접근 방식을 사용하여 구현하려면 몇 가지 문제가 있습니다.
- 사용하지 않는 고유한 포트를 설정해야 합니다.
- 이러한 포트/터널을 열어두는 방법
- 각 장치를 식별할 수 있는 시스템을 마련해야 합니다. 각 포트를 로컬 텍스트 파일의 이름으로 기록할 수 있습니까? 가능하다면 각 장치의 SSH 설정에 이를 포함시키는 것이 좋습니다. 내가 사용하고 있는 포트가 다른 프로그램이나 이미 가지고 있는 장치에서 사용되고 있지 않은지 확인해야 합니다.
내가 하고 싶지 않은 일들
각 RPI에 대해 사용 가능한 포트를 확인하세요.
.ssh/config
위의 1부에서 RPI에 할당된 각 포트를 나타내는 이름을 추가하려면 수동으로 편집해야 합니다 .
나는 내 목표를 달성하는 방법에 대한 정보/도움을 얻기 위해 이 글을 쓰고 있습니다.
누구든지 나에게 적합한 솔루션을 제공할 수 있습니까?
답변1
OpenSSH >= 6.7+를 사용하는 솔루션은 다음과 같습니다.소캇:
OpenSSH >= 6.7을 사용할 수 있습니다.Unix 도메인 소켓 전달
이는 역방향 터널 끝점이 다음과 같음을 의미합니다.UNIX 청취 소켓전통적인 TCP 청취 소켓 대신. 그런 다음 간단한 명명 체계를 사용하여 RPI 떼를 더 쉽게 관리할 수 있습니다. 소켓 이름은 RPI에서 선택한(및 고정된) 이름이 됩니다(예: )
OfficeDevice1991
. 유효한 파일 이름이라면 이는 RPI의 유일한 속성일 수도 있습니다(유닉스 소켓 이름은 파일 이름 규칙을 따르기 때문입니다). 예를 들어 호스트 이름, 이더넷 또는 Wi-Fi 카드의 MAC 주소...SSH는 연결 자체가 아닌 터널링을 위해 Unix 소켓을 처리할 수 있습니다.
ProxyCommand
유닉스 소켓 클라이언트로 작동하려면 a의 도움이 필요합니다 .소캇Unix 소켓을 포함하여 다양한 연결을 처리할 수 있습니다.업데이트:
처리해야 할 또 하나의 구체적인 문제: Unix 소켓 파일은 완전히 종료할 때 삭제되지 않으며 충돌 후에도 삭제되지 않습니다. 여기에는 옵션이 필요합니다StreamLocalBindUnlink=yes
. 처음에는 이름에서 알 수 있듯이 이 옵션이 Unix 소켓이 생성되는 노드에 설정되어야 한다는 사실을 발견하지 못했습니다. 그래서 결국 클라이언트에 로컬 포워딩(-L
) 이 설정되었습니다.그렇지 않으면sshd_config
서버( )에서 원격 전달( )을 사용합니다-R
. OP가 찾았어요거기. 이 솔루션은 원격 전달을 사용합니다.VPS 구성:
mkdir /rpi-access
파일을 편집합니다(루트로)
sshd_config
(/etc/ssh/sshd_config
). 다음 추가 옵션이 필요합니다.StreamLocalBindUnlink yes
기본 옵션에 따라 다음이 필요할 수도 있습니다.
AllowStreamLocalForwarding yes
업데이트 2:
또한sshd_config
매개변수ClientAliveInterval
에 설정되어ClientAliveCountMax
합리적인 시간 내에 연결 끊김이 감지되도록 허용합니다. 예:ClientAliveInterval 300 ClientAliveCountMax 2
그러면 오래된 SSH 연결이 가능한 한 빨리 VPS에서 감지되고(예에서는 약 1,000만 개) 해당 SSHD 프로세스가 종료됩니다.
RPI 사용법:
ssh -fN -R /rpi-access/OfficeDevice1991:localhost:22 -i /privatekeyfile useraccount@ip
구성 파일에서 이는 다음과 같습니다.
Host ip User useraccount RemoteForward /rpi-access/OfficeDevice1991:localhost:22 IdentityFile /privatekeyfile
다시 반복하세요:
StreamLocalBindUnlink yes
sshd
VPS 측에서 설정옵션이 중요합니다. 정상적으로 종료하더라도 방금 생성한 소켓은 삭제되지 않습니다. 이 옵션을 사용하면 소켓이 있는 경우 사용하기 전에 삭제되어 추가 재연결을 위해 재사용할 수 있습니다. 이는 또한 단순히 소켓이 존재하는 것만으로는 RPI 연결된 것으로 간주될 수 없음을 의미합니다(그러나 아래 참조).이제 VPS에서 다음을 수행할 수 있습니다.
ssh -o 'ProxyCommand=socat UNIX:/rpi-access/%h -' rpiuseraccount@OfficeDevice1991
구성 파일로 예를 들어 RPI 이름이 다음으로 시작하는 것을 고려하십시오.사무 기기:
Host OfficeDevice* User rpiuseraccount ProxyCommand socat UNIX:/rpi-access/%h -
링크를 유지하려면 루프를 사용하세요.
연결이 종료될 때마다 RPI는 루프를 실행하여 ssh를 VPS에 다시 연결할 수 있습니다. 이를 위해 백그라운드 모드( no
-f
)를 사용할 수 없습니다. 연결 유지 메커니즘도 사용해야 합니다. TCPKeepAlive(시스템 수준) 또는 ServerAliveInterval(응용 프로그램 수준)로 사용 가능합니다. 내 생각에 TCPKeepAlive는 서버(연결을 받는 쪽)에서만 유용하다고 생각하므로 ServerAliveInterval을 사용하는 것이 좋습니다.해당 값(ServerAliveCountMax도 포함)은 다양한 기준에 따라 조정되어야 합니다. 특정 시간이 지나면 방화벽이 비활성 연결을 삭제하고, 원하는 복구 지연이 발생하고, 불필요한 트래픽이 생성되지 않습니다. 여기서는 300초를 가정합니다.
OfficeDevice1991 RPI:
#!/bin/sh while : ; do ssh -N -o ConnectTimeout=30 -o ServerAliveInterval=300 -R /rpi-access/OfficeDevice1991:localhost:22 -i /privatekeyfile useraccount@ip sleep 5 # avoid flood/DDoS in case of really unexpected issues done
원격 측에서 이전 연결 실패를 감지하지 못하고 이전 SSH 연결이 한동안 계속 실행 중이더라도
StreamLocalBindUnlink yes
어쨌든 Unix 소켓은 강제로 새 연결로 플러시됩니다.1. 이미 처리되었습니다.
customcommandsearch
1.에서 올바른 설정을 한 후ssh OfficeDevice1991
OfficeDevice1991에 연결할 필요 가 없습니다 . 를 사용하면 됩니다.VPS를 사용해야 하는 경우
root
사용자로 다음 명령을 실행하십시오.fuser /rpi-access/*
현재 연결된 RPI를 표시할 수 있습니다(물론 최근에 감지되기 전에 연결이 끊어진 RPI는 제외). 오래된 유닉스 소켓 파일은 바인딩된 프로세스가 없기 때문에 표시되지 않습니다.
답변2
다음은 상황에 대한 몇 가지 다른 해석입니다. 당신을 막을 수 있는 것이 아무것도 없기 때문에 여기서는 몇 가지 세부 사항을 생략하겠습니다.추가 질문하기이러한 경로 중 하나를 시도하면 구체적인 내용은 다음과 같습니다.
1. OpenVPN 액세스 서버 교체
OpenVPN 액세스 서버 비용이 엄청나다면 자체 OpenVPN 서버 배포를 고려해 보세요. 소프트웨어는 무료로 사용할 수 있습니다. 서버 엔드포인트(또는 로컬에 아무것도 없는 경우 VPS 또는 이와 동등한 것)와 이를 설정하는 기술만 있으면 됩니다. 이 목적에 사용할 수 있는 튜토리얼이 많이 있으므로 처음부터 시작할 필요가 없습니다.
설정이 완료되면 DNS를 사용하거나 /etc/hosts
호스트 이름(예: 사용자 이름)을 정의하여 OfficeDevice1991
서버의 적절한 VPN 엔드포인트 주소를 가리킬 수 있습니다.
2. autossh
대신 OpenVPN을 사용하세요
자체 엔드포인트가 있으면 autossh
각 Pi 시스템에서 시작할 때 "잘 알려진" 엔드포인트와 같은 것을 사용할 수 있습니다 ssh
(로컬에 없는 경우 VPS 또는 이에 상응하는 엔드포인트).
각 Pi에는 역방향 터널( )이 있으므로 각 Pi는 자체 포트 22 ssh -R
에 다시 매핑된 서버의 다른 포트 번호를 제공합니다 .ssh
항목을 신중하게 사용하면 유사한 항목을 ~/.ssh/config
실행하고 자동으로 매핑할 수 있으며 이는 OfficeDevice1991을 나타내는 Pi에 대한 일반적인 연결에 해당합니다.ssh OfficeDevice1991
ssh -p 12345 localhost
ssh
편집 내용에 추가한 일련의 질문에 답하세요.
who
또는 finger
각 Raspberry Pi의 연결 시간을 알려줍니다.
- 포트 49152~65535당신 것인가요?
- 이게
autossh
다 된 일이야 - CPU 이름
그리고
- 위의 #1과 같이
- 짧은
for x ... do ... done
루프가 자동으로 파일을 생성할 수 있습니다. 또한 수동으로 1000개의 항목을 만들고 싶지 않습니다.