linux - ssh 기본적인 내용

 

리눅스를 사용하는 서버에 원격접속을 하기 위해 ssh를 쓴다.

CentOS, Ubuntu 등의 OS를 VM에 설치한 후에 VM 프로그램 상에서 서버를 이용하지 않고 내 피시에서 원격으로 접속을 해서 이용할 경우에 사용하고 있다.

사용 이유?

지금 회사에서는 vmware를 사용하고 있는데, vmware에서 가상머신을 직접 켜서 사용할 수도 있지만 매번 vmware에 접속하고 사용하고자 하는 서버를 켜야 하는 번거로움도 있고, 실행 창 크기도 처음 OS를 설치하고 나면 최대화가 불가능하다. 이런 불편함때문에 내 PC에서 ssh 원격 접속하여 서버를 이용한다.

VM에 접속할 때 외에도, 새 서버에 CentOS를 설치하고 이것저것 작업해야하는 경우에도 자리를 옮겨가며 작업할 필요없이, OS 설치 후에 네트워크만 활성화시켜놓고 내 자리에서 ssh로 접속해 작업하면 편리하다.






사용조건

내 경우, 접속하고자 하는 서버에는 CentOS7.7이 설치되어 있으며 CentOS7.7은 기본적으로 ssh가 설치되어 있다. 나는 Mac을 이용해 CentOS7.7이 설치된 서버로 ssh 접속을 하는데 Mac역시 ssh가 기본으로 제공된다.

Windows PC를 이용해 ssh를 사용하고자 하는 경우 대게 Putty를 많이 쓰더라. win10이상이면 cmd 또는 powershell에서도 실행 가능하다.

기본사항

ssh는 secure shell 의 약자. ssh는 패킷전송시 암호화과정을 거친다.

ssh 접속시 사용하는 기본 포트는 22번이다. 다른 포트를 사용하고 싶다면 /etc/ssh/sshd_config 파일의 내용을 변경하면 된다. 변경후에는 sshd 서비스를 재시작 한다.

serivce sshd restart

서버측의 설정을 바꿔야하고 바뀐 설정을 적용한 서버에 접속하려면 다음 명령어로 접속해야한다. -p옵션을 사용하지 않으면 22번으로 접속시도하기 때문. 아래 명령어에서 22대신 서버측에서 설정한 포트 number를 입력한다.

ssh ID@IP -p 22

기본 사용방법

사용방법은 간단하다. 내 PC 에서 다음과 같은 명령어를 입력하면 간단히 서버에 원격으로 접속가능하다

$ ssh jihoon@12.34.56.90

여기서 jihoon은 서버의 로그인 계정(내 PC의 계정이 아니다), 12.34.56.90 은 접속하고자 하는 서버의 IP주소이다.

명령어를 입력하면 비밀번호를 묻는데, ID jihoon에 해당하는 비밀번호이다.

이 계정은 서버에 OS 설치했을 때 설정한 아이디와 비밀번호이며, 서버의 전원을 켰을 때 요구하는 계정이다.

비밀번호를 입력하면, 12.34.56.90 이라는 IP 주소를 가진 서버에 jihoon이라는 ID로 접속을 하게 되며 권한도 jihoon과 같은 권한을 가진다.

이후 입력하는 명령어는 서버에서 직접 실행하는 것과 같은 효과를 가진다.

빠져나오고 싶으면 exit 또는 logout 을 입력하면 된다.

로그인 계정 확인 방법

ssh 이용하려면 접속 대상 서버의 로그인 계정을 알아야한다.

로그인 계정을 잊어버렸거나 확인이 필요하면, Linux 서버인 경우에 아래 명령어로 간단히 확인가능하다.

$ whoami

서버의 ip 주소 확인방법

linux 운영체제에서 ip 주소 확인은 아래 명령어로 확인가능하다.

$ ip addr

서버에 네트워크 interface가 docker, graphic card driver 등으로 번잡하게 많이 적용되어 있는 경우 ip addr의 결과가 한 화면을 넘어갈 때도 있다. 아래 명령어를 이용하면 ip 주소와 관계된 결과만 확인 가능하다.

$ ip addr | grep inet

| 는 리눅스에서 파이프 연산자 이고, ip addr의 출력 결과를 grep 명령어로 전달한다.

grep는 grep 다음에 오는 inet를 검색하여 inet이 포함된 줄만 화면에 출력해준다.

유용한 설정

입력없이 연결 유지하는 시간 설정하기

/etc/ssh/sshd_config 파일에는 여러가지 설정내용이 있다.

vim으로 열어서 아래 내용을 확인한다. 기본설정은 다음과 같다.

#ClientAliveInterval 0
#ClientAliveCountMax 3

여기서 0은 0초마다 해당 서버에 접속한 클라이언트가 아무런 데이터를 보내지 않으면 데이터를 클라이언트에 요청한다.

여기서 3은 0초마다 세번 수행한다는 뜻.

여기서 3은 0초마다 세번 수행한다는 뜻.

아래와 같이 입력한다면, (주석기호인 # 은 삭제해야 적용이된다.)

ClientAliveInterval 60
ClientAliveCountMax 10

60초 마다 10번 확인하니까 60 X 10 = 600초동안 아무런 입력이 없는 클라이언트는 서버측에서 연결을 끊어버린다는 뜻이다.

대게 서버의 설정을 바꾼다는 것은 위험하다고 한다. 나뿐만이 아니라 사용자가 여러명일 수도 있고, 여러명이서 불필요한 연결을 유지한다는 것은 그만큼 서버의 리소스를 낭비한다라는게 그 중 하나이다. 이런 설정 뿐만 아니라 다양한 설정에 대해 함부로 이런저런 설정을 바꾸면 그게 다른 부분에 어떤 영향을 줄지 모른다. 다음은 클라이언트 쪽 설정으로 연결을 유지 하는 방법이다.

같은 설정파일에

ServerAliveInterval 60
ServerAliveCountMAX 10

와 같이 입력하면 된다.

60초 간격으로 null 패킷을 서버로 전송한다. 뭔가 자꾸 보내니까 연결을 유지하게 된다.

interval 간격이 너무 길면 그 간격동안 연결이 끊어질 것 같기도 한데 사실 확인은 안해봤다. 시스템 마다 다를지도..

~/.ssh/config 파일을 만들거나 수정해도 된다.

Host *
Protocol 2
ServerAliveInterval 60
ServerAliveCountMAX 10

Protocol 2 : ssh는 프로토콜의 한 종류이고, 버전 1과 2가 있다. 기본적으로 버전 2를 사용하도록 되어 있고 암호화도 버전업되었다고 생각하면 된다. 버전 1을 사용하고 싶다면 별도의 설정이 필요하다.

AliveInterval 0은 요청을 하지 않는다는 뜻.

AliveCountMax 0은 제한을 두지 않는다는 뜻이나 영원히는 아닌 것 같고 최대값을 적용하는 것 같다. 25일정도라는 얘기가 웹상에서 있었다.

https://serverfault.com/questions/538897/serveralivecountmax-in-ssh

TCP keepalive 라는 옵션도 있다. Alive 옵션과 연계되는게 아니라 별도 옵션이다. Alive옵션은 암호화된 패킷전송을 제공하지만 TCP keepalive옵션은 그렇지 않다.

연결할때 옵션을 이용하는 방법도 있다. 하지만 아래 명령어로 접속할 때 한번만 적용된다

ssh -o ServerAliveInterval=300 user@example.com

여기서 -o 는 ssh가 제공하는 옵션을 사용하겠다는 뜻이다.

다른 옵션은 man ssh에서 확인가능하다

접속한 세션의 타임아웃을 설정하는 방법도 있다.

/etc/profile 파일에

export TMOUT=300

추가 입력한다.

source /etc/profile

입력하면 바로 적용된다.

0으로 입력하면 타임아웃 설정이 해제된다는 뜻이고, 0으로 해놨다가 필요할때 값만 바꿔도 된다.

바로가기 설정하기

~/.ssh/config 파일에 다음과 같이 입력하면 자주 접속하는 서버에 쉽게 접속가능하다

host test
hostname 168.192.XXX.XX1
user jihoon
host test2
hostname 168.192.XXX.XX2
user jihoon2

위내용을 입력하면,

ssh test
  

는 168.192.XXX.XX1 에 해당하는 서버에 jihoon이라는 계정으로 접속시도를 한다.

즉,

ssh jihoon@168.192.XXX.XX1

결과와 같다.

두번째는

ssh jihoon2@168.192.XXX.XX2

와 같다.

에러 대처

ssh 접속시도 시 아래 에러가 뜨는 경우가 있다.

[user@hostname ~]$ ssh root@12.345.678.90
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
6e:45:f9:a8:af:38:3d:a1:a5:c7:76:1d:02:f8:77:00.
Please contact your system administrator.
Add correct host key in /home/hostname /.ssh/known_hosts to get rid of this message.
Offending RSA key in /var/lib/sss/pubconf/known_hosts:4
RSA host key for pong has changed and you have requested strict checking.
Host key verification failed.

에러 이유는 한 가지 예로 다음과 같다.

물리적인 서버 두대가 있다고 가정하자. 서버 A에 네트워크를 연결하고 12.34.56.90 이라는 IP 주소를 확인하여 Mac에서 ssh로 접속해서 이용을 했다. 이후, 서버 A가 필요없어져 네트워크를 해제하고 새로운 서버 B를 같은 인터넷 선으로 연결하여 네트워크를 활성화했다. DHCP로 자동으로 IP를 얻는다고 했을때 대게 같은 IP주소를 얻게 된다. 이처럼 ip주소는 같지만 실제로는 다른 서버에 접속하게되는 경우 해당 에러를 발생시킨다.

ssh는 연결시 암호화 과정이 있고 이 과정에서 접속 대상 서버와 클라이언트(여기서는 Mac)이 암호 키를 주고 받는데 접속 대상 서버의 키가 기존 접속했던 서버의 키와 다르기 떄문이다.

ssh 접속시 접속 대상 서버의 키는 아래 파일에 저장된다.

/Users/id/.ssh/config/known_hosts

CentOS 또는 Ubuntu 기본 편집기인 vi로 열어도 되고 vim을 설치했다면 vim을 써도 된다. 사용중인 PC 계정이 root가 아니라면 파일 수정이 불가능하니 sudo로 연다.

$ sudo vim /Users/id/.ssh/config/known_hosts


커서를 오류가 발생한 ip가 포함된 줄로 이동하고 d를 두번 눌러 해당 줄을 삭제한다. 삭제후 :wq를 입력해서 편집기에서 빠져나오면 된다.

여기서 이용할 만한 vi 또는 vim 명령어는 다음과 같다

undo : u

:q! : 저장하지 않고 빠져나오기

:wq : 편집한 내용을 저장하고 빠져나오기

Connection refused error

서버에 ssh daemon이 백그라운드에서 실행되고 있어야하는데 실행되고 있지 않을 수도 있다.

정말 그런지 ssh 실행상태를 서버에서 아래 명령어로 확인해보자

Ubuntu

sudo service ssh status

CentOS

sudo systemctl status sshd

결과가 active면 okay, 아니면 로그도 같이 나오니 원인을 살펴보면된다.

—> 서버에서 ssh를 재시작해보자

우분투

sudo service ssh restart

centos

sudo systemctl restart sshd

잘못된 접속시도

hostname(ip), username, password, port 중 잘못 입력된 값은 없는지 확인한다.

포트번호는 다음 명령어로 확인한다.


grep Port /etc/ssh/sshd_config

보안때문에 포트가 닫혀있을 수 있다. 포트가 열려있는지 확인해보자

sudo lsof -i -n -P | grep LISTEN

lsof 명령이 없다고 에러가 뜨면 lsof를 설치하자

서버에 ssh가 있는지 확인해보자

ssh 라고만 쳤을때 명령어가 없다고 안뜨고 뭔가 설명이 나오면 설치된 거다.

방화벽에서 ssh를 막고 있을 수 있다.

방화벽 규칙은 아래 명령어로 살펴볼수 있다.

sudo iptables-save # display IPv4 rules


참고

https://kinsta.com/knowledgebase/ssh-connection-refused/

포트포워딩https://m.blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=221364560794&proxyReferer=https:%2F%2Fwww.google.com%2F

https://www.hanbit.co.kr/network/category/category_view.html?cms_code=CMS5064906327

https://www.youtube.com/watch?v=JKrO5WABdoY

https://www.youtube.com/watch?v=hQWRp-FdTpc

포트포워딩 에러

http://www.microhowto.info/troubleshooting/troubleshooting_ssh_port_forwarding.html#:~:text=If the port is not,to listen on it%2C or

-vvv : 로그 보기

aws인증키 쓰는법 -i

댓글 쓰기

0 댓글