CentOS 7에서 SSH 포트를 안전하게 변경하는 방법

안녕하세요. 비전 IDC 기술팀입니다.

SSH 기본 포트인 22번은 인터넷 전역에서 자동화된 로그인 시도가 끊임없이 들어오는 포트입니다. SSH 포트를 다른 번호로 바꾸는 것만으로 보안이 완성되지는 않지만, 무차별 대입 시도와 로그 노이즈를 크게 줄일 수 있어 서버 운영에 도움이 됩니다.

다만 CentOS 7에서는 sshd_config만 수정하면 SELinux와 firewalld 때문에 sshd가 시작되지 않거나 새 포트로 접속할 수 없어 서버에 들어가지 못하는 상황이 자주 발생합니다. 이 문서에서는 기존 22번 포트를 유지한 채 새 포트를 추가하고, 새 포트 접속을 확인한 뒤 22번을 닫는 안전한 순서로 SSH 포트를 변경하는 방법을 설명합니다. 예시 포트는 2222를 사용합니다.

적용 환경

  • 운영체제: CentOS Linux 7
  • SSH 서버: OpenSSH (sshd), 설정 파일 /etc/ssh/sshd_config
  • SELinux 관리 도구: semanage (policycoreutils-python 패키지)
  • 방화벽: firewalld
  • 예시 새 포트: TCP 2222

1. 작업 전 확인 사항

작업 도중 접속이 끊겨도 복구할 수 있도록 다음 사항을 먼저 준비합니다.

  • 현재 SSH 세션을 작업이 끝날 때까지 닫지 않습니다. 이미 연결된 세션은 sshd를 재시작해도 대부분 유지됩니다.
  • VPS는 VNC 또는 웹 콘솔, 단독서버는 KVM/IPMI 등 SSH를 거치지 않는 콘솔 접속 수단을 확인해 둡니다.
  • 서버 외부에 별도의 네트워크 방화벽이나 보안 정책을 사용하고 있다면 새 포트가 허용되어 있는지 확인합니다.

현재 sshd가 대기 중인 포트를 확인합니다.

sudo ss -tlnp | grep sshd

기본 상태라면 0.0.0.0:22[::]:22가 표시됩니다. 새로 사용할 포트가 다른 서비스에서 사용 중이지 않은지도 확인합니다. 아무것도 출력되지 않으면 사용 가능한 포트입니다.

sudo ss -tlnp | grep ':2222 '

SELinux와 firewalld 상태도 확인합니다.

getenforce
sudo firewall-cmd --state

2. sshd_config 백업

설정 파일을 수정하기 전에 원본을 백업합니다. 문제가 생기면 이 파일로 즉시 되돌릴 수 있습니다.

sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)
ls -l /etc/ssh/sshd_config*

3. SELinux에 새 SSH 포트 등록

SELinux가 Enforcing 상태인 CentOS 7에서는 sshd가 SELinux 정책에 ssh_port_t 유형으로 등록된 포트에서만 대기할 수 있습니다. 새 포트를 등록하지 않으면 sshd가 해당 포트를 열지 못하고, 설정에 따라 서비스 시작 자체가 실패합니다.

semanage 명령이 없다면 먼저 패키지를 설치합니다.

sudo yum install -y policycoreutils-python

현재 SSH 포트로 등록된 목록을 확인합니다.

sudo semanage port -l | grep ssh_port_t

기본 상태에서는 ssh_port_t tcp 22만 표시됩니다. 새 포트 2222를 추가합니다.

sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t

결과에 2222, 22가 함께 표시되면 등록된 것입니다.

SELinux가 Permissive 또는 Disabled 상태라면 이 단계를 생략해도 sshd는 동작하지만, 나중에 SELinux를 다시 활성화할 경우를 대비해 등록해 두는 것을 권장합니다.

4. firewalld에서 새 포트 허용

새 포트를 방화벽에 영구 규칙으로 추가하고 다시 불러옵니다. 이 단계에서는 기존 22번(ssh 서비스) 허용 규칙을 제거하지 않습니다.

sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

출력의 ports: 항목에 2222/tcp가 있고, services: 항목에 ssh가 그대로 남아 있는지 확인합니다.

5. sshd_config에 새 포트 추가

설정 파일을 엽니다.

sudo vi /etc/ssh/sshd_config

기본 파일에는 #Port 22가 주석 처리되어 있으며, 그 바로 위에 SELinux 시스템에서는 semanage로 포트를 등록해야 한다는 안내 주석이 있습니다. 앞 단계에서 이미 등록했으므로 포트만 추가하면 됩니다. Port 줄이 모두 주석 상태이면 기본값 22번을 사용합니다. 전환 기간 동안 두 포트를 모두 사용하도록 다음과 같이 Port 줄을 두 개 작성합니다.

#Port 22
Port 22
Port 2222

저장 후 설정 문법을 검사합니다. 아무 메시지도 출력되지 않으면 문법상 문제가 없는 것입니다.

sudo sshd -t

오류 메시지가 표시되면 해당 줄을 수정한 뒤 다시 검사합니다. 검사를 통과하지 못한 상태로 sshd를 재시작하지 마십시오.

6. sshd 재시작 및 대기 포트 확인

sudo systemctl restart sshd
systemctl status sshd

sshd가 두 포트에서 모두 대기하는지 확인합니다.

sudo ss -tlnp | grep sshd
LISTEN  0  128  0.0.0.0:2222  0.0.0.0:*  users:(("sshd",pid=1234,fd=3))
LISTEN  0  128  0.0.0.0:22    0.0.0.0:*  users:(("sshd",pid=1234,fd=5))
LISTEN  0  128     [::]:2222     [::]:*  users:(("sshd",pid=1234,fd=4))
LISTEN  0  128     [::]:22       [::]:*  users:(("sshd",pid=1234,fd=6))

위 출력은 예시이며 PID와 순서는 서버마다 다릅니다. 2222가 보이지 않는다면 SELinux 등록 누락 가능성이 높으므로 로그를 확인합니다.

sudo journalctl -u sshd -n 30 --no-pager

7. 새 포트로 접속 테스트

기존 세션은 그대로 둔 채 새 터미널 창을 열어 새 포트로 접속합니다. 서버 IP와 계정은 실제 값으로 바꿔 입력합니다.

ssh -p 2222 사용자명@서버IP

Windows에서 PuTTY를 사용한다면 Port 항목에 2222를 입력해 접속합니다. 자세한 사용법은 Windows PC에서 PuTTY로 SSH 접속하는 방법을 참고하십시오.

새 포트 접속이 되지 않는다면 22번 세션에서 다음을 차례로 확인합니다.

  • ss -tlnp에서 2222 대기 여부
  • semanage port -l | grep ssh_port_t에 2222 등록 여부
  • firewall-cmd --list-all2222/tcp 포함 여부
  • 서버 외부 네트워크 방화벽 정책

8. 기존 22번 포트 닫기

새 포트 접속이 정상적으로 확인되었다면 22번 포트를 닫습니다. 새 포트로 접속한 세션도 하나 열어 둔 상태에서 진행하는 것을 권장합니다.

sshd_config에서 Port 22 제거

sudo vi /etc/ssh/sshd_config
#Port 22
Port 2222
sudo sshd -t
sudo systemctl restart sshd
sudo ss -tlnp | grep sshd

이제 2222 포트만 표시되어야 합니다.

firewalld에서 기존 SSH 서비스 제거

sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

services: 목록에서 ssh가 사라지고 ports:2222/tcp만 남아 있는지 확인합니다. 마지막으로 새 터미널에서 다시 한 번 ssh -p 2222 접속을 확인합니다.

fail2ban 등 SSH 로그인 차단 도구를 사용하고 있다면 해당 도구의 SSH 감시 포트 설정도 새 포트로 함께 변경해야 차단이 올바르게 동작합니다.

9. 자주 발생하는 문제와 복구 방법

SSH 포트 변경 문제 점검
증상 가능한 원인 확인 및 해결 방향
systemctl restart sshd 실패 설정 문법 오류 또는 SELinux 포트 미등록 sshd -tjournalctl -u sshd를 확인하고, semanage port -a -t ssh_port_t -p tcp 2222를 실행했는지 확인합니다.
로그에 Bind to port 2222 ... failed: Permission denied SELinux가 새 포트 사용을 차단 semanage로 포트를 등록한 뒤 sshd를 재시작합니다.
로그에 Address already in use 다른 프로세스가 같은 포트 사용 ss -tlnp | grep ':2222 '로 점유 프로세스를 확인하고 다른 포트를 선택합니다.
sshd는 2222에서 대기하지만 외부 접속 시간 초과 firewalld 또는 외부 방화벽 미허용 firewall-cmd --list-all과 외부 방화벽 정책을 확인합니다.
semanage: command not found 관리 도구 패키지 미설치 yum install -y policycoreutils-python으로 설치합니다.
22번과 새 포트 모두 접속 불가 설정 오류 상태에서 기존 세션 종료 콘솔로 접속해 아래 복구 절차를 진행합니다.

콘솔에서 원래 설정으로 복구

SSH로 접속할 수 없게 되었다면 VPS의 VNC·웹 콘솔 또는 단독서버의 KVM/IPMI로 로그인해 백업 파일을 복원합니다. 백업 파일 이름의 날짜는 실제 파일명에 맞게 입력합니다.

ls -l /etc/ssh/sshd_config.bak.*
sudo cp -a /etc/ssh/sshd_config.bak.YYYYMMDD /etc/ssh/sshd_config
sudo sshd -t
sudo systemctl restart sshd
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

해결되지 않으면 비전 IDC 1:1 문의(https://visionidc.com/submitticket.php) 또는 텔레그램 VISIONIDC24로 문의해 주시기 바랍니다.

10. 관련 기술자료와 공식 참고자료

관련 비전 IDC 기술자료

공식 참고자료

11. 자주 묻는 질문

SSH 포트만 바꾸면 보안이 충분한가요?

포트 변경은 자동화된 공격 시도를 줄이는 보조 수단입니다. 포트 스캔으로 새 포트를 찾아낼 수 있으므로 강력한 비밀번호, SSH 키 인증, root 직접 로그인 제한, 로그인 실패 차단 같은 설정을 함께 적용하는 것이 좋습니다.

sshd를 재시작하면 현재 접속이 끊기나요?

일반적으로 이미 연결된 SSH 세션은 유지되고 새 연결부터 변경된 설정이 적용됩니다. 그래도 만일에 대비해 콘솔 접속 수단을 확보한 상태에서 작업하십시오.

scp나 sftp도 새 포트를 지정해야 하나요?

네. SSH를 사용하는 모든 도구에 새 포트를 지정해야 합니다. ssh는 소문자 -p 2222, scp는 대문자 -P 2222, sftp-P 2222를 사용합니다. 백업 스크립트나 배포 도구의 설정도 함께 수정하십시오.

새 포트로 접속할 때 호스트 키 경고가 다시 표시됩니다.

SSH 클라이언트는 기본 포트가 아닌 경우 [서버IP]:2222 형식으로 호스트 키를 별도로 기록하므로 처음 한 번은 확인 메시지가 표시될 수 있습니다. 서버의 호스트 키 자체를 바꾸지 않았다면 지문을 확인한 뒤 수락하면 됩니다.

마무리

이번 문서에서는 CentOS 7에서 SSH 포트를 2222로 변경하는 과정을 백업, SELinux 포트 등록, firewalld 허용, sshd_config 수정과 문법 검사, 재시작, 접속 테스트, 기존 22번 포트 제거 순서로 살펴봤습니다.

핵심은 새 포트 접속을 확인하기 전까지 22번 포트와 기존 세션을 유지하는 것입니다. 이 순서를 지키면 설정 실수가 있더라도 서버에 접속하지 못하는 상황을 피할 수 있습니다.

  • 0 사용자에게 유용한 정보 제공
이 답변이 도움이 되었나요?
« Back