상황


서버에는 A의 ip로만 접속할 수 있도록 방화벽이 설정되어있습니다.

그렇기에 다른 곳에서 B의 ip로 서버에 접속할 수 없는 상태입니다.

구성


위와 같이 방화벽 예외 설정이 되어있는 A의 ip를 경유 서버로 활용하여 목표하는 서버에 접속하는 방법을 사용합니다

이것을 Jump Host라고 합니다.

준비


B는 mac(linux or unix), A는 window 인 본인의 환경으로 설명을 하겠습니다.

B가 window일경우 putty를 , A가 mac일 경우 macOS SSH서버 를 준비하면 됩니다.

1. A가 클라이언트가 아닌 서버가 되어야 합니다.

2. A는 포트포워딩이 되어 있어야 합니다. 

3. 접속이 원활한지 확인해봅시다.

 

1. A를 경유 서버로 만들기

더보기

1. A에 OpenSSH서버 설치

검색창에 앱 및 기능을 검색합니다

선택적 기능에 들어갑니다

기능 추가를 클릭합니다

ssh를 검색한 후, OpenSSH 서버를 설치합니다

설치 완료


2. 서버 실행

관리자 권한으로 PowerShell을 실행해 줍니다.

아래의 명령어를 입력해서 서버를 실행, 종료할 수 있습니다.

start-service sshd stop-service sshd

3. 비대칭 키 인증 적용을 위한 서버 설정

비밀번호를 이용하면 보안에 취약할 수 있으므로 Public Key를 이용한 인증을 사용합니다.

관리자 권한으로 실행한 PowerShell에 아래와 같이 입력합니다.

notepad.exe $env:Programdata\ssh\sshd_config

이 파일에서 Ctrl+F를 이용해 아래의 항목들의 주석을 해제하고 값을 변경해줍니다.

PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no

그리고 아래 코드 블록을 찾아서 주석 처리해줍니다

Match Group administrators
	AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
주석처리한 모습

4. 클라이언트(B)에서의 Public Key 발급

이제 위에 설정한 서버(A)의 클라이언트(B)가 될 pc에서 Public Key를 발급받겠습니다.

여기서의 B가 이번 절의 대상(클라이언트)입니다.

본인의 경우 클라이언(B)트 pc는 맥북입니다.

일단, 이미 발급한 Key가 있는지 확인하기 위해 터미널을 열어 아래의 명령를 입력합니다

cat ~/.ssh/id_rsa.pub
이렇게 나온다면 이미 존재하는 것 이므로 다음 절로 넘어갑니다.

Key를 발급하는 것은 매우 쉽습니다. 아래와 같은 명령만 입력하면 됩니다.

ssh-keygen

아래 질문에는 Enter를 눌러 Default값으로 설정해 줍니다.

default값인 ~/.ssh/id_rsa

그리고 key를 사용할 때 입력할 비밀번호를 입력해줍니다. 그냥 Enter을 치면 비밀번호 없이 접속 가능합니다.

설정이 끝난 상태

이렇게 발급이 끝났으면 다시 한번 아래 명령을 입력해 key값을 확인합니다.

cat ~/.ssh/id_rsa.pub
key값을 확인

 


5. 클라이언트(B)의 key값을 서버에 저장

다시 서버(A)로 사용할 윈도우 컴퓨터, 위에서 봤을 때 A컴퓨터로 돌아옵니다.

관리자 권한으로 PowerShell을 켠 뒤, 아래 명령어를 입력해줍니다.

mkdir "$HOME\.ssh"

이제 클라이언트(B)의 key값을 저장할 파일을 만들겠습니다. 아래 명령어를 순서대로 입력해줍니다.

$authorizedKeyFilePath = "$HOME\.ssh\authorized_keys"
New-Item $authorizedKeyFilePath
notepad.exe $authorizedKeyFilePath

그런 다음, 클라이언트(B)에서 발급받은 key값을 모두 복사하여 이곳에 붙여 넣어줍니다.

ssh-rsa부터 전부 입력되어야 합니다.

이렇게 한 뒤 저장하면 서버(A)에 내 Public Key값이 저장되게 됩니다.


6. 인증 키를 저장한 파일의 권한 설정하기

똑같이 관리자 권한으로 실행한 PowerShell에 아래 명령을 순서대로 입력하면 됩니다.

icacls.exe $authorizedKeyFilePath /remove "NT AUTHORITY\Authenticated Users"
icacls.exe $authorizedKeyFilePath /inheritance:r
Get-Acl "$env:ProgramData\ssh\ssh_host_dsa_key" | Set-Acl $authorizedKeyFilePath
명령을 순서대로 입력한 모습

이렇게 하면 경유 서버로 사용할 서버(A)의 설정이 모두 완료됩니다.


2. 경유서버(A) 포트포워딩 하기


이부분은 공유기마다 서로 다르기 때문에 공유기에 따른 포트포워딩 방법을 검색하셔서 참고하시면 됩니다.

포트포워딩은 22번포트, 공유서버(A)의 IPv4주소로 포트포워딩 해주십시오.


3 .클라이언트(B)에서 서버(A)에 접속해보기


더보기

1. 서버의 정보 알아내기(내부 IP, 이름, 외부 IP)

일단 접속할 서버(A)의 IP와, UserName을 알아야 합니다.

그래서 서버(A)의 컴퓨터에서 다시 관리자 권한으로 PowerShell을 실행하여 아래 명령을 입력한다.

ipconfig

결과창에서 IPv4 주소를 참고하면 된다.

IPv4주소를 알아낸다.

아래 명령어로 서버를 켜고

start-service sshd

아래 명령어로 자기 자신의 서버(A)에 접속합니다.

ssh 172.xxx.x.xx(자기의 IPv4 주소)

질문이 나오면 yes(Enter)를 입력합니다.

우리가 필요한 것은 두번째 빨간 박스이다.

우리는 이전에 Public Key인증을 등록해놨기 때문에 Key가 없으면 접속이 허용되지 않습니다.

그래서 위와 같이 Permission denied오류가 나오는 것입니다.

위의 결과창에서 우리는 UserName을 얻을 수 있습니다.

본인의 경우는 빨간 박스 쳐진 sever입니다.

마지막으로 외부 IP를 알아내야 합니다.

간단하게 www.ipconfig.co.kr 에 접속하여 나오는 주소가 외부 IP입니다.


2. 클라이언트(B)에서 서버(A)에 접속하기

이제 클라이언트(B)로 넘어가 봅시다.

외부에서 서버(A)에 접속할 때에는 IPv4 주소가 아닌 서버의 외부IP 주소를 통해 들어가게 됩니다.

외부IP주소를 통해 들어가면 포트포워딩이 된 내부IP로 연결이 되게 되는것입니다.

terminal창에 아래와 같이 아까 알아낸 Username@외부IP 주소를 입력합니다.

ssh sever@112.xx.x.xx (UserName@외부IP 주소)

질문이 나오면 yes(Enter)을 입력해줍니다.

그런 뒤 아까 Key를 만들면서 입력했던 비밀번호를 입력해준다. 비밀번호 없이 그냥 Enter 했다면 이 창은 나오지 않습니다.

아래와 같이 바뀌면 접속이 성공적으로 완료했다는 것을 알 수 있습니다.

접속 완료! 맨위의 Title도 바뀌었다.

실행


이제 클라이언트(B)->경유 서버(A)->서버의 방식으로 접속할 준비가 모두 끝났습니다.

이번에 사용할 방법은 ProxyCommand인데

ssh의 프록시 옵션인 ProxyCommand와 ssh 내장 netcat proxy를 사용하는 방법입니다.

아래와 같은 포맷으로 입력해주면 됩니다.

ssh -o ProxyCommand="ssh -W %h:%p server1" server2

server1은 경유 서버(A)이고 server2는 목적 서버.

%h는 server1, %p는 server2의 ssh포트(default=22)입니다.

만약목적 서버로 접속하기 위한 포트가 따로 있다면 %p대신 포트번호를 입력해 주면 됩니다.

본인의 경우 동아리에서 NIPA로부터 지원받은 GPU 서버를 사용하고, 접속 포트가 정해져 있기 때문에 그것을 사용합니다.

포맷에 맞게 입력했다면, 비밀번호는 이전에 발급받은 key의 비밀번호를 입력하면 됩니다.

fingerprint에 대한 질문이 나오면 역시 yes(Enter)를 입력해줍니다.

마지막으로 목적 서버의 비밀번호를 입력해줍니다.

접속완료!


마무리


이렇게 한번 설정이 완료됐다면, 간단하게 경유 서버를 이용해 접속할 수 있습니다.

zsh를 사용하는 경우 ~/.zshrc,

bash를 사용하는 경우 ~/.bash_profile 파일을 열어,

내부에 아래 명령어를 넣어줍니다.

alias nipa="ssh -o ProxyCommand="ssh -W %h:%p sever@112.xx.x.xx" ubuntu@175.xx.xx.xx"

이후에는 아래와 같이 nipa라는 명령어 하나로 쉽게 접속할 수 있습니다.

 

이 기능을 자주 사용하신다면, PowerShell을 관리자권한으로 실행한 후 아래 명령을 입력하십시오.

Set-Service -Name sshd -StartupType 'Automatic'

경유서버(A)의 pc를 켤때마다, 서버를 실행할 수 있도록 도와줍니다.

sshd라는 기능이 백그라운드 자원을 메모리기준 4mb정도밖에 사용하지 않는것을 확인하였습니다.

그래서 자동실행을 해도 메모리 걱정 없이 사용할 수 있을 것입니다.

메모리 사용량 4mb정도


출처

더보기

+ Recent posts