The Pursuit of Happyness

SSH 서버에 접속할 때, 비밀번호 입력 모드가 매우 늦게 뜨거나, 입력 후에도 로그인까지 상당히 오랜 시간이 걸리는 경우가 있습니다.

(30초에서 2분정도 걸리는 경우도 있다고 하네요..)


원인을 파악하기 위해서 ssh 접속시 "-vvv" 옵션을 추가하면 ssh 접속을 위해서 주고 받는 정보들이 자세히 나오게 됩니다.

내용을 살펴보면 ssh 접속이 느린 이유가 나오는데요, 대표적인 케이스 두 가지에 대한 해결책을 정리해 보았습니다.


1. GSSAPI 인증문제

SSH 로그인 시에 SSH 클라이언트는 몇 가지 인증 과정을 거치는데요, 그 중에 GSSAPI 인증이라는 단계가 있습니다. 이 과정은 SSH 서버가 GSSAPI 서버에 접속해서 클라이언트의 유효성을 인증받는 과정이 들어가 있는데, 이 과정이 실패할 때 SSH 세션이 시작되는 것이 상당히 지연되기도 합니다. 

해결책은 SSH 설정에서 GSSAPI 인증을 사용하지 않게 해 주는 것입니다.

SSH 설정 파일을 열어서 GSSAPIAuthentication 을 검색합니다.


$ vi /etc/ssh/sshd_config 


해당 항목의 값을 "no" 로 설정합니다.


GSSAPIAuthentication no

 

SSH 서버를 재시작 합니다.


$ systemctl restart sshd


2. 역방향 DNS 조회 문제

SSH 접속이 느려지는 다른 문제로는 역방향 DNS 조희 입니다. SSH 서버가 클라이언트로부터 로그인 요청을 받으면, 서버는 보안상의 이유로 클라이언트의 IP에 대해서 역방향 DNS를 조회합니다. 만약 역방향 조회가 실패하면 timeout 시간 만큼 접속이 늦어집니다.


역방향 DNS 조회 기능을 사용하지 않게 해주기 위해서 설정 파일을 엽니다.


$ vi /etc/ssh/sshd_config 


UseDNS 라는 항목을 검색해서 아래와 같이 해당 항목의 값을 "no"로 설정합니다.


UseDNS no


참고로 제가 설치한 CentOS에서는 "UseDNS yes" 가 주석처리 되어 있었는데, 주석을 풀고 값을 no로 설정했을 때 문제가 해결되었습니다.


SSH 서버를 재시작 합니다.


$ systemctl restart sshd






Comment +0

아래 그림에서 처럼 Host A (클라이언트) 에서 Host B (서버) 로 SSH를 이용해서 서버에 접속을 하면 둘 사이에 연결이 이루어 지는데, 이 연결 통로를 터널이라고 한다. 이 연결은 암호화 등을 통해 보호되며, 포트 포워딩을 이용하여 다른 애플리케이션이 이 터널을 이용할 수 있다.

 


터널링은 크게 Local Port Forwarding 과 Remote Port Forwarding 으로 나눠진다.

- Local Port Forwarding은 로컬 서버에서 리모트 서버의 특정 포트에서 동작하고 있는 애플리케이션에 접속이 필요한 경우 사용한다.

예를 들어 방화벽이 설정되어 22번 (SSH) 포트는 열려 있으나, 3306번 (MySQL) 포트가 막혀 있는 리모트 서버에 대해, 터널링을 이용하면 외부에서 MySQL에 접속할 수 있는 터널을 생성해 준다.

Local Port Forwarding 은 다음과 같은 형식으로 사용할 수 있다.

 $ ssh -L[bind_address:]port:host:hostport user@hostname


SSH 터널링 (SSH연결을 통해 localhost의 3306번 포트로 들어오는 트래픽을 serverurl.com 서버의 3306번 포트로 포워딩한다.)

 $ ssh -L 3306:localhost:3306 test@serverurl.com

터널링이 연결된 상태에서 MySQL 접속 (MySQL 클라이언트를 로컬호스트 (3306번 포트) 로 접속을 하면 serverurl.com의 MySQL서버에 접속하게 된다.

 $ mysql -h localhost -u mysqluser


- Remote Port Forwarding은 리모트 서버의 애플리케이션이 클라이언트의 특정 포트에 접속이 필요한 경우 사용할 수 있다. 

Remote Port Forwarding 은 다음과 같은 형식으로 사용할 수 있다.

 $ ssh -R[bind_address:]port:host:hostport user@hostname




Comment +0

이 포스트는 아래 링크에 있는 자료를 요약한 자료 입니다.

http://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-ssh-copy-id/ 



ssh-keygen 과 ssh-copy-id 를 이용하면  패스워드를 입력하지 않고 리눅스 서버에 접속할수 있습니다.

ssh-keygen 은 public / private 키를 생성하는 명령어이고,

ssh-copy-id 는 로컬 호스트에 있는 public 키를 원격 서버에 있는 인증된 키를 저장하는 파일 (authorized_keys)  에 추가해 주는 명령어 입니다.

ssh-copy-id 는 원격 호스트의 홈 폴더에 있는 ~/.ssh 폴더, ~/.ssh/ authorized_keys 파일에 적절한 권한을 부여해줍니다.


1 단계 로컬호스트에서 ssh-key-gen 을 이용하여 public / private 키를 생성하기

userid@local-host$ [Note: You are on local-host here]

userid@local-host$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/userid/.ssh/id_rsa):[Enter key]
Enter passphrase (empty for no passphrase): [Press enter key]
Enter same passphrase again: [Pess enter key]
Your identification has been saved in /home/userid/.ssh/id_rsa.
Your public key has been saved in /home/userid/.ssh/id_rsa.pub.
The key fingerprint is:
73:b4:ee:aa:b5:c5:d8:e1:f1:a5:1e:26:5f:2f:53:9f userid@local-host

2 단계 ssh-copy-id 를 이용해서 원격 서버로 public 키를 복사하기

userid@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host
userid@remote-host's password:
Now try logging into the machine, with "ssh 'remote-host'", and check in:

.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.
Note: ssh-copy-id 는 원격 서버에 있는 .ssh/authorized_key 에 public 키를 추가해 주는 작업입니다.


3단계 패스워드없이 원격서버에 로그인하기

userid@local-host$ ssh remote-host
Last login: Sun Nov 16 17:22:33 2008 from 192.168.1.2
[Note: SSH did not ask for password.]

userid@remote-host$ [Note: You are on remote-host here]

정리를 해 보면 서버1에서 서버2에 접속하기 위해서는 서버1에서 공용키를 생성해서 서버2에 복사해서 인증을 해 두어야 한다는 것입니다.

맥에서는 ssh-copy-id 라는 명령어가 없기 때문에 ssh-copy-id 에 해당하는 부분은 수동으로 설정을 해야 합니다.

방법은 서버1에서 ssh-keygen 으로 생성한 ~/.ssh/id_rsa.pub 파일을 서버2로 보냅니다. 

scp ~/.ssh/id_rsa.pub remote-host:home/userid

서버2에 로그인 하여, 다음의 명령어를 이용하여 public 키를 추가합니다.

cat ~/id_rsa.pub >> ~/.ssh/authorized_key



Comment +0