📘 한화 BEYOND SW 캠프 18기 1주차 정리: [Linux,Port Forwarding, SSH,RSA,bash/zsh]

본 게시글은 한화 BEYOND SW 캠프 18기를 진행하면서
수업 중 배운 내용과, 그 과정에서 생긴 궁금증을 스스로 조사하고 정리한 내용입니다.


📑 목차


🐧 Linux? Ubuntu?

linux

출처:(https://velog.io/@dahara3/%EB%A6%AC%EB%88%85%EC%8A%A4%EC%99%80-%EC%9A%B0%EB%B6%84%ED%88%AC)

개발을 하다 보면 누구나 한 번쯤은 리눅스(Linux)라는 운영체제를 마주하게 됩니다.
하지만 막상 리눅스가 무엇인지, 그리고 Ubuntu와는 어떤 관계인지 헷갈리기도 합니다.


🔹 리눅스란?

  • Unix 기반의 오픈소스 운영체제 (OS)
  • 누구나 자유롭게 수정·배포·재사용이 가능
  • 멀티 태스킹, 멀티 유저, 다양한 배포판 존재
  • 서버, 클라우드, IoT, 모바일(Android) 등 다양한 분야에서 핵심 OS로 사용

📌 핵심 특징 요약

  • 💡 무료 + 오픈소스
  • 🛠️ 코드 수정 및 배포 가능
  • 🌍 글로벌 개발자 커뮤니티 기반
  • 🧠 멀티프로세싱, 멀티유저 지원

🐾 Ubuntu? 왜 항상 Ubuntu였을까?

리눅스는 하나의 커널을 기반으로 여러 배포판(Distro)이 만들어지며, Ubuntu는 그 중 하나.

학부 시절에도 Ubuntu를 사용했기에 왜 Ubuntu를 골랐을까? 하는 궁금증이 생겼다.


✅ Ubuntu가 교육/개발 현장에서 자주 쓰이는 이유

  1. 설치가 쉽다
    → 초보자도 설치가 용이한 편이다.

  2. GUI 환경 지원
    → CLI에 익숙하지 않은 사람도 그래픽 환경에서 시작 가능

  3. 패키지 설치가 간편
    apt 명령어를 통해 Python, Git, Node 등 손쉽게 설치

  4. 풍부한 레퍼런스
    → StackOverflow, 공식 문서, 블로그 자료가 방대하다 (이거 진짜 중요..)

  5. 추후 학습할 클라우드 연계가 뛰어남
    → AWS, Azure, GCP 모두 기본 이미지로 Ubuntu 제공

🎯 즉, 학습용으로도, 실무용으로도 가장 접근성이 좋은 배포판이라는 결론


🌉 포트포워딩(Port Forwarding)이란?

리눅스, SSH를 배우다 보면 항상 빠지지 않는 개념이 바로 "포트포워딩"이다.

출처: (https://surfshark.com/ko/blog/vpn-port-forwarding)


1. 포트포워딩이란?

포트포워딩
"내부 네트워크 안의 컴퓨터(서버, 가상머신 등)에 외부에서 접속할 수 있게,
특정 포트로 들어온 트래픽을 지정된 내부 컴퓨터의 특정 포트로 자동으로 전달해주는 네트워크 기술"이다.


2. 언제, 왜 쓰는가?

  • 내부망(집, 회사, 학교 등)에 있는 서버나 가상머신(VM)에 외부에서 직접 접근이 안 될 때
  • 외부(내 PC, 회사 밖, 다른 네트워크 등)에서 내 리눅스, Ubuntu, 웹서버 등에 접속하고 싶을 때

예전에 학부시절에 라즈베리 파이에 웹서버를 돌리고 포트포워딩을 통해 간단하게 프로젝트를 진행 하려고 했는데, 학교 라우터 레벨에서 포트포워딩을 막아서 전산팀에 연락 했던 기억이 났다.. 물론 보안 이슈로 결국 실패했었다..


3. 동작 원리 (쉽게 정리)

예를 들어보자.

  • 내 컴퓨터(윈도우)에서
    VirtualBox로 Ubuntu(리눅스 VM)를 구동 중
  • Ubuntu에는 SSH 서버(22번 포트)가 실행 중
  • 그런데, 내 윈도우에서 바로 Ubuntu 22번 포트로 접속이 불가능할 때,
  • VirtualBox의 포트포워딩 기능을 이용해
    "윈도우 30022번 포트로 들어온 요청을 Ubuntu 22번 포트로 전달"하게 세팅할 수 있다.

4. 과정 예시 (구성도)

[내 PC: Windows]
  │
MobaXterm, PuTTY 등으로 SSH 접속
  │       (30022)
  ▼
[VirtualBox 포트포워딩]
  │ (호스트 30022번 → 게스트 22번)
  ▼
[Ubuntu VM (가상머신)]
  │
SSH 서버(22번 포트)에서 로그인 대기

🔐 SSH? 그리고 MobaXterm?

💡 SSH란?

출처:ssh.com

"[출처]:ssh.com"
  • 원격 서버에 암호화된 통신으로 접속할 수 있는 프로토콜
  • 기본 포트는 22번
  • 일반적으로 ssh user@ip 형태로 접속
  • 비밀번호 인증 외에도, 공개키 기반 인증(RSA)을 통한 비밀번호 없는 접속도 가능 -> (이 부분이 흥미로웠고, 추후 뒤에 정리하도록 하겠다.)

💻 MobaXterm이란?

"[출처]:https://mobaxterm.mobatek.net"

Windows 환경에서 가장 널리 쓰이는 SSH 접속 도구 중 하나

🌟 주요 특징:

  • SSH, FTP, SCP 등 다양한 원격 접속 프로토콜 지원
  • GUI 기반 + 탭형 터미널
  • 로컬 파일과 원격 서버 간의 파일 전송 UI 제공
  • Windows 환경에서 Linux 서버 접속을 시각적으로 쉽게 할 수 있도록 돕는 도구

🔐SSH란 무엇이고, 왜 양방향 암호화를 사용할까?

"SSH"
처음엔 "그냥 리눅스 서버 접속할 때 쓰는 명령어" 정도로만 알았는데, 이번에 보안의 관점에서 조금 더 깊게 공부해봤다.


1. SSH란?

SSH(Secure Shell): 네트워크를 통해 서버에 접속하고 원격 명령을 실행할 수 있게 해주는 프로토콜이다.

2. 사용 이유

기존 방식들은 모든 데이터를 평문 으로 주고받아서, 중간에 누군가 네트워크를 엿보면 로그인 정보나 서버 명령이 고스란히 노출되는 치명적인 문제가 발생했다.

SSH는 이런 문제를 해결하기 위해, 모든 통신을 암호화해서 서버와 클라이언트 사이를 보호한다.
서버 접속뿐 아니라 자동화된 파일 전송, 네트워크 인프라 관리 등, 요즘은 거의 모든 인프라 환경에서 필수적으로 쓰이고 있다고 한다.


3. SSH의 동작 원리

SSH는 단순히 암호화만 하는 게 아니라, 실제로는 클라이언트-서버 모델로 꽤 복잡한 과정을 거치며 안전한 연결을 만들어낸다.
대표적으로 다음 세 가지 기술이 결합되어 있다.

  • 비대칭키(공개키/개인키, RSA 등) 암호화
  • 대칭키(세션키) 암호화
  • 해시(HMAC) 기반 무결성 검증

3-1) 연결 시작 & 버전 교환

클라이언트가 서버의 22번 포트에 접속을 시도하면,
서버는 자신이 지원하는 SSH 버전 정보를 클라이언트에게 전달하고,
클라이언트는 여기에 맞춰 연결을 이어간다.

3-2) 서버 공개키 전송 & 신뢰 검증 (클라이언트가 서버를 검증)

서버는 자신의 공개키를 클라이언트에게 보내고,
클라이언트는 이전에 접속했던 서버라면 known_hosts 파일을 참고해서 진짜 내가 의도한 서버에 연결 중인지를 확인한다.
(이 단계가 없다면 MITM(중간자 공격)에 쉽게 노출될 수 있다고 합니다.)
참고 자료 ->https://blog.naver.com/ucert/221201640816

3-3) 안전한 키 교환(세션키 생성)

  • 여기서 핵심은 키 교환 알고리즘이다.
    SSH에서는 주로 디피 헬만 알고리즘(Diffie-Hellman) 방식으로, 서버와 클라이언트가 각각 임시로 공개키/개인키 쌍을 만들고 교환해서,
    외부에서는 알 수 없는 공유 세션키(대칭키)를 생성한다.
  • 이 대칭키는 실제 통신 구간의 암호화에 쓰인다.
    대칭키 암호화는 빠르고, 데이터 송수신 효율이 매우 높다.

4-4) 클라이언트 인증(서버가 클라언트를 검증)

서버는 이제 클라이언트가 진짜 로그인 권한이 있는지 확인해야 한다.

  • 가장 단순한 방법은 비밀번호를 받는 것.
    (단, 보안상 약하므로 실제로는 거의 권장되지 않음)
  • 가장 안전하고 많이 쓰는 방식(캠프에서 강사님께서 잠깐 예시로 보여주신 방식)이 바로 '공개키 기반 인증'이다.
    • 클라이언트는 사전에 만들어둔 개인키/공개키 쌍 중 공개키를 서버에 등록해 두고,
    • 서버는 클라이언트에게 난수를 던진 뒤, 클라이언트가 개인키로 복호화해서 제대로 응답하면 신원 확인이 끝난다.

3-5) 안전한 데이터 통신

이제부터 모든 데이터는,
아까 만들어둔 세션키(대칭키)로 암호화되어 주고받는다.
여기에 HMAC 해시값이 같이 붙어서, 중간에서 누군가 패킷을 변조해도 금방 알아차릴 수 있게 되어 있다.


3. 왜 RSA? 왜 양방향(비대칭) 암호화를 쓸까?

이쯤에서 이런 생각이 들 수 있다.
"애초에 그냥 빠르고 간단한 대칭키 암호화만 쓰면 안 되나?"
여기엔 명확한 이유가 있다.

  • 대칭키 방식은 빠르지만, "처음 키를 서로 안전하게 주고받는 과정"이 필요하다.
    (키가 노출되면 통신 내용이 모두 풀려버림)
  • 비대칭키(양방향, RSA 등) 방식은 공개키를 모두에게 뿌려도,
    개인키를 가진 사람만 복호화가 가능하다는 점에서 "키 교환"과 "인증"에 매우 유리하다.

즉,

SSH에서는 "비대칭키 방식(RSA 등)"으로 먼저 세션키를 안전하게 주고받고,
그 다음부터는 "빠른 대칭키"로 모든 데이터를 주고받는 구조
다.

여기에 RSA는 구현이 단순하면서도 안전성이 검증된 대표적인 비대칭키 알고리즘이기 때문에,
지금까지도 SSH에서 가장 널리 쓰이고 있다.


포트포워딩에 대해

4. 한 줄 요약

  1. 연결 시작 & 버전 교환

  2. 서버 공개키 전송 -> 신뢰 검증

  3. 안전한 키 교환(헬만 알고리즘)으로 세션키 생성

  4. 클라이언트 검증(RSA)

  5. 안전한 데이터 통신(세션키를 사용하여 암호화)


여기까지가 사실 1주차 1일차로 배운 내용이다.
명령어 자체는 수업에서 많이 다뤘지만,
솔직히 필요한 건 그때그때 검색해서 쓰면 되기에 따로 정리하진 않겠다.
대신, 윈도우 랩탑에서 mobaxterm(또는 Ubuntu)를 쓸 때
기본 터미널이 bash라서,
맥에서 주로 쓰던 zsh와 뭐가 다른지 궁금해 간단하게 비교해봤다.
(사실 oh-my-zsh이 쓰고 싶어서 찾아보다가 다른걸 깨달았다)

"[출처]:https://ohmyz.sh"

🐚 Bash와 Zsh, 무엇이 다를까?

1. Bash (Bourne Again SHell)

  • 리눅스(Ubuntu 등)의 기본 터미널 쉘
  • GNU 프로젝트에서 개발, 오랫동안 표준처럼 사용
  • 명령어 호환성이 뛰어나고, 전통적인 리눅스/유닉스 스크립트와 잘 맞음

2. Zsh (Z shell)

  • Bash보다 더 강력한 자동완성, 하이라이트, 커스터마이징 기능 지원
  • 테마/플러그인(oh-my-zsh 등) 설치가 쉽고,
    프롬프트/자동완성/단축키 등 꾸미기에 유리
  • 맥OS에서는 최근 기본 터미널로 채택됨(zsh가 bash를 대체)

✅ Bash vs Zsh 주요 차이 한눈에!

구분BashZsh
기본 환경Ubuntu, mobaxtermMacOS(기본), 리눅스(설치)
자동완성기본더 똑똑하고 강력
커스터마이즈제한적플러그인/테마 다양
플러그인드묾oh-my-zsh 등 다양
스크립트리눅스와 완벽 호환대부분 bash와 호환

💡 결론

  • bash는 “전통적이고 범용적인 기본 쉘”,
    zsh는 “꾸미고 자동완성에 특화된 최신 쉘” 느낌!
  • bash로 대부분의 리눅스 작업이 가능하고,
    zsh는 좀 더 “내 스타일에 맞게 꾸미고 싶은 사람”에게 추천.

둘 다 필요한 순간 쉽게 쓸 수 있으니,
자신이 편한 쪽을 선택해서 사용하면 된다고 한다.


추가적으로 강사님께서 리눅스의 리다이렉션과 파이프라인에 대해서 숙지 하는게 좋다고 하셔서 찾아봤다. 간단하게만 정리 하고, 추후 필요시 더 깊은 학습이 필요해 보인다.


🛠️ 리눅스 리다이렉션(Redirection) & 파이프라인(Pipeline) 간단 정리

1. 리다이렉션(Redirection)이란?

  • 명령어의 입력/출력(결과, 에러 등)을 파일로 보내거나, 파일에서 입력받을 수 있게 해주는 기능
  • 리눅스 명령어의 "입구/출구"를 마음대로 바꿀 수 있다는 뜻

대표 사용 예시

기호설명예시
>표준출력을 파일로 저장 (덮어씀)ls > filelist.txt
>>표준출력을 파일에 이어쓰기echo hi >> hello.txt
<파일을 명령어의 입력으로 사용sort < numbers.txt
2>에러 출력을 파일로 저장ls xxx 2> error.txt

2. 파이프라인(Pipeline)이란?

  • 한 명령어의 출력(결과)을 바로 다음 명령어의 입력으로 넘겨주는 기능
  • 여러 명령어를 ‘파이프( | )’로 연결해서, 복잡한 작업을 한 줄로 처리 가능

대표 사용 예시

ls | grep ".txt"
# 현재 폴더 파일 목록 중에서 "txt"가 들어간 파일만 추려서 보여줌

cat log.txt | sort | uniq
# log.txt를 정렬하고, 중복 줄을 제거해서 출력

ps aux | grep chrome > chrome_process.txt
# 실행 중인 프로세스 중 chrome 관련된 것만 골라서 파일로 저장

[Reference]

https://brunch.co.kr/@uxstar/7
https://sunlightmedia.org/bash-vs-zsh/
https://kdohyeon.tistory.com/122
https://www.ssh.com/academy/ssh
https://limvo.tistory.com/21

profile
개발에 대한 고민과 성장의 기록을 일기장처럼 성찰하며 남기는 공간

0개의 댓글