⚠️ 함정: Telnet은 23번, SSH는 22번이다. 포트를 뒤바꾼 보기는 오답이다. 또 "Telnet은 암호화한다"거나 "SSH는 평문"이라는 정반대 서술도 함정이다. Telnet의 유일한 잔존 용도는 "포트가 열렸는지 테스트하는 도구"(telnet host 80)일 뿐, 실제 원격 접속에는 쓰지 않는다.
SSH가 안전한 이유는 접속 초기에 키 교환으로 세션 암호화 키를 안전하게 합의하기 때문이다. 이후 모든 명령·출력·비밀번호가 이 키로 암호화돼 흐르므로, 중간에서 가로채도 의미 없는 암호문만 보인다. Telnet은 이 과정이 없어 비밀번호가 그대로 노출된다.
# /etc/ssh/sshd_config — 핵심 보안 지시어Port 22 # 접속 포트(보안상 변경하기도 함)ListenAddress 0.0.0.0 # 수신 대기 주소Protocol 2 # SSH 프로토콜 버전(1은 취약, 2만 사용)PermitRootLogin no # root 직접 로그인 차단(보안 핵심)PasswordAuthentication yes # 비밀번호 인증 허용(키만 쓰면 no)PubkeyAuthentication yes # 공개키 인증 허용PermitEmptyPasswords no # 빈 비밀번호 로그인 금지MaxAuthTries 3 # 인증 시도 횟수 제한(무차별 대입 방어)LoginGraceTime 60 # 로그인 완료 제한 시간(초)AllowUsers alice bob # 접속 허용 사용자 화이트리스트DenyUsers guest # 접속 거부 사용자ClientAliveInterval 300 # 유휴 세션 점검 간격X11Forwarding yes # X11 GUI 포워딩 허용
설정 변경 후에는 데몬을 다시 읽혀야 한다.
sshd -t # 설정 문법 검사(중요: 잘못된 설정으로 잠기지 않게)systemctl restart sshd # 데몬 재시작
⚠️ 함정: PermitRootLogin no는 대표적인 보안 지시어다. root 직접 로그인을 막아 무차별 대입의 1순위 표적을 제거한다. 또 sshd_config(서버)와 ssh_config(클라이언트)를 헷갈리면 안 된다. "데몬 d가 붙은 sshd_config가 서버 설정"이다.
핵심 구분: PasswordAuthentication no로 바꾸면 비밀번호 로그인이 완전히 막히고 공개키 인증만 허용된다. 이것이 실무의 강력한 보안 설정이다. 단, 키를 미리 등록하지 않고 이 설정을 켜면 본인도 못 들어가므로, 반드시 키 등록 후에 적용해야 한다.
인터넷에 노출된 SSH 서버는 봇넷의 무차별 대입 공격을 끊임없이 받는다. PermitRootLogin no + PasswordAuthentication no(키 전용) + MaxAuthTries 3 조합이 표준 방어다. 여기에 포트를 22에서 바꾸면 자동화된 스캔의 상당수를 회피할 수 있어 실무에서 자주 쓰인다(다만 근본 방어는 키 인증이다).
공개키 인증은 "공개키는 자물쇠, 개인키는 열쇠"로 이해할 수 있다. 자물쇠(공개키)는 서버의 authorized_keys에 공개적으로 둬도 안전하고, 열쇠(개인키)는 클라이언트가 절대 유출하지 않는다. 서버가 자물쇠로 낸 도전(challenge)에 클라이언트가 열쇠로 답하면, 비밀번호 없이도 신원이 증명된다.
서버에 등록하는 것은 공개키(.pub)이고, 클라이언트가 보관하는 것은 개인키다. 이를 뒤바꿔 "개인키를 서버에 올린다"는 보기는 틀렸다(개인키 유출은 치명적). 또 ~/.ssh 권한이 느슨하면 키 인증이 무시되고 비밀번호를 다시 묻는 것도 함정이다.
핵심 구분: authorized_keys(서버에 둠, 접속 허용 공개키 목록)와 known_hosts(클라이언트에 둠, 접속했던 서버의 호스트 키 기록)는 서로 다르다. 전자는 "누구를 들일까", 후자는 "이 서버가 맞나(중간자 공격 탐지)"의 역할이다.
# 생성된 키 확인ls -l ~/.ssh/# id_ed25519 id_ed25519.pub authorized_keys known_hosts# 서버 측에서 등록된 공개키 확인cat ~/.ssh/authorized_keys# 상세 로그로 인증 과정 추적(문제 진단 시)ssh -v alice@192.168.1.10
SSH는 암호화 터널 안에 다른 연결을 실어 나를 수 있다. 방화벽 우회·안전한 접근에 강력하다.
종류
명령 옵션
동작
로컬 포워딩
-L 로컬포트:대상:대상포트
내 로컬 포트로 온 연결을 원격을 거쳐 대상으로
원격 포워딩
-R 원격포트:대상:대상포트
원격 서버 포트로 온 연결을 내 쪽 대상으로
동적 포워딩
-D 로컬포트
SOCKS 프록시로 동작(브라우저 등)
# 로컬 포워딩: 내 8080 → SSH서버 경유 → 내부 DB(3306)ssh -L 8080:db.internal:3306 alice@gateway# 이제 localhost:8080 접속이 내부 db.internal:3306으로 안전하게 터널링# 동적 포워딩: SOCKS 프록시로 모든 트래픽을 SSH 너머로ssh -D 1080 alice@gateway
로컬 포워딩(-L)은 "내 컴퓨터의 포트를 원격 너머의 서비스로 잇는 통로"다. 직접 못 닿는 내부망 DB를, SSH 게이트웨이를 징검다리 삼아 내 localhost처럼 쓰게 해준다. 모든 통로가 SSH로 암호화되므로 안전하다. "직접 못 닿는 내부 서비스 = 로컬 포워딩"으로 정리된다.
핵심 구분: 로컬(-L)은 내 쪽에서 시작해 원격 너머로 가고, 원격(-R)은 원격 쪽에서 시작해 내 쪽으로 들어온다. 방향이 정반대다. 동적(-D)은 특정 대상이 아니라 SOCKS 프록시로 모든 목적지를 받는다는 점이 다르다.