리눅스 오류ㅠㅠ

CentOS7을 사용중이고
scp를 사용해 cmd에서 윈도우에 있는 공개키를 리눅스에 전송하려고 하는데
ssh connect to host port 22 connection refused
lost host(?)라는 오류가 뜨는데 원인이 뭘까요ㅠㅠ
리눅스까지 핑은 잘갑니다 !


✅최고의 답변✅
ssh: connect to host port 22: Connection refused

scp 는 내부적으로 SSH 통신을 기반으로 동작되고

위와 같은 SSH 접속 오류는 다양한 원인이 있을 수 있습니다.

(원인 1) 리눅스 서버에서 ssh 서버 실행이 안되고 있는 경우 입니다.

CentOS 접속하셔서 ssh 서버 프로그램이 실행중인지 아래처럼 확인하고

$ systemctl status sshd ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2023-11-27 12:28:52 KST; 2 days ago Process: 16545 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS) Main PID: 16554 (sshd) Tasks: 1 (limit: 4915) CGroup: /system.slice/ssh.service └─16554 /usr/sbin/sshd -D Nov 30 11:36:21 q391-0865 sshd[4299]: Connection closed by invalid user sshadmin ...

만약 실행중이지 않다면 설치 여부를 확인해서 ssh 서버 프로그램을 설치하신후 scp 를 재시도 해보시기 바랍니다.

(원인 2) CentOS 리눅스 서버 내부의 SSH 서버 프로그램 Port 번호 설정이 22 번이 아닌 경우

$ sudo nano /etc/ssh/sshd_config ... (생략) ... Port 22

위 처럼 Port 22 번 (기본 포트번호 설정)이 안되어 있거나 다른 포트 번호로 되어있다면 scp 명령어를 실행할때

아래 처럼 -P 옵션을 사용해서 포트번호를 따로 지정하셔야합니다. (예시: SSH 포트번호 1122 인 경우)

$ scp -P 1122 파일명 user@IP주소:경로명

그리고 현재 리눅스 서버 안에서 SSH 서버 프로그램이 어떤 포트 번호를 사용중인지 확인하려면 아래와 같이 확인도 가능합니다. (예시: 기본 포트번호 22번 사용중임을 확인 가능)

$ sudo netstat -tlnp | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 16554/sshd

(원인 3) 방화벽(Firewall) 차단으로 인한 접속 문제인 경우

예를 들어 방화벽 프로그램이 동작중인지 확인하고 간단한 방법으로는 아래와 같이 중단(disable) 시킬 수 있고 방화벽 설정을 통해서 SSH 포트번호 차단에 대한 규칙을 삭제 할 수 있습니다.

$ sudo ufw status $ sudo ufw disable $ sudo ufw delete deny 22

위는 방화벽 프로그램 ufw 의 경우이고 아래는 firewalld 경우의 예시 입니다.

$ systemctl status firewalld $ systemctl disable firewalld

firewall-cmd 명령어 통해서 현재 설정을 확인하고 ssh 서비스 에 대해서 접속 허용을 아래와같이 할 수 있습니다.

$ sudo firewall-cmd --list-all $ sudo firewall-cmd --permanent --add-service=ssh $ sudo firewall-cmd --reload

또한 아래 처럼 리눅스 커널 netfilter 기반으로 동작하는 iptables 명령어 통해서 현재 22번 포트번호가 차단되어있는지 확인 할 수 있고 차단 되어있다면 아래 처럼 보일 수 있습니다.

$ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere anywhere tcp dpt:ssh

이때 해당 SSH 포트번호(예: 22번)에 대해서 허용하고 싶다면 아래와 같은 명령어가 필요 할 수 있습니다.

$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

(원인 4) 네트워크 통신 연결 자체가 안되는경우

위의 경우는 질문자님께서 이미 ping 명령어 통해서 확인하셨기 때문에 재확인이 필요는 없겠지만

$ ping "리눅스서버 IP 주소"

참고로 네트워크 통신은 가능해도 리눅스 서버에서 ICMP 패킷을 차단해놨다면 ping 의 response 응답이 안올 수있습니다. 예를 들어서 아래 처럼 google 웹 서버에 ping 을 전송한다면 정상적으로 ICMP 패킷 응답(response)을 받을 수 있지만 naver 웹서버 같은 경우는 ICMP 패킷을 보통 차단해두기 때문에 ICMP 패킷 응답(response)을 받을 수 없어서 네트워크 통신이 안된다고 오해 할 수있으니 주의가 필요합니다.

(1) ICMP 통신 정상 동작 예시

$ ping www.google.com PING www.google.com (142.250.207.100) 56(84) bytes of data. 64 bytes from kix06s11-in-f4.1e100.net (142.250.207.100): icmp_seq=1 ttl=57 time=56.7 ms

(2) ICMP 통신 응답(response) 없는 경우

$ ping www.os-korea.com PING www.os-korea.com.nheos.com (223.130.200.107) 56(84) bytes of data.

위 4가지 원인을 기준으로 확인 부탁 드리고 추가적으로 질문있으시다면

카카오톡 채널 "리얼리눅스" https://pf.kakao.com/_sxevPT

리얼리눅스

새로 쌓는 '진짜' SW 기본기

pf.kakao.com

문의 주시면 감사하겠습니다.

위와 관련된 리얼리눅스 강의로는 "네트워크 완전정복" 수업이 있습니다!

https://reallinux.co.kr/course/se_network

Real Linux | 최신트렌드 리눅스 전문교육|임베디드|서버

직장인을 위한 리눅스교육

reallinux.co.kr

질문과 답변을 친구들과 공유하세요.