
안녕하세요.
오늘은 비가 정말 많이 오네요,, 지각할 뻔했어요,,
그럼 모닝30 시작!
1. 왜 이걸 배우는지 찾아봅니다
1.1 보안 담당자는 서버에서 왜 grep 을 쓸까요?
> 로그 파일에서 특정 문자열이나 이상 징후를 빠르게 찾아 보안 사고를 탐지하고 분석하기 위해서이다.
grep은 리눅스에서 파일이나 명령어 출력 내용 중 특정 문자열 또는 패턴이 포함된 줄을 검색하는 명령어입니다.
grep [옵션] "검색할 문자열" 파일명
자주 사용하는 로그 확인 명령어
# 로그 전체 출력
cat /var/log/syslog
# 로그 마지막 20줄 확인
tail -n 20 /var/log/syslog
# 로그 실시간 확인
tail -f /var/log/syslog
# 특정 문자열 검색
grep "error" /var/log/syslog
# systemd 서비스 로그 확인
journalctl -u ssh
# 최근 로그 확인
journalctl -n 50
2. grep 과 옵션의 뜻을 알아봅니다
옵션설명사용 예시
| -i | 대소문자 구분 없이 검색 | grep -i "error" server.log |
| -n | 검색 결과의 줄 번호 표시 | grep -n "ERROR" server.log |
| -v | 검색 문자열이 없는 줄 출력 | grep -v "INFO" server.log |
| -c | 일치하는 줄의 개수 출력 | grep -c "ERROR" server.log |
| -r | 하위 디렉터리까지 재귀 검색 | grep -r "ERROR" /var/log/ |
| -E | 확장 정규표현식 사용 | grep -E "ERROR\|WARN" server.log |
참고로 -c는 문자열의 총 등장 횟수가 아니라 일치하는 줄 수를 계산합니다.
오늘의 순서
| 2교시 | IP 주소 · 사설 주소 |
| 3교시 | 서브넷 |
| 4교시 | 서브네팅 |
| 5교시 | 스위치와 라우터 |
| 6교시 | VLAN |
| 7교시 | 라우팅 표 |
2교시 — IP 주소를 펼치기 · 사설 IP와 공인 IP
왜 필요한가
보안 관제에서 보는 로그(방화벽 · 웹 서버 · 침입 탐지 시스템 로그)에는 거의 언제나 출발지 IP 주소와 목적지 IP 주소 필드가 기록됩니다. 분석은 그 주소가 내부망(우리 회사 네트워크)인지 외부망(인터넷)인지 가리는 것부터 시작합니다.
그 기준이 사설 IP(회사 · 가정의 내부망에서만 쓰는 주소)와 공인 IP(인터넷 전체에서 하나뿐인 주소)입니다.
내부망 PC의 사설 IP는 인터넷과 통신할 때 공유기 · 라우터의 NAT(냇 · Network Address Translation, 주소 변환)를 거쳐 공인 IP로 바뀌어 나갑니다. 그래서 외부 서버나 방화벽 로그에 기록된 출발지 주소는 실제 PC의 사설 IP가 아니라 공유기의 공인 IP일 수 있습니다. 어느 PC가 보낸 것인지 찾으려면 공유기 · 방화벽에 남은 NAT 변환 기록을 함께 봐야 합니다.
2.1 IP 주소는 32비트
비트 (bit)
0 또는 1 하나를 담는 2진수 한 자리. 컴퓨터가 다루는 가장 작은 정보 단위입니다.
IPv4 주소 하나는 32비트로 되어 있습니다.
점으로 나뉜 마디(옥텟 · octet) 하나는 8비트라, 마디마다 0~255를 담습니다.
2진수 (이진수)
0과 1 두 글자로만 쓰는 수. 자리 하나가 왼쪽으로 갈수록 2배씩 커집니다(1 · 2 · 4 · 8 · …).
예: 192는 128 + 64라서 11000000
컴퓨터는 IP 주소를 이 모양으로 읽고, 서브넷 마스크도 이 모양으로 비교합니다.
192.168.10.25는 사람이 읽는 모양입니다. 컴퓨터는 점으로 나뉜 마디 네 개를 각각 8비트 2진수로 읽습니다. 그래서 IPv4(아이피 브이포) 주소는 모두 32비트입니다.
| 1 | 192 | 11000000 |
| 2 | 168 | 10101000 |
| 3 | 10 | 00001010 |
| 4 | 25 | 00011001 |
8비트가 전부 1이면 11111111 = 255입니다. 그래서 한 마디에는 0~255만 들어갑니다(256가지).
🐍 문법 상자 · .split(".") · 리스트[번호] — 주소를 마디로 나누기
.split(".")은 글자를 점에서 나눠 리스트로 리턴합니다. 리스트의 값 하나는 리스트[번호]로 꺼내고, 번호는 0부터 셉니다.
parts = "192.168.10.25".split(".") # .split(".") 은 글자를 점에서 나눈 리스트를 리턴한다. 그 리스트를 parts 에 담는다print(parts) # 리스트 parts 전체를 출력한다. 마디 네 개가 따옴표 붙은 글자로 들어 있다print(parts[0]) # parts[0] 은 리스트의 첫 번째 값이다. 첫째 마디 글자를 출력한다print(int(parts[3]) + 1) # 넷째 마디 글자를 int() 로 숫자로 바꾸고 1 을 더해 출력한다
['192', '168', '10', '25']
192
26
| 글자.split(".") | 글자를 점에서 나눈 리스트를 리턴한다 |
| 리스트[0] | 리스트의 첫 번째 값. 번호는 0부터 센다 |
| int("25") | 글자 "25"를 숫자 25로 바꿔 리턴한다. 글자인 채로는 더하기 계산을 할 수 없다 |
🐍 문법 상자 · format(숫자, "08b") — 8비트 2진수로
print(format(5, "08b")) # format(숫자, "08b") 는 숫자를 앞자리를 0 으로 채운 8자리 2진수 글자로 바꾼다. 5 를 바꿔 출력한다print(format(255, "08b")) # 255 를 8자리 2진수 글자로 바꿔 출력한다. 255 는 8비트로 나타낼 수 있는 가장 큰 수다bits = format(25, "08b") # 25 를 8자리 2진수 글자로 바꿔 변수 bits 에 담는다print(len(bits)) # len() 은 글자 수를 리턴한다. bits 의 글자 수를 출력한다
00000101
11111111
8
| b | 2진수(binary)로 바꾼다 |
| 08 | 빈 앞자리를 0으로 채워 8자리를 만든다 |
| int("25") | 글자 "25"를 숫자 25로 |
⚠ "08b"를 따옴표 없이 08b로 쓰면 SyntaxError입니다. 글자로 넘겨야 합니다.
2.2 사설 IP와 공인 IP
사설 IP (private IP)
회사 · 가정의 내부망에서만 쓰는 주소. 이 주소 그대로는 인터넷에서 통신하지 못합니다.
내부망에서만 쓰므로 다른 회사와 같은 주소를 써도 충돌하지 않습니다.
정해진 세 범위:
- 10.x.x.x
- 172.16~31.x.x
- 192.168.x.x
관제에서는 로그의 주소가 이 범위면 「내부망 장비」로 먼저 분류합니다.
공인 IP (public IP)
인터넷 전체에서 하나뿐인 주소. 통신사가 나눠 줍니다.
인터넷의 서버들은 이 주소로 서로를 찾습니다.
예: 8.8.8.8(구글 DNS 서버)
| 10.0.0.0 ~ 10.255.255.255 | 10.0.0.8 | 첫 마디가 10이면 전부 |
| 172.16.0.0 ~ 172.31.255.255 | 172.20.5.6 | ⚠ 둘째 마디가 16~31일 때만. 172.32.5.6은 공인 |
| 192.168.0.0 ~ 192.168.255.255 | 192.168.10.25 | 첫 두 마디가 192.168 |
세 범위는 인터넷 공통 약속입니다. 세 범위에 들지 않는 주소는 공인 IP입니다.
사설 IP는 회사마다 겹쳐도 됩니다. 인터넷으로는 나가지 않기 때문입니다.
사설이면 안전, 공인이면 공격이라는 뜻은 아닙니다. 내부망과 외부망을 가르는 첫 기준일 뿐입니다.
2.3 NAT — 사설 IP를 공인 IP로 변환
NAT (Network Address Translation)
내부망의 사설 IP를 인터넷으로 보낼 때 공인 IP로 바꾸는 주소 변환.
쓰는 이유 ① 사설 IP는 인터넷에서 쓸 수 없는 주소라, 그대로 보내면 응답이 돌아올 수 없습니다.
쓰는 이유 ② IPv4 주소는 약 43억 개뿐이라 모든 PC에 공인 IP를 줄 수 없습니다. 공인 IP 하나를 내부망 PC 여러 대가 함께 씁니다.
집 · 학원의 공유기가 이 일을 합니다.
내부망 PC가 보낸 패킷의 출발지 주소를 자기 공인 IP로 바꿔 보내고, 응답이 오면 변환 기록을 보고 원래 PC의 사설 IP로 되돌려 전달합니다.
그래서 외부 서버의 로그에는 내 PC의 사설 IP가 아니라 공유기의 공인 IP가 남습니다.
PAT (Port Address Translation)
공인 IP 하나를 내부망의 여러 PC가 함께 쓰는 NAT.
연결마다 공인 IP 쪽 포트 번호를 다르게 붙이고, 응답이 오면 그 포트 번호로 어느 PC의 연결인지 찾아 전달합니다.
집 · 학원 공유기는 대부분 이 방식입니다.
공유기는 내부망 PC가 인터넷과 통신할 때 출발지 주소를 자기 공인 IP로 바꿔 보냅니다. 이것이 NAT입니다.
| 정적 NAT | [찾아 쓰기] 2-2 (다-2) · (다-4)에서 검색해 보고서에 씁니다 |
| 동적 NAT | [찾아 쓰기] 2-2 (다-2) · (다-3)에서 검색해 보고서에 씁니다 |
| PAT | 공인 IP 하나를 여러 PC가 같이 쓰고, 포트 번호로 누구 것인지 구별한다 — 집 · 학원 공유기가 대부분 이것 |
PAT 공유기는 「공인 IP 쪽 포트 40002번 = 내부망 192.168.10.25:51234」 같은 변환표를 가지고 있다가, 답이 오면 표를 보고 원래 PC로 넘겨 줍니다.
3교시 — 서브넷 마스크 · CIDR · 같은 망 판정
왜 필요한가
주소 두 개가 같은 망인지 알아야 통신이 어떤 장비를 거쳐 가는지 말할 수 있습니다.
같은 망이면 스위치(같은 망 안의 장비들을 잇는 장비)가 바로 전달하고, 다른 망이면 게이트웨이(라우터 · 망과 망을 잇는 장비)를 거칩니다.
방화벽(허용 · 차단 규칙으로 통신을 거르는 장비) 규칙도 이 경계로 씁니다.
그 경계를 정하는 값이 255.255.255.0 같은 서브넷 마스크입니다.
3.1 서브넷 마스크 — 마디로 먼저 읽기
서브넷 (subnet)
큰 망을 나눈 작은 망 하나.
같은 서브넷 안의 장비끼리는 공유기 · 라우터를 거치지 않고 바로 통신합니다.
회사는 부서마다 서브넷을 나눠, 부서끼리 오가는 통신을 따로 관리합니다.
서브넷 마스크 (subnet mask)
IP 주소에서 어디까지가 같은 망인지 정하는 값.
255인 마디는 망 부분, 0인 마디는 장비 부분입니다.
망 부분은 이 장비가 어느 망에 속하는지를 나타내는 앞쪽 자리입니다. 같은 망에 있는 장비들은 이 부분이 모두 똑같습니다.
장비 부분은 그 망 안에서 어느 장비인지를 나타내는 뒤쪽 자리입니다. 장비마다 다릅니다.
예: 255.255.255.0이면 앞 세 마디가 망 부분.
예: 192.168.10.1 · 192.168.10.25 · 192.168.10.30은 망 부분 192.168.10이 같아서 같은 망입니다. 장비 부분 1 · 25 · 30으로 장비를 구별합니다.
컴퓨터는 IP 주소와 서브넷 마스크를 2진수로 바꿔 AND 연산을 합니다. 그 결과가 그 주소의 네트워크 주소입니다.
두 주소의 네트워크 주소가 같으면 같은 망입니다.
CIDR (Classless Inter-Domain Routing)
서브넷 마스크를 /숫자로 짧게 쓰는 표기.
/ 뒤의 숫자는 서브넷 마스크를 2진수로 바꿨을 때 1의 개수입니다.
255를 2진수로 바꾸면 11111111로 1이 8개입니다. 그래서 255인 마디 하나는 8로 셉니다.
0을 2진수로 바꾸면 00000000으로 1이 0개입니다.
예:
255.255.255.0
11111111.11111111.11111111.00000000
1이 8개인 마디가 세 개라 8 × 3 = 24, 그래서 /24입니다.
255.255.0.0
11111111.11111111.00000000.00000000
1이 8개인 마디가 두 개라 8 × 2 = 16, 그래서 /16입니다.
호스트 (host)
망 안에서 주소를 받는 장비 하나.
예: PC · 서버 · 프린터 · 스마트폰.
마디는 IP 주소에서 점으로 나뉜 숫자 하나입니다.
| 192 | 168 | 10 | 25 |
서브넷 마스크는 「1인 자리는 망 부분, 0인 자리는 장비 부분」이라고 표시하는 값입니다.
| 마스크 255.255.255.0 | 11111111 | 11111111 | 11111111 | 00000000 |
| 뜻 | 망 부분 | 망 부분 | 망 부분 | 장비 부분 |
| IP 192.168.10.25 | 192 | 168 | 10 | 25 |
앞 세 마디는 마스크가 모두 1이라 망 부분입니다. 그래서 IP의 앞 세 마디 192.168.10이 망 부분입니다.
넷째 마디는 마스크가 모두 0이라 장비 부분입니다. 그래서 25가 장비 부분입니다.
마스크는 망을 관리하는 쪽이 정합니다. 집 공유기나 학원 네트워크 장비가 PC에 IP 주소와 함께 마스크를 나눠 줍니다.
같은 망인지 가리는 법 — 두 주소에서 망 부분만 꺼내 비교합니다. 망 부분이 같으면 같은 망, 하나라도 다르면 다른 망입니다. 장비 부분은 달라도 상관없습니다.
/24이면 앞 세 마디를 비교합니다
| 192.168.10.25 | 192.168.10.200 | 192.168.10 | 192.168.10 | 같다 | 같은 망 |
| 192.168.10.25 | 192.168.20.25 | 192.168.10 | 192.168.20 | 셋째 마디 10 ≠ 20 | 다른 망 |
첫째 줄의 넷째 마디 25와 200은 장비 부분이라 달라도 같은 망입니다.
/16이면 앞 두 마디만 비교합니다
| 192.168.10.25 | 192.168.20.25 | 192.168 | 192.168 | 같다 | 같은 망 |
| 192.168.10.25 | 172.16.10.25 | 192.168 | 172.16 | 첫째 마디 192 ≠ 172 | 다른 망 |
같은 두 주소 192.168.10.25와 192.168.20.25도 /24에서는 다른 망, /16에서는 같은 망입니다.
마스크가 「앞에서 몇 마디까지 비교할지」를 정하므로, 같은 망인지는 주소가 아니라 마스크가 정합니다.
학원망은 /16입니다 — 서브넷 마스크 255.255.0.0, 기본 게이트웨이 192.168.1.1. 앞 두 마디 192.168이 같으면 같은 망입니다.
집 공유기는 보통 /24입니다 — 서브넷 마스크 255.255.255.0. 앞 세 마디가 같아야 같은 망입니다.
3.2 풀이 순서 — 192.168.10.25/24 하나 풀어 보기
네트워크 주소
192.168.10.25/24가 속한 망에는 192.168.10.0부터 192.168.10.255까지 주소 256개가 있습니다.
이 가운데 가장 작은 주소 192.168.10.0이 네트워크 주소입니다.
장비 하나가 아니라 망 전체를 가리키는 주소입니다. 그래서 PC · 서버 같은 장비의 IP 주소로 설정하지 않습니다.
브로드캐스트 주소 (broadcast)
브로드캐스트는 받는 장비를 한 대로 정하지 않고, 같은 망의 모든 장비에게 한 번에 보내는 방식입니다.
같은 망의 주소 256개 가운데 가장 큰 주소 192.168.10.255가 브로드캐스트 주소입니다.
모두가 받는 주소라서 장비 한 대의 IP 주소로는 설정하지 않습니다.
주소 하나를 받으면 아래 네 단계로 풉니다.
① 마스크 — /24는 255.255.255.0입니다.
② 망 부분 — 255가 앞 세 마디라 192.168.10이 망 부분, 마지막 마디 25가 장비 부분입니다.
③ 네트워크 주소 · 브로드캐스트 주소 — 장비 부분을 0으로 두면 네트워크 주소 192.168.10.0, 255로 두면 브로드캐스트 주소 192.168.10.255입니다.
④ 장비에 줄 수 있는 주소 — 그 둘을 뺀 192.168.10.1 ~ 192.168.10.254, 254개입니다. 기본 게이트웨이도 이 가운데 하나를 씁니다(보통 .1).
컴퓨터는 이렇게 계산합니다 — AND 연산
AND 연산
같은 자리의 비트끼리 비교해서 둘 다 1일 때만 1, 하나라도 0이면 0을 남기는 계산.
1 AND 1 = 1
1 AND 0 = 0
0 AND 0 = 0
IP 주소와 마스크를 2진수로 바꿉니다.
| IP 192.168.10.25 | 11000000 | 10101000 | 00001010 | 00011001 |
| 마스크 255.255.255.0 | 11111111 | 11111111 | 11111111 | 00000000 |
같은 자리끼리 AND 합니다.
마스크가 1인 자리는 IP의 비트가 그대로 남습니다.
마스크가 0인 자리는 IP의 비트와 상관없이 모두 0이 됩니다.
| AND 결과 | 11000000 | 10101000 | 00001010 | 00000000 |
결과를 10진수로 다시 바꾸면 192.168.10.0이 나오고, 이것이 네트워크 주소입니다.
다른 주소도 같은 마스크로 AND해서 네트워크 주소가 같으면 같은 망입니다.
3.3 마스크 · CIDR · 주소 수 표
| 255.255.0.0 | 11111111.11111111.00000000.00000000 | /16 | 65,536 | 65,534 |
| 255.255.255.0 | 11111111.11111111.11111111.00000000 | /24 | 256 | 254 |
| 255.255.255.128 | 11111111.11111111.11111111.10000000 | /25 | 128 | 126 |
| 255.255.255.192 | 11111111.11111111.11111111.11000000 | /26 | 64 | 62 |
| 255.255.255.224 | 11111111.11111111.11111111.11100000 | /27 | 32 | 30 |
| 255.255.255.240 | 11111111.11111111.11111111.11110000 | /28 | 16 | 14 |
쓸 수 있는 수는 주소 수에서 네트워크 주소 · 브로드캐스트 주소 2개를 뺀 수입니다.
CIDR 숫자가 클수록 망이 작아집니다.
3.4 ipaddress로 같은 순서 풀기
ipaddress는 IP 주소와 망을 계산하는 파이썬 모듈. 파이썬에 기본으로 들어 있어 설치가 필요 없습니다.
import ipaddressnet = ipaddress.ip_network("192.168.10.0/24")print(net.netmask)net2 = ipaddress.ip_network("192.168.10.25/24", strict=False)print(net2)
255.255.255.0
192.168.10.0/24
| import ipaddress | 파이썬에 들어 있는 모듈 ipaddress를 불러온다 |
| ipaddress.ip_network("주소/CIDR") | 그 망을 나타내는 망 객체를 리턴한다 |
| strict=False | 망의 첫 주소가 아닌 값을 넣어도 에러 없이, 그 주소가 속한 망을 만든다 |
| 망.netmask | 서브넷 마스크 |
| 망.network_address | 네트워크 주소 |
| 망.broadcast_address | 브로드캐스트 주소 |
4교시 — 서브네팅: 부서마다 필요한 만큼 나누기
왜 필요한가
회사가 192.168.50.0/24(주소 256개)를 받았습니다.
개발팀 · 운영팀처럼 부서마다 다른 망으로 나눠야 서로의 PC에 함부로 닿지 않습니다.
큰 망을 작은 망 여러 개로 나누는 일이 서브네팅입니다.
아무렇게나 나누면 주소가 모자라거나 두 부서가 같은 주소를 받는 사고가 납니다.
4.1 큰 망을 반으로 나누기 — /25
서브네팅 (subnetting)
큰 망을 작은 망 여러 개로 나누는 일.
부서마다 망을 따로 주면 부서 사이 통신을 나눠 관리할 수 있습니다.
블록
큰 망을 나눠 생긴 작은 망 하나.
블록 하나도 망 하나와 같습니다. 가장 작은 주소가 네트워크 주소, 가장 큰 주소가 브로드캐스트 주소입니다.
| /24 | 255.255.255.0 | 256 | 254 |
| /25 | 255.255.255.128 | 128 | 126 |
| /26 | 255.255.255.192 | 64 | 62 |
| /27 | 255.255.255.224 | 32 | 30 |
| /28 | 255.255.255.240 | 16 | 14 |
/25 블록 하나는 주소 128개입니다.
.0 ──────────────── .127 │ .128 ──────────────── .255
블록 1 (128개) │ 블록 2 (128개)
| 192.168.50.0/25 | .0 ~ .127 | .0 | .127 | .1 ~ .126 | 126 |
| 192.168.50.128/25 | .128 ~ .255 | .128 | .255 | .129 ~ .254 | 126 |
블록은 쓸 수 있는 수(126)가 아니라 주소 수(128)만큼씩 자릅니다.
| /25 | 128개 | 2개 | .0 · .128 |
| /26 | 64개 | 4개 | .0 · .64 · .128 · .192 |
🐍 .subnets(new_prefix=…)
import ipaddress
parent = ipaddress.ip_network("192.168.50.0/24")
for block in parent.subnets(new_prefix=26):
print(block)
192.168.50.0/26
192.168.50.64/26
192.168.50.128/26
192.168.50.192/26
4.2 설계 검증 — 용량과 겹침
겹침 (overlap)
두 부서의 망이 같은 주소를 함께 가진 상태.
같은 주소를 두 부서 장비가 받으면 주소 충돌로 통신이 끊기고, 로그의 주소로 어느 장비인지 가릴 수 없습니다.
설계표를 만들면 두 가지를 확인합니다.
- 용량 — 부서 망의 「쓸 수 있는 수」가 장비 수 이상인가
- 겹침 — 두 부서의 망이 같은 주소를 갖지 않는가
🐍 .overlaps() — 두 망이 겹치는지
import ipaddress
a = ipaddress.ip_network("192.168.50.0/26")
b = ipaddress.ip_network("192.168.50.64/26")
c = ipaddress.ip_network("192.168.50.0/25")
print(a.overlaps(b))
print(a.overlaps(c))
False
True
망1.overlaps(망2)는 같이 가진 주소가 하나라도 있으면 True, 없으면 False를 리턴합니다.
5교시 — 스위치와 라우터 · 다음 홉
왜 필요한가
PC는 패킷을 보내기 전에 목적지가 같은 망인지부터 계산합니다.
같으면 스위치로 바로, 다르면 기본 게이트웨이로 보냅니다.
관제에서 「같은 층 PC끼리는 되는데 다른 부서로만 안 된다」 같은 문의는 대부분 이 판정에서 원인이 나옵니다.
게이트웨이를 다른 망 주소로 잘못 설정하면 물리적 연결(랜선 · Wi-Fi)이 정상이어도 다른 망(인터넷)으로 패킷을 보내지 못합니다.
5.1 두 장비가 하는 일
MAC 주소 표
스위치가 기억하는 「이 MAC 주소는 몇 번 포트에 있다」 표.
프레임이 들어오면 보낸 쪽 MAC과 들어온 포트를 적어 둡니다.
다음부터는 그 MAC으로 가는 프레임을 그 포트로만 보냅니다.
| 층 | 2층(데이터링크) | 3층(네트워크) |
| 보는 주소 | MAC 주소 | IP 주소 |
| 잇는 범위 | 같은 망의 장비들 | 다른 망 사이 |
| 기억하는 표 | MAC 주소 표 | 라우팅 표 |
5.2 같은 망이면 스위치로, 다른 망이면 게이트웨이로
다음 홉 (next hop)
지금 장비가 패킷을 바로 넘겨줄 다음 장비.
패킷은 목적지까지 장비를 하나씩 건너가는데, 장비마다 「다음은 누구」만 알면 됩니다.
PC의 다음 홉은 보통 기본 게이트웨이(공유기)입니다.
ARP
IP 주소를 보고 그 장비의 MAC 주소를 알아내는 방법.
내 PC가 알아 둔 「IP 주소 → MAC 주소」 목록을 ARP 캐시라고 하고, arp -a로 봅니다.
| 개발팀 | 192.168.10.0/24 | 192.168.10.1 |
| 운영팀 | 192.168.20.0/24 | 192.168.20.1 |
| 보안팀 | 192.168.30.0/24 | 192.168.30.1 |
개발팀 PC 192.168.10.25가 보낼 곳은 이렇게 정합니다.
| 192.168.10.30 | 10 = 10 — 같은 망 | 스위치로 직접 | .30 PC의 MAC |
| 192.168.30.5 | 10 ≠ 30 — 다른 망 | 게이트웨이 192.168.10.1 | 게이트웨이의 MAC |
| 8.8.8.8 | 첫째 마디부터 다르다 | 게이트웨이 192.168.10.1 | 게이트웨이의 MAC |
다른 망으로 보낼 때 패킷의 두 주소는 이렇게 됩니다.
| 목적지 IP | 192.168.30.5 | 끝까지 그대로 |
| 목적지 MAC | 게이트웨이의 MAC | 장비를 하나 지날 때마다 바뀐다 |
PC는 ARP로 같은 망의 장비에게만 MAC을 묻습니다.
다른 망으로 보낼 때는 게이트웨이의 MAC만 알면 됩니다.
5.3 스위치가 프레임을 받으면
프레임 (frame)
2계층에서 주고받는 데이터 묶음.
맨 앞에 보낸 쪽 · 받는 쪽 MAC 주소가 적혀 있고, 스위치는 이 MAC을 보고 포트를 고릅니다.
플러딩 (flooding)
목적지 MAC이 MAC 주소 표에 없을 때 들어온 포트를 뺀 모든 포트로 복사해 보내는 것.
답이 돌아오면 스위치가 그 MAC의 포트를 배우고, 그다음부터는 그 포트로만 보냅니다.
스위치는 프레임이 들어올 때마다 아래 세 단계를 합니다.
① 출발지를 적는다 — 보낸 MAC과 들어온 포트를 MAC 주소 표에 적습니다.
② 목적지를 찾는다 — 받는 MAC이 표에 있는지 봅니다.
③ 내보낸다 — 표에 있으면 그 포트 하나로만, 없으면 들어온 포트를 뺀 모든 포트로 플러딩합니다.
| 2번 포트로 CC → DD | CC는 2번 | DD 없음 | 1 · 3 · 4번 | CC:2 |
| 4번 포트로 DD → CC | DD는 4번 | CC 있음(2번) | 2번 하나로만 | CC:2 · DD:4 |
스위치가 배우는 것은 출발지입니다.
🐍 딕셔너리로 MAC 주소 표 만들기
mac_table = {}
mac_table["CC"] = 2
print(mac_table)
print("CC" in mac_table)
print("DD" in mac_table)
print(mac_table["CC"])
{'CC': 2}
True
False
2
| {} | 빈 딕셔너리를 만든다 |
| d["CC"] = 2 | 키 "CC"에 값 2를 넣는다 |
| "CC" in d | 키 "CC"가 있으면 True |
| d["CC"] | 키 "CC"의 값을 꺼낸다. 없는 키면 KeyError |
6교시 — VLAN · 라우팅 표 · 기본 경로
왜 필요한가
부서마다 스위치를 따로 사면 비쌉니다.
스위치 하나를 여러 망으로 나누는 것이 VLAN입니다.
VLAN이 다르면 같은 스위치에 꽂혀 있어도 직접 못 주고받습니다.
개발팀 PC가 감염돼도 보안팀 망으로 바로 퍼지지 않습니다.
VLAN 사이를 오가려면 라우터가 필요하고, 라우터는 라우팅 표를 보고 경로를 고릅니다.
내 PC에도 라우팅 표가 있습니다.
홉 (hop)
패킷이 목적지까지 가면서 거쳐 가는 라우터 하나를 홉 하나로 셉니다.
6.1 VLAN — 스위치 하나를 여러 망으로
LAN (Local Area Network)
건물 · 층처럼 가까운 곳의 장비를 묶은 망.
같은 LAN의 장비끼리는 스위치가 MAC 주소로 프레임을 전달합니다.
VLAN (Virtual LAN)
스위치 포트마다 번호를 정해 스위치 하나를 여러 망으로 나눈 것.
VLAN이 다르면 같은 스위치에 꽂혀 있어도 서로 다른 망이라 직접 통신하지 못합니다.
부서마다 VLAN을 나누면 브로드캐스트가 그 부서에만 퍼집니다.
예:
개발팀 = VLAN 10 = 192.168.10.0/24
운영팀 = VLAN 20 = 192.168.20.0/24
보안팀 = VLAN 30 = 192.168.30.0/24
VLAN은 스위치가 포트를 나누는 번호이고, 서브넷은 PC가 쓰는 IP 주소의 범위입니다.
액세스 포트 (access port)
PC · 프린터 같은 장비를 꽂는 포트.
포트마다 VLAN 번호가 하나씩 정해져 있습니다.
예:
1번 포트 → VLAN 10
2번 포트 → VLAN 20
VLAN 번호는 스위치에서만 설정합니다. PC에서는 따로 설정하지 않습니다.
개발팀 PC가 보낸 브로드캐스트는 VLAN 10 포트에만 퍼지고, VLAN 20 · 30 포트에는 가지 않습니다.
VLAN이 다른 장비끼리는 같은 스위치에 꽂혀 있어도 라우터를 거쳐야 오갑니다.
⚠ 서로 다른 VLAN에 같은 서브넷을 주면, PC는 같은 망이라 생각해 게이트웨이로 안 보내고, 스위치는 VLAN이 달라 막습니다 — 라우터가 있어도 안 됩니다.
6.2 라우팅 표와 기본 경로
라우팅 표 (routing table)
「이 망으로 가려면 다음 홉은 누구」를 적은 표.
라우터와 내 PC 모두 가지고 있습니다.
패킷의 목적지 주소에 맞는 줄을 찾아 그 줄의 다음 홉으로 보냅니다.
게이트웨이 (gateway)
내 망 밖으로 나가는 패킷을 받아 다른 망으로 보내 주는 라우터의 주소입니다.
기본 경로 (default route)
라우팅 표의 0.0.0.0/0 줄.
/0은 비교할 마디가 하나도 없다는 뜻이라 모든 주소에 맞습니다.
개발팀 PC 192.168.10.25의 라우팅 표는 다음과 같습니다.
| 192.168.10.0/24 | 직접 연결 | 앞 세 마디가 192.168.10 | 내 망이라 스위치로 바로 보낸다 | 192.168.10.30 |
| 0.0.0.0/0 | 192.168.10.1 | 위 줄에 맞지 않는 나머지 전부 | 게이트웨이에 넘긴다 | 8.8.8.8 · 192.168.20.5 |
0.0.0.0/0은 「위에서 맞지 않은 나머지는 전부 여기로」라는 줄이 되고, 이 줄을 기본 경로라고 부릅니다.
ipconfig와 tracert
ipconfig의 「기본 게이트웨이」는 내 PC가 「나머지 전부」를 넘기는 장비입니다.
tracert -d -h 5 8.8.8.8
tracert는 목적지까지 거쳐 가는 장비를 다음 홉 순서대로 보여 줍니다.
최대 5홉 이상의
8.8.8.8(으)로 가는 경로 추적
1 <1 ms <1 ms <1 ms 192.168.1.1
2 2 ms 1 ms 1 ms 10.10.0.1
3 * * * 요청 시간이 만료되었습니다.
4 5 ms 4 ms 4 ms 112.188.0.1
5 6 ms 5 ms 6 ms 112.174.0.1
| 맨 앞 숫자 1 · 2 … | 몇 번째 다음 홉인가 |
| 가운데 ms 세 개 | 같은 홉에 세 번 보내 답이 오기까지 걸린 시간 |
| <1 ms | 1밀리초보다 짧게 걸렸다는 뜻 |
| 맨 끝 주소 | 그 홉의 라우터 주소 |
| * * * | 그 장비가 답하지 않도록 막아 둔 것. 길이 끊긴 것이 아니다 |
경로 확인 — 2번 · 3번 줄 주소를 차례로 보면 학원 공유기 → 통신사 라우터 → … 순서로 간다는 것을 알 수 있습니다.
관제 · 장애 대응 — 어느 줄부터 주소가 안 나오고 끝까지 끊기는지 보면 문제가 생긴 구간을 좁힐 수 있습니다.
6.3 회사 라우터의 라우팅 표
| 192.168.10.0/24 | 직접 연결 VLAN 10 |
| 192.168.20.0/24 | 직접 연결 VLAN 20 |
| 192.168.30.0/24 | 직접 연결 VLAN 30 |
| 0.0.0.0/0 | 인터넷 쪽 라우터 |
목적지가 들어가는 회사 망 줄이 있으면 그 줄로 보냅니다.
회사 망 줄에 하나도 맞지 않으면 기본 경로 0.0.0.0/0 줄로 인터넷 쪽 라우터에 보냅니다.
🐍 튜플 리스트
routes = [ ("192.168.10.0/24", "VLAN 10"), ("192.168.20.0/24", "VLAN 20")]for net, hop in routes: print(net, "→", hop)
192.168.10.0/24 → VLAN 10
192.168.20.0/24 → VLAN 20
🐍 ipaddress.ip_address() · 주소 in 망
import ipaddressnet = ipaddress.ip_network("192.168.30.0/24")pc = ipaddress.ip_address("192.168.30.5")web = ipaddress.ip_address("8.8.8.8")print(pc in net)print(web in net)
True
False
🐍 found = False → found = True
found = Falsefor vlan in [10, 20, 30]: if vlan == 30: found = Trueprint(found)
True
| found = False | 반복 전에 「아직 못 찾음」으로 시작한다 |
| found = True | 찾았을 때 바꾼다 |
| if found == False: | 반복이 끝나도 한 번도 못 찾았으면 실행한다 |
7교시 — 오늘 배운 것 다시 풀기 · 설계서 올리기
왜 필요한가
관제 업무에서는 매번 처음 보는 주소가 나옵니다.
주소가 바뀌어도 오늘 배운 순서 그대로 풀 수 있는지 확인하고, 다 채운 설계서를 깃허브에 올립니다.
설계서
주소 · VLAN · 게이트웨이 · 경로를 정리해 적은 문서.
오늘은 보고서 day02_subnet_design.md가 설계서이고, 맨 아래 「최종 설계서」에 회사망을 정리합니다.
🐍 f-string · strict=False · 망 객체
import ipaddressip = "192.168.20.7"cidr = f"{ip}/24"net = ipaddress.ip_network(cidr, strict=False)print(cidr)print(net.network_address)
192.168.20.7/24
192.168.20.0
| f"{ip}/24" | f-string — {} 안의 변수 값을 글자에 넣는다 |
| ipaddress.ip_network("주소/CIDR", strict=False) | 그 주소가 속한 망 객체를 만든다 |
| .netmask | 서브넷 마스크 |
| .network_address | 네트워크 주소 |
| .broadcast_address | 브로드캐스트 주소 |
너무 피곤해요,, 오늘 약간 몰아친 느낌,,,,
그럼 아됴,,
'공부 > SKT ALEPH' 카테고리의 다른 글
| 네트워크·ZT(Zero Trust) 운영 기초 - 1 (0) | 2026.10.12 |
|---|---|
| AI·자동화 기초(에이전트·API·스크립팅) - 9 (0) | 2026.10.08 |
| AI·자동화 기초(에이전트·API·스크립팅) - 8 (0) | 2026.10.07 |
| AI·자동화 기초(에이전트·API·스크립팅) - 7 (0) | 2026.10.06 |
| AI·자동화 기초(에이전트·API·스크립팅) - 6 (0) | 2026.10.02 |


