
아웃바운드 인터넷 접속이 가능한 호스트에 도달하기 위한 최소 인증 리버스 셸 프레임워크.
bepr는 아웃바운드 WebSocket 연결을 통해 작동하는 소형 인증 클라이언트/서버 역방향 셸 프로그램입니다.
하나의 바이너리로 서버 모드, 클라이언트 모드, 사용자 모드의 세 가지 모드를 모두 지원합니다. rpm, deb, pkg 설치 방향과 함께 패키징되어 있으며, 크기는 1MB입니다.
저는 여행 중에 집에 있는 컴퓨터를 공개 인터넷에 노출하지 않고 제어하고 싶어서 bepr을 만들었습니다. 이를 작동시키려면 도메인(TLS용)과 서버만 있으면 됩니다.
https://github.com/Aperocky/bepr/releases 로 이동하여 플랫폼에 맞는 패키지 버전을 찾으세요. 다운로드한 후 다음 명령어를 사용하여 설치합니다.
sudo installer -pkg bepr-<version>.pkg -target /
sudo dpkg -i bepr_<version>_<arch>.deb
sudo rpm -i bepr-<version>-<arch>.rpm
또는 업데이트 스크립트를 사용하여 스크립트를 실행하면 자동으로 설치됩니다:
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-deb.sh | sh
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-macos.sh | sh
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-rpm.sh | sh
이제 각 호스트의 용도에 맞게 설정하세요. 바이너리는 세 가지 모드 모두에서 작동하지만 자동으로 동기화되지는 않습니다. 떠나기 전에 설정을 완료하세요!
자체 TLS 인증서와 도메인이 필요합니다. 이 부분은 bepr에서 다루지 않습니다. 서버 설정 파일을 만듭니다:
# cat /etc/bepr/server.conf
bind = 0.0.0.0:443
key_dir = /etc/bepr/client-keys
tls_cert = /etc/bepr/tls/cert.pem
tls_key = /etc/bepr/tls/privkey.pem
서비스 시작:
linux:
sudo systemctl enable --now bepr
서버에서 등록된 클라이언트와 연결된 사용자를 나열할 수 있으며, 이는 로컬 소켓을 통해 이루어집니다.
[email protected]:~# bepr list
aperocky user disconnected
laptop client disconnected
mac_m1 client connected
pi_zero client connected
또한 이 로컬 소켓을 통해 클라이언트에 직접 연결할 수도 있으며, 이는 사용자 모드와 동일하게 동작합니다.
bepr connect laptop
이 기능은 도메인에 사용자 및 클라이언트 경로를 제공합니다:
$domain/bepr/client/mac_m1 # Connect from client
$domain/bepr/user/aperocky # Connect from user
연결되면 bepr connect 터미널의 stdin/stdout이 선택한 클라이언트 셸로 파이프됩니다. 클라이언트 셸은 PTY 내에서 실행되며, 서버는 원시 패스스루 바이트 라우터 역할을 합니다. 여러 클라이언트가 동시에 서버에 연결될 수 있지만, 하나의 클라이언트에는 한 번에 하나의 사용자만 연결될 수 있습니다.
각 클라이언트 호스트에서 키 쌍을 생성합니다:
ssh-keygen -t ed25519 -f /etc/bepr/client-keys/pi_zero
공개 키를 서버의 key_dir에 복사합니다:
/etc/bepr/client-keys/pi_zero.pub -> client ID pi_zero on server
클라이언트 설정 파일을 만듭니다. URL의 클라이언트 ID는 서버의 공개 키 파일명과 일치해야 합니다:
# cat /etc/bepr/client.conf
server = wss://server.example/bepr/client/pi_zero
private_key_path = /etc/bepr/client-keys/pi_zero
shell = /bin/sh
서비스/데몬 시작:
linux:
sudo systemctl enable --now bepr
mac:
sudo launchctl bootstrap system /Library/LaunchDaemons/com.bepr.plist
sudo launchctl enable system/com.bepr
sudo launchctl kickstart -k system/com.bepr
이전 경로 domain/bepr/$name도 이전 클라이언트와의 역호환성을 위해 허용됩니다. 서비스는 서버와 동일한 방식으로 시작합니다.
참고: 클라이언트는 사용자가 연결될 때가 아니라 서버에 연결되는 즉시 셸을 실행합니다. 셸은 백그라운드에서 지속적으로 실행됩니다. 연결했을 때 터미널 상태가 좋지 않다면 stty sane을 실행하세요. 셸 자체가 응답하지 않으면 클라이언트 머신에서 PID로 셸을 종료하세요. 클라이언트는 자동으로 다시 연결되며 10초 이내에 새 셸을 실행합니다.
서버 소켓을 SSH 포워딩하지 않고 원격 머신에서 작동하려면 사용자 모드를 사용하세요. 서버에서 서버 설정에 user_key_dir을 추가합니다:
# cat /etc/bepr/server.conf
bind = 0.0.0.0:443
key_dir = /etc/bepr/client-keys
user_key_dir = /etc/bepr/user-keys
tls_cert = /etc/bepr/tls/cert.pem
tls_key = /etc/bepr/tls/privkey.pem
사용자의 공개 키를 서버에 복사합니다:
/etc/bepr/user-keys/aperocky.pub -> user ID aperocky
사용자 머신에서 사용자 설정 파일을 만듭니다:
# cat ~/.config/bepr/user.conf
server = wss://server.example/bepr/user/aperocky
private_key_path = ~/.ssh/aperocky_user_ed25519
bepr list와 bepr connect는 추가 플래그 없이 이 설정을 자동으로 사용합니다. 명령은 서버에서 클라이언트 호스트로 직접 연결됩니다.
bepr 바이너리는 서비스/패키징 없이 직접 명령과 인수로 수동 실행할 수 있습니다:
./bepr server --config $server_config_path
./bepr client --config $client_config_path
./bepr connect --socket $socket_file_path $destination