1. Linux
Linux의 구조

Kernel - Linux의 핵심
- 프로세스 / 메모리 / 파일 시스템 / 장치 관리
- 컴퓨터의 모든 자원 초기화 및 제어 기능
- 컴퓨터의 모든 자원 초기화 및 제어 기능 수행
- Linux는 커널의 대부분이 C언어로 개발됨
Shell - 사용자 인터페이스
- 명령 해석
- 프로그래밍 기능
- Linux 기본 쉘: bash shell(Linux shell)
Application
- 각종 프로그래밍 개발 도구
- 문서 편집 도구
- 네트워크 관련 도구 등
❗️ Compiler: 고급 언어 → Assembly (not 기계어)
Ubuntu Linux
- Debian 계열의 Linux 중 가장 성공한 데스크톱 배포판
hostnamectl
가상화
- 하나의 물리적 컴퓨터에서 여러 운영체제를 동시에 실행할 수 있게 하는 기술.
- 하나의 물리 컴퓨팅 자원을 마치 여러 개인 것처럼 가상으로 쪼개서 사용하거나 여러 개의 실물 컴퓨팅 자원들을 묶어서 하나의 자원처럼 사용하는 것
<가상화 방법>
- 가상머신(Virtual Machine) - 하이퍼바이저를 이용
- 컨테이너(Container) - OS 수준에서 프로세스를 컨테이너로 격리
Virtual Machine

- 호스트 OS에 가상의 머신을 생성한 후 여기에 게스트 OS를 설치할 수 있도록 해주는 응용 프로그램
가상머신의 장점(상대적인 장점)
- 스냅샷으로 즉시 복구 가능
- UTM은 스냅샷 대신
clone 기능
원격 접속 허용
- SSH
- Secure SHell 의 약자
- 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜
- 서버에 SSH 설치 및 실행
IP: 컴퓨터(NIC - Network Interface Card)를 구분하기 위한 주소
port: 컴퓨터에서 동작하는 프로세스(or 애플리케이션)를 구분하기 위한 정보
→ 다른 컴퓨터에 접속: 컴퓨터의 Application 에 접속 ( IP:port )
- Known port: 0~1023 기본 용도로 확정
- Unknown port:
- IPv4
- 32비트 체계
- 클래스별로 용도 확정
- 8비트씩 끊어서 10진수로 표기
- 0.0.0.0 ~ 255.255.255.255
- IP 주소의 수가 부족해지는 문제 발생
- → Class less
- NAT & PAT : 보안(NAT), IP 주소 부족 문제 해결(PAT)
- IPv6
💡 잠깐 네트워크 내용(재밌는 부분)
NAT(Network Address Translation)
- 기본적으로 IP 주소를 다른 IP 주소로 변환하는 기술
- 주로 사설 IP를 공인 IP로 바꿀 때 사용
Static NAT(정적 NAT)
- 사설 IP 1개와 공인 IP 1개를 1:1로 고정 매핑
- 외부에서 내부 서버에 직접 접근해야 할 때 필수적
Dynamic NAT(동적 NAT)
- 사용 가능한 공인 IP 주소 풀(Pool)을 만들어 두고, 내부 사용자가 나갈 때마다 남는 IP를 하나씩 할당.
- 1:1 매핑이지만 매번 대상이 바뀔 수 있음
PAT(Port Address Translation)
- 하나의 공인 IP를 여러 개의 사설 IP가 공유할 수 있게 하는 기술
- NAT Overload 라고도 함
- 동작 원리
- IP 주소뿐만 아니라 포트 번호까지 변환하여 각 사용자를 구분
- 장점
- 하나의 공인 IP로 수천 개의 장치를 인터넷에 연결할 수 있어 IP 주소 고갈 문제를 해결
| 구분 | NAT (Static/Dynamic) | PAT (NAT Overload) |
|---|
| 변환 방식 | 1:1 주소 변환 | n:1 주소 변환 |
| 구분 기준 | IP 주소 | IP 주소 + 포트 번호 |
| 주요 목적 | 서버 외부 노출, 보안 | 공인 IP 절약, 다수 기기 인터넷 연결 |
포트 포워딩(Port Forwarding)
- 외부 네트워크에서 내부 네트워크(사설망)에 있는 특정 기기나 서비스에 접속할 수 있도록 통로를 열어주는 기술
- PAT: 내부 → 외부 / 나갈 때 주소를 바꿔주는 것
- 포트포워딩: 내부 ← 외부 / 들어오는 길을 안내해주는 이정표 역할
- 외부에서 접속을 시도할 때 공인 IP 까지는 도달했지만, 사설 IP 를 모르는 상태이기 때문에 포트포워딩이 필요함.
- 방화벽에 특정 목적을 가진 작은 창문 하나를 내는 것과 같음
| 구분 | PAT (NAT Overload) | 포트 포워딩 (Port Forwarding) |
|---|
| 방향 | 내부 → 외부 (나갈 때) | 외부 → 내부 (들어올 때) |
| 주체 | 여러 기기가 하나의 IP를 공유 | 특정 서비스(포트)를 외부에 노출 |
| 비유 | 여러 학생이 하나의 공중전화 사용 | 특정 부서 직통 번호 설정 |
VPN(Virtual Private Network)
- 외부 사용자가 마치 내부 네트워크에 직접 연결된 것처럼 안전한 암호화 터널을 만드는 기술
- 작동 방식
- 사용자가 외부에서 VPN 서버에 인증을 거쳐 접속하면, 가상의 통로를 통해 내부망으로 들어오게 됨. → 일단 접속되면 내부의 모든 기기에 접근할 수 있는 권한을 가짐
- 보안
- 모든 데이터가 암호화되며, 강력한 인증(ID/PW, OTP 등)을 거쳐야만 통로에 들어올 수 있음. 외부에서는 내부에 무엇이 있는지 전혀 알 수 없음.
| 구분 | 포트 포워딩 | VPN |
|---|
| 접속 범위 | 특정 기기, 특정 포트만 허용 | 내부 네트워크 전체에 접근 가능 |
| 보안성 | 낮음 (포트 노출로 해킹 위험) | 높음 (암호화 터널 및 인증) |
| 설정 편의성 | 간단함 (공유기 설정만 하면 됨) | 복잡함 (VPN 서버/클라이언트 필요) |
| 비유 | 성벽에 작은 구멍 하나 뚫기 | 성 내부로 통하는 비밀 비밀번호 문 만들기 |
요약(NAT, PAT, Port Forwarding, VPN)
| 구분 | 주요 특징 | 핵심 메커니즘 | 주요 용도 |
|---|
NAT | 주소 변환 | IP ↔ IP (1:1) | 외부 노출용 서버 IP 매핑 |
PAT | 주소+포트 변환 | IP ↔ IP+Port (N:1) | 여러 기기의 인터넷 공유 |
포트 포워딩 | 특정 통로 개방 | Port ↔ Port | 외부에서 내부 서비스 접속 |
VPN | 가상 암호 터널 | 암호화 및 가상 인터페이스 | 원격 근무, 안전한 서버 관리 |
Bridged Mode
(다시 가상화)
사설 IP 주소의 3가지 약속된 대역
(아래 세 범위 중 하나에 해당한다면 100% 사설 IP)
- Class A (10.x.x.x) : 대규모 기업 내부망에서 주로 사용
- Class B (172.16.x.x ~ 172.31.x.x) : 중간 규모나 클라우드(AWS VPC 등)의 기본 대역으로 자주 쓰임
- Class C (192.168.x.x) : 가정용 공유기나 소규모 사무실, 가상머신 같은 환경에서 많이 쓰임
Loopback 대역: 127.x.x.x
- 네트워크 카드를 타고 밖으로 나가는 게 아니라 컴퓨터 내부에서만 맴도는 주소
sudo ufw allow ssh
sudo ufw enable
sudo ufw status
- UFW (Uncomplicated Firewall)
- 우분투 서버를 처음 설치하면 보통 방화벽이 비활성화(inactive) 상태이거나 모든 접속을 허용 하는 상태.
- 추후에 방화벽을 켰을 때 미리
sudo ufw allow ssh 를 입력하지 않았더라면, 나의 SSH 접속 또한 방화벽에 막힘.
Run Level
- 시스템을 가동하는 방법(
init 과 함께 사용)

명령어 입력 및 실행
Shell
- 사용자가 입력한 명령을 해석해 커널로 전달하거나 커널의 처리 결과를 사용자에게 전달하는 역할을 수행
- Server의 텍스트 모드나 X Window(GUI) 의 터미널에서 입력하는 인터페이스
프롬프트
- 명령어를 입력할 때 보여지는 문자열
- 슈퍼 사용자라면 $ 대신 #
echo $SHELL - Login Shell 확인 커맨드
- 명령을 사용하는 방법
- 대화식(Interactive) - 직접 입력해서 결과를 바로 확인하는 방식
- 스크립트 - 미리 파일에 기록해두고 그 파일을 Shell 에 넘겨서 한 번에 수행하는 방식
- ~ 은 사용자의 홈 디렉터리(~의 자리는 현재 디렉토리를 나타냄)
- admin@basic
- admin - 사용자
- basic - 호스트 이름
명령행 작업
명령행 편집
- 커서 이동: CTRL + b(뒤로), + f(앞으로), + a(가장 앞으로), + e(가장 뒤로) →
option + 방향키(가장 앞/뒤로)
- ESC + b(단어 뒤로), + f(단어 앞으로)
명령의 구조
- 명령 [옵션][인자]
- 명령: 사용자가 입력하는 명령
- 옵션: 명령의 세부 기능으로 옵션은, - 또는 — 로 시작
- — : 옵션이 단어인 경우
- 옵션은 여러 개 사용 가능
- 옵션은 대부분 순서가 없음
- 옵션은 결합이 가능
- 인자: 명령에 전달하는 값
- 각 요소는 공백으로 구분
- [] 는 생략 가능하다는 의미
- ‘ | ‘ 는 선택
- 문자열, { }, < > 은 필수
명령어 자동 완성
- 현재 입력 중인 내용으로 시작하는 명령이 1개 밖에 없다면 / Tab → 자동 완성
- 명령이 여러 개인 경우, Tab을 한 번 더 누르면 모든 명령을 출력
History
echo(메아리): 입력한 문자열이나 변수의 내용을 터미널 화면에 그대로 출력해주는 명령어
- 파일에 내용 쓰기(리다이렉션): 화면에 출력할 내용을 파일로 돌려서 저장 가능.
echo “my server test” > test.txt
Shell이 명령어를 찾는 위치 확인
echo $PATH
- 명령어를 이름만 입력한 경우 PATH에서 찾음
- 현재 디렉토리의 명령어를 실행하고자 하는 경우
./ 명령어 형태로 입력해야 한다.
bin : binary의 약자
whereis
- 명령어의 실행 파일 위치, 소스 위치, man 페이지 파일의 위치를 찾아주는 명령어
- whereis [옵션][파일]
- 옵션
- -b: 바이너리 파일만 검색
- -m: 메뉴얼 파일만 검색
- -s: 소스 파일만 검색
which
- PATH 환경 변수에 저장된 디렉터리에서 명령어의 위치를 검색
- which [옵션][—] [명령어]
- 옵션
- a, --all : 모든 내용을 출력
- -i, --read-alias : 알리아스 설정 환경을 출력
- --skip-alias : 알리아스 설정을 무시
- --skip-dot : 점(.)으로 시작하는 디렉터리를 제외
- --skip-tilde : 틸드(~)로 시작하는 디렉터리($HOME 디렉터리)를 제외
- --show-dot : 점(.)으로 시작하는 디렉터리를 포함
- --show-tilde : 틸드(~)로 시작하는 디렉터리를 포함
- -v, -V, --version : 버전 정보를 출력
기본 명령어
- passwd: 비밀번호 변경
- passwd [인자] : 인자를 생략하면 현재 접속 중인 계정이고, 인자에 변경할 계정을 설정
- alias : 현재 설정된 별명을 확인
시스템 사용자 정보 확인
- logname : 사용 중인 로그인 네임 확인
- users : 접속한 사용자의 아이디
- who : 로그인 한 모든 사용자 계정
- whoami : 현재 우분투 사용자 확인
- uname [옵션] : 시스템 정보
- 옵션
- -a: 시스템의 모든 정보 확인
- -m: 시스템이 사용 중인 하드웨어 정보 확인
- -n: 호스트 네임 확인
- -r: 운영체제 릴리즈 번호
- -s: 운영체제 이름
- -v: 버전 출시 일자
시스템 정보
- hostname: 현재 사용 중인 호스트 네임
- arch: CPU 정보
- env: 환경 변수 확인
sudo와 su
su: Substitute User / Switch User
sudo
- 관리자의 권한을 빌려서 명령을 실행하는 것으로 관리자 비밀번호를 입력해야 함
- pw → 현재 사용자의 비밀번호
su 계정
- 현재 계정의 환경 변수들을 유지하면서 다른 계정으로 전환
- 권한만 빌려옴
- → 다른 계정의 비밀번호
su - 계정
- (현재 계정의 환경 변수를 유지하지 않고) 새로운 계정의 환경변수를 가져오면서 다른 계정으로 전환
- 해당 사용자로 완전히 로그인한 것과 같은 상태
- → 다른 계정의 비밀번호
- su 명령에서 계정을 입력하지 않으면 root로 전환
2. vi 편집기
1) 리눅스 편집기의 종류
유닉스에서부터 사용했던 편집기
- 행 단위 편집기(한 번에 하나의 행씩 편집하는 도구): ed, ex, sed
- 화면 단위 편집기: vi (vim - 일반적으로 사용되는 편집기), emacs, nano(메뉴 기반 편집기)
- GUI 편집기: gedit
모드형과 비모드형 편집기
- 모드형
- 입력 모드와 명령 모드가 구분
- 입력 모드 - 텍스트를 입력할 수 있는 모드
- 명령 모드 - 텍스트를 수정하거나 삭제하고 복사와 붙이기 등 편집을 하는 모드
- 같은 글자라도 입력 모드에서는 텍스트로 처리하여 입력되고 명령 모드에서는 텍스트로 입력되는 것이 아니라 편집 명령으로 사용
- vi는 모드형 편집기
- 비모드형
- 입력 모드와 명령 모드가 구분되어 있지 않음
- 편집 기능을 CTRL 이나 ALT 같은 특수 키와 함께 사용
- nano 는 비모드형 편집기
vim
동작 모드

📌 vi, nano 등으로 파일을 열 때, 시스템 내부에서 일어나는 일
- 로드(Load): 디스크에 저장되어 있던 파일 내용을
RAM의 Buffer라는 임시 공간으로 복사해 옴.
- 편집: 우리가 수정하는 내용은 디스크가 아니라 메모리 위의 버퍼에서만 일어남
- 저장(Write):
:w 를 누르는 순간에만 메모리의 버퍼 내용을 다시 디스크로 덮어씌움
→ if) 엄청나게 큰 로그 파일(ex: 10GB)을 일반 편집기로 열면 메모리(RAM의 Buffer)가 부족해서 서버가 뻗을 수 있음.
→ sed or less 같은 도구를 병행해서 씀
Command Mode
- 시작점: 파일을 열자마자 만나는 기본 모드
- 역할: 글자를 직접 치는 게 아니라, 커서 이동, 복사, 붙여넣기, 삭제 등의 명령을 내림
- 핵심 키: 어떤 모드에서든
Esc 를 누르면 이 모드로 돌아옴
Insert Mode
- 진입 방법: 명령 모드에서
i or a 를 누름. (insert / append)
- 역할: 메모장처럼 실제 글자를 입력하는 모드
- 표시: 화면 하단에
-- INSERT -- 라는 문구가 뜸
Last-line / Command-line Mode
- 진입 방법: 명령 모드에서
: 를 누름
- 역할: 저장, 종료, 검색, 치환 등 파일 전체에 영향을 주는 명령을 수행
시작
- vim [파일 경로]
- 해당 파일이 존재하면 파일의 내용이 보이고, 존재하지 않는 파일이면 빈 파일이 열림
- 파일 경로를 생략하면 아래와 같은 화면이 출력됨
- 수정 권한이 없으면 [읽기 전용] 으로 열림
종료

커서 이동
![업로드중..]()