최근 Upstart에는 소켓 브리지를 통해 들어오는 연결에서 작업을 시작하는 새롭고 멋진 systemd 기능이 있습니다. 포트 22에 처음 연결할 때 sshd를 시작하고 싶습니다.
이제
start on socket PROTO=inet PORT=22
ssh.conf에 upstart-socket-bridge 및 upstart-udev-bridge 작업이 실행 중입니다.
포트 22에서 내 상자에 연결하면 ssh 작업이 정상적으로 시작되지만 sshd가 나에게 응답하지 않습니다. 마치 받아들이지 않고 받아들일 수 없는 것과 같습니다. 연결을 다시 시도하는 것은 도움이 되지 않습니다. sshd가 현재 실행 중이고 연결을 정상적으로 수락해야 하는 경우에도 마찬가지입니다. Upstart는 여전히 그것을 엉망으로 만들고 있습니다!
소켓 이벤트 매뉴얼 페이지말하다:
들어오는 연결이 감지되면 소켓을 나타내는 파일 설명자가 문제의 작업에 전달되어 연결을 허용(2)할 수 있습니다. 또한 환경 변수 UPSTART_JOB에는 이벤트 이름("소켓")이 포함되고 환경 변수 UPSTART_FDS에는 청취 소켓에 해당하는 파일 설명자 번호가 포함됩니다.
이는 이를 활용하려면 ssh가 소켓 FD 전달에 대한 특정 지원이 필요하다는 것을 의미합니까? 그렇다면 모든 재미가 좀 망가질 것 같아요 :/
답변1
소켓 브리지를 사용하려면 제공된 소켓을 처리할 수 있는 패치된 데몬이 필요합니다.
에서 man socket-event
:
들어오는 연결이 감지되면 소켓을 나타내는 파일 설명자가 문제의 작업에 전달되어 연결을 허용(2)할 수 있습니다. 또한 환경 변수 UPSTART_JOB에는 이벤트 이름("소켓")이 포함되고 환경 변수 UPSTART_FDS에는 청취 소켓에 해당하는 파일 설명자 번호가 포함됩니다.
일반적으로 sshd는 단순히 소켓을 생성하고 그에 대해 listening()을 실행한 다음 accept()를 실행하지만 sshd는 UPSTART_FDS 환경 변수를 읽고 그에 대해 accept()만 수행하면 됩니다.
답변2
sshd를 필요할 때 실행하는 대신 일반 서비스로 실행하는 것이 좋습니다. sshd는 가장 극단적인 경우를 제외하고는 자체적으로 연결을 관리할 수 있습니다.
필요에 따라 sshd를 반드시 실행해야 하는 경우 문제 해결에 다음 명령이 도움이 됩니다.
ps auxw | grep ssh
, 실행 중인 프로세스 목록에서 ssh에 대한 grep을 실행합니다.netstat -tlp
, 서비스가 현재 수신 대기 중인 TCP 포트 목록을 제공합니다. SSH가 여기에 나열되어야 합니다. 그렇지 않은 경우 sshd가 제대로 구성되지 않은 것입니다.ssh -vvv
(클라이언트에서 실행) SSH 세션의 자세한 디버그 출력은 오류 지점을 찾아내는 데 도움이 됩니다.nmap <hostname>
(클라이언트에서 실행 - nmap 패키지 설치 필요) 호스트의 열린 포트를 나열합니다. SSH가 여기에 나열되지 않았지만 출력에는 나열되어 있다면netstat
방화벽 문제가 있을 가능성이 높습니다.