원격으로 개발하기 위해 필수적으로 필요하다고 생각하는 ssh 접속에 대해 정리해보려 한다.
사실 이전에 동일 내용으로 작성하였으나 너무 빈약하다고 생각되어 다시 정리하는 것이 낫다고 판단했다...
먼저 필자는 다음과 같은 환경에서 세팅을 진행중이다.
OS : Windows 10
WSL2 Ubuntu 20.04
dockerDesktop
WSL을 이용해서 작업하고 있기 때문에 몇가지 작업을 먼저 해주어야 했다.
Port Forwarding
https://m.blog.naver.com/seongjin0526/221778212779 https://tttsss77.tistory.com/155 **https://codeac.tistory.com/118**
작업 스케줄러 설정
작업 스케줄러를 설정하여 포트를 열어주는 작업을 하였는데 많은 분들은 필요없는 작업이라고 생각된다. 위에 블로그를 참조하여 진행하였다.
*.ps1 파일 생성
윈도우 작업 스케줄러 설정(컴퓨터 시작 시 실행됨)
wsl-connect-external.ps1
$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}';
if( $found ){
$remoteport = $matches[0];
} else{
echo "The Script Exited, the ip address of WSL 2 cannot be found";
exit;
}
#[Ports]
#All the ports you want to forward separated by coma
$ports=@(80,443,10000,3000,5000);
#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";
#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";
#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
for( $i = 0; $i -lt $ports.length; $i++ ){
$port = $ports[$i];
iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}
Excution Policy 설정
policy 오류 발생시 수행한다.
PowerShell.exe -ExecutionPolicy Bypass -File .\\wsl-forward-server.ps1
이제 본격적으로 ssh 설정에 대한 내용이다.
Container
먼저 container를 생성해준다. ssh 연결에 사용할 포트를 추가해주는 것을 잊지 말자.
volume 설정을 함께 해주었다. 필요한 옵션들을 별도로 더 넣어주면 된다.
docker run --gpus all -it -p 2222:2222 -v [volume] --name ssh [docker_image]
이제 생성된 container에 접속한 후 나머지 설정을 이어가겠다.
ssh 및 패키지 설치
ssh와 설정에 필요한 기본적인 패키지를 설치한다.
apt-get update
apt-get install vim openssh-server
Root pw 변경
ssh 연결시 root로 연결할 경우 비밀번호를 설정해주는 것을 잊지 말자.
다른 user를 생성해도 되지만 필자는 root 계정을 이용할 예정이다.
passwd root
Config file 수정
이제 config 파일을 수정해주어야 한다. container에서 /etc/ssh/sshd_config를 열어준 후 주석처리된 부분에서 필요한 설정들만 활성화 시키면 된다.
가장 기본적인 port 설정과 password를 이용한 로그인 설정을 주석 해제하였다. config 설정에 관련해서는 구글링을 해도 좋고, 워낙 직관적으로 변수명이 설정되어 있기에 한번씩 읽어보면 될 듯 하다.
vi /etc/ssh/sshd_config
Port 2222 # docker에서 포워딩한 포트 사용
PasswordAuthentication yes # 패스워드 이용한 로그인 허용
기본적으로 위 설정만 해주어도 ssh 연결에는 큰 무리가 없다. 설정이 끝나면 ssh 서버를 켠 후 외부 환경에서 접속해보자.
service ssh start
외부 접속 방법
ssh root@[host_ip_address] -p 2222
@뒤에는 ssh를 켠 pc의 host ip를 넣으면 된다. 터미널에서 ipconfig 등으로 간단히 확인할 수 있다. 그리고 포트를 꼭 본인이 컨테이너에서 포워딩한 포트를 사용해주자. 당연히 config에서 설정한 port와 동일해야한다.
필자는 2222 포트를 사용했다.
간혹 방화벽 문제가 발생할 수 있다. 처음 연결하는 경우라거나..
방화벽
SSH 포트가 방화벽으로 막혀있을 경우 접속이 불가능하다.
- '제어판 > 시스템 및 보안 > Windows Defender 방화벽’에 들어가 '고급 설정’을 클릭한다.
- 인바운드 규칙을 클릭하고 '새 규칙’을 클릭한다.
- 규칙 종류는 '포트’를 선택한다.
- 프로토콜은 TCP, '특정 원격 포트’는 앞서 설정한 Port 값으로 설정한다. (2222) 이름은 마음대로 정한다.
- 아웃바운드 규칙도 마찬가지로 해준다.
Reference
[WSL2] Docker container 원격 접속
서론 연구실에 배정된 머신러닝 학습용 컴퓨터를 서버실에 상주시키게 되면서, 원격으로 접속 가능하도록 만들어야 했다. 목적이 학습용이니 docker는 필수라고 생각했고, 쾌적한 사용을 위해 doc
hnsuk.tistory.com
레퍼런스로 사용한 블로그의 글을 추가로 남긴다.
VSCode 등 IDE를 사용하는 경우 ssh 익스텐션을 설치해 config 파일 설정을 해두면 정말 편리하게 사용이 가능하다.
VSC 설정 관련된 포스트는 다음에 올려보도록 하겠다.
'CPU' 카테고리의 다른 글
Docker Container ssh 설정 (0) | 2024.06.20 |
---|---|
[Git] 관계 없는 두 브랜치 병합 (0) | 2024.03.18 |
디스크 파티션 합치기(파티션 옮기기) (0) | 2024.03.06 |