영구 역방향 SSH 터널을 생성할 때 systemd를 실행하는 시스템에서 autossh가 유용합니까? 일반적으로 autossh는 -M 옵션이 0으로 설정된 서비스로 실행되어 링크 모니터링이 비활성화됩니다. 이는 autossh가 다시 시작하기 전에 ssh를 종료해야 함을 의미합니다. 매뉴얼 페이지에서:
모니터링 포트를 0으로 설정하면 모니터링 기능이 꺼지고, autossh는 ssh가 종료될 때만 ssh를 다시 시작합니다. 예를 들어 최신 버전의 OpenSSH를 사용하는 경우 ServerAliveInterval 및 ServerAliveCountMax 옵션을 사용하여 SSH 클라이언트가 더 이상 서버에 연결되어 있지 않은 것으로 확인되면 SSH 클라이언트가 종료되도록 할 수 있습니다. 여러 면에서 이는 모니터링 포트보다 더 나은 솔루션일 수 있습니다.
systemd 서비스 자체는 다음 옵션이 포함된 서비스 파일을 통해 이 작업을 수행할 수 있는 것으로 보입니다.
Type=simple
Restart=always
RestartSec=10
그렇다면 systemd 서비스에서 실행할 때 autossh는 중복됩니까? 아니면 SSH 연결을 유지하는 데 도움이 되는 다른 작업을 수행하고 있나요?
감사해요.
답변1
좋은 질문을 해주셔서 감사합니다. autossh -M 0으로 실행되는 시스템 서비스가 있습니다. 그리고 systemd와 함께 autossh를 사용하는 것이 중복된다는 것을 깨달았습니다.
이것은 내 새로운 서비스이며 autossh가 아닙니다. ssh 프로세스를 직접 종료해도 정상적으로 실행되고 다시 시작됩니다.
[Unit]
Description=autossh
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=
ExecStart=/usr/bin/ssh -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -o ExitOnForwardFailure=yes -R8023:localhost:22 sshtunnel@[address of my server] -N -p 22 -i /root/.ssh/id_rsa_insecure
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target
서비스 시작 방법:
- 서버에 sshtunnel 사용자를 생성합니다(루트 권한을 부여하지 않음)
- 암호화되지 않은 RSA 키 "id_rsa_insecure"를 /root/.ssh/에 넣으세요. 공개 부분을 서버의 /home/sshtunnel/.ssh/authorized_keys에 넣어야 합니다.
- 위 코드를 사용하여 "autossh.service" 파일을 생성하고 /etc/systemd/system에 배치합니다.
- 다음 명령을 실행하십시오.
sudo systemctl daemon-reload
sudo systemctl start autossh
sudo systemctl enable autossh
몇 가지 설명 사항:
ExitOnForwardFailure
이것이 제가 처음으로 놓쳤던 것입니다. 이 옵션이 없으면 어떤 이유로 포트 전달이 실패하면(실제로 그런 일이 발생합니다) SSH 터널은 존재하지만 쓸모가 없습니다. 따라서 종료하고 다시 시작해야 합니다.
/root/.ssh/id_rsa_insecure
이름에서 알 수 있듯이 키는 암호화되지 않으므로 특수 키여야 하며, 키를 사용하는 사용자가 백 채널을 생성하는 것 외에는 서버 측에서 어떤 작업도 수행할 수 없도록 제한해야 합니다. 가장 간단한 방법은 서버 측에서authorized_keys 파일의 동작을 제한하는 것입니다.
# /home/sshtunnel/.ssh/authorized_keys
command="/bin/true" ssh-rsa [the public key]
이렇게 하면 "sshtunnel" 사용자가 셸을 시작하고 명령을 실행하는 것을 방지할 수 있습니다.
추가 보안:
시도했지만 작동하지 않았습니다. 1) 서버 측: "sshtunnel" 사용자에 대한 /etc/passwd의 셸을 /bin/false로 변경합니다. 2) 서버 측: Permitopen=host:port sshtunnel을 추가합니다. Authorized_keys 파일 id_rsa_insecure 키
시도하지는 않았지만 작동할 것이라고 생각합니다. SELinux 사용자 프로필을 구성하여 "sshtunnel" 사용자를 추가로 제한할 수 있습니다(특정 포트 전달만 허용). 하지만 편리한 코드가 없습니다. 누구든지 코드를 가지고 있다면 알려주시기 바랍니다.
현재 솔루션에 존재하는 보안 버그에 대해 듣고 싶습니다. 감사해요
답변2
두 가지 방법을 모두 시도하는 것은 상대적으로 쉽기 때문에 두 방법의 신뢰성을 테스트하고 직접 확인하십시오.
autossh
내 생각엔 당신이 그 직업에 더 적합하다고 생각할 것 같아요 . autossh
실행되도록 설계됨전망, systemd
주로 다음을 위해 설계되었습니다.배경특정 서비스에 첨부되지 않음텔레타이프라이터.
또한 autossh
이 작업과 관련된 기능이 하나 이상 있어야 합니다.
autossh는 주기적으로(기본적으로 10분마다) 모니터 전달 포트에서 트래픽 전달을 시도합니다. 실패하면 autossh는 ssh 하위 프로세스를 종료하고(아직 실행 중인 경우) 새 프로세스를 시작합니다.
따라서 autossh
프로세스를 계속 실행하는 대신 연결이 ssh
실제로 작동하는지 확인하십시오.