수강생 전용 보너스 시리즈예요. 수강생은 로그인하면 바로 볼 수 있어요.

2강 / 전체 30강

네트워크 기초 — IP·포트·DNS·HTTPS

11분 읽기 조회 0

ip·ss·dig·openssl 명령으로 사설 IP와 포트, DNS 레코드와 TTL, TLS 인증서를 확인하고 인증서 오류와 방화벽 차단을 구별합니다.

🎯 학습 목표

지난 강에서 본 요청 네 단계 중 앞의 세 단계를 열어 봅니다. 이 강을 마치면 내 서버의 IP와 열린 포트를 확인하고, dig로 DNS 레코드를 조회하고, openssl로 인증서의 이름·발급자·만료일을 읽을 수 있습니다.

  • 포트와 소켓의 관계를 이해하고 ss -ltn으로 대기 중인 포트를 찾는다
  • DNS 레코드와 TTL을 읽고, 인증서 오류·방화벽 차단을 구별한다

환경: Ubuntu 24.04(WSL2), OpenSSL 3.0.13, dig 9.18.39(우분투 dnsutils 패키지, 우분투 컨테이너 안에서 실행).

🌐 IP·포트·DNS·TLS 핵심 개념

IP 주소는 네트워크에서 장비를 찾는 주소입니다. IPv4는 32비트(예: 172.17.160.120), IPv6는 128비트(예: 2606:4700::6810:2d63)입니다. RFC 1918은 인터넷에 직접 나가지 않는 사설 IP 대역으로 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16을 정했습니다. 사설 IP는 NAT를 거쳐 공인 IP로 바뀌어 나갑니다. 127.0.0.1은 자기 자신을 가리키는 루프백입니다. /20은 앞 20비트가 네트워크 부분이라는 뜻입니다.

포트는 한 IP 안에서 프로그램을 구분하는 0~65535의 번호입니다. IANA는 0~1023을 시스템 포트(80 HTTP, 443 HTTPS, 22 SSH 등), 1024~49151을 사용자 포트, 49152~65535를 동적 포트로 나눕니다. 「IP + 포트 + 프로토콜」 조합이 통신의 끝점인 소켓입니다.

DNS는 이름을 값으로 바꾸는 분산 데이터베이스입니다. 각 기록을 레코드라 하고, 결과를 캐시해도 되는 시간(초)을 TTL이라 합니다. TTL이 남아 있는 동안은 레코드를 바꿔도 예전 값이 보일 수 있습니다.

레코드담는 값쓰임
A / AAAAIPv4 / IPv6 주소웹·서버 접속
CNAME다른 이름(별칭)CDN·외부 서비스 연결
MX메일 서버와 우선순위메일 수신
TXT임의 문자열SPF, 도메인 소유 확인

HTTPS는 HTTP를 TLS로 감싼 것입니다. 현재 최신 TLS 1.3은 RFC 8446(2018)에 정의되어 있습니다. 서버는 인증서로 이름의 주인임을 증명하고, 클라이언트는 이름(SAN)·유효 기간·발급 기관을 검증합니다.

💻 실습 — 명령으로 네 가지 확인하기

1단계: 내 IP와 경로

$ ip -br addr
lo               UNKNOWN        127.0.0.1/8 10.255.255.254/32 ::1/128
eth0             UP             172.17.160.120/20 fe80::215:5dff:fe43:f09c/64
$ ip route
default via 172.17.160.1 dev eth0 proto kernel
172.17.160.0/20 dev eth0 proto kernel scope link src 172.17.160.120 

-br는 한 줄 요약입니다. eth0의 172.17.160.120은 172.16.0.0/12의 사설 IP이고, fe80::는 링크 안에서만 쓰는 IPv6 주소입니다. default via 172.17.160.1은 「모르는 목적지는 이 게이트웨이로 보낸다」는 기본 경로입니다. 파이썬 표준 모듈로도 판별할 수 있습니다.

$ python3 -c "
import ipaddress
for a in ['10.0.0.5','172.17.160.120','8.8.8.8','100.64.0.1']:
    ip=ipaddress.ip_address(a); print(f'{a:22} v{ip.version} private={ip.is_private} global={ip.is_global}')
"
10.0.0.5               v4 private=True global=False
172.17.160.120         v4 private=True global=False
8.8.8.8                v4 private=False global=True
100.64.0.1             v4 private=False global=False

100.64.0.0/10은 통신사 NAT용 공유 대역(RFC 6598)이라 사설도 공인도 아닙니다.

2단계: 대기 중인 포트

$ ss -ltn
State  Recv-Q Send-Q  Local Address:Port Peer Address:PortProcess
LISTEN 0      4096    127.0.0.53%lo:53        0.0.0.0:*
LISTEN 0      511         127.0.0.1:3000      0.0.0.0:*
LISTEN 0      511              [::]:3000         [::]:*
… 생략 …

-l 대기, -t TCP, -n 숫자 표시입니다. 127.0.0.1:3000은 이 컴퓨터 안에서만, [::]:3000이나 0.0.0.0은 모든 인터페이스에서 받는다는 뜻입니다. 외부 접속이 안 되면 127.0.0.1에만 묶였는지 먼저 봅니다.

3단계: dig로 DNS 조회

$ dig example.com
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9120
;; QUESTION SECTION:
;example.com.			IN	A
;; ANSWER SECTION:
example.com.		7	IN	A	172.66.147.243
example.com.		7	IN	A	104.20.23.154
;; SERVER: 192.168.65.7#53(192.168.65.7) (UDP)
… 생략 …

status: NOERROR는 정상 응답, ANSWER의 7은 남은 TTL(초), SERVER는 질의를 받은 DNS 서버(여기서는 컨테이너용 내부 DNS)입니다. +short는 값만 보여 줍니다.

$ dig www.python.org +noall +answer
www.python.org.		567282	IN	CNAME	dualstack.python.map.fastly.net.
dualstack.python.map.fastly.net. 33 IN	A	151.101.64.223
… 생략 …
$ dig ietf.org MX +short
0 mx.ietf.org.
$ dig nothing-here.example.com
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 12430

www.python.org는 CNAME으로 CDN 주소를 가리키고, 그 이름이 다시 A 레코드로 풀립니다. MX의 0은 우선순위입니다. NXDOMAIN은 그런 이름이 없다는 응답입니다.

4단계: openssl로 인증서 읽기

$ openssl s_client -connect www.python.org:443 -servername www.python.org </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName
subject=CN = www.python.org
issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2025 Q4
notBefore=Jan 13 13:03:46 2026 GMT
notAfter=Feb 14 13:03:45 2027 GMT
X509v3 Subject Alternative Name:
    DNS:www.python.org, DNS:*.python.org, DNS:python.org

-servername은 어느 사이트의 인증서를 원하는지 알리는 SNI 값으로, IP 하나에 여러 사이트가 있으면 꼭 필요합니다. notAfter가 만료일이고, SAN 목록에 접속 이름이 있어야 브라우저가 경고하지 않습니다.

⚠️ 자주 하는 실수와 해결

인증서 오류를 하나로 뭉뚱그리기. 원인별로 메시지가 다릅니다. 만료는 갱신, 이름 불일치는 SAN에 이름을 추가해 재발급해야 합니다.

$ curl https://expired.badssl.com/
curl: (60) SSL certificate problem: certificate has expired
$ curl https://wrong.host.badssl.com/
curl: (60) SSL: no alternative certificate subject name matches target host name 'wrong.host.badssl.com'

curl -k로 검증을 끄는 것은 오류를 숨길 뿐이니 운영 스크립트에 남기지 않습니다.

DNS 서버마다 답이 같다고 가정하기. 이 환경의 내부 DNS에 dig ietf.org AAAA +short를 물으면 빈 결과였지만, 공용 DNS를 지정하면 주소가 나왔습니다. 「나만 안 열려요」 상황에서는 @서버로 비교합니다.

$ dig @1.1.1.1 ietf.org AAAA +short
2606:4700::6810:2d63
2606:4700::6810:2c63

방화벽 차단과 연결 거부 혼동. 포트에 프로그램이 없으면 즉시 거부(curl 오류 7)되지만, 방화벽이 패킷을 버리면 응답 없이 시간 초과가 납니다.

$ timeout 3 bash -c 'echo > /dev/tcp/example.com/443' && echo "443 open"
443 open
$ timeout 3 bash -c 'echo > /dev/tcp/example.com/22'; echo "exit=$?"
exit=124

22번은 3초 동안 아무 응답이 없어 timeout이 종료 코드 124로 끊었습니다. 즉시 거부라면 서버 프로세스를, 시간 초과라면 서버·클라우드의 방화벽(보안 그룹) 규칙을 먼저 확인합니다. 방화벽은 「필요한 포트만 열고 나머지는 막는다」가 기본 원칙입니다.

✏️ 확인 문제

  1. 다음 중 사설 IP가 아닌 것은? ① 10.1.2.3 ② 172.20.0.5 ③ 192.168.1.10 ④ 172.32.0.1 정답 ④ — 172.16.0.0/12는 172.16~172.31까지입니다.
  2. 서버가 외부에서 안 열립니다. ss -ltn에 127.0.0.1:8080만 보입니다. 원인은? 정답 루프백에만 바인드되어 외부 접속을 받지 않는다 — 0.0.0.0 등 외부 인터페이스에 바인드해야 합니다.
  3. www 주소가 다른 이름을 가리키는지 확인할 레코드는? ① MX ② CNAME ③ TXT ④ SOA 정답 ② — CNAME은 별칭입니다.
  4. status: NXDOMAIN의 뜻은? 정답 그 이름이 DNS에 존재하지 않는다 — 오타나 레코드 미등록을 확인합니다.
  5. 포트 연결이 즉시 거부되지 않고 시간 초과로 끝났습니다. 먼저 볼 곳은? ① 인증서 만료일 ② 방화벽·보안 그룹 규칙 ③ DNS TTL ④ HTTP 상태 코드 정답 ② — 패킷이 버려질 때 나타나는 전형적 증상입니다.

📝 핵심 요약과 다음 강 예고

  • 사설 IP: 10/8, 172.16/12, 192.168/16 — ip -br addr, ip route
  • 포트: ss -ltn, 127.0.0.1은 내부 전용
  • DNS: dig 이름 종류 +short, @서버로 비교, TTL 동안 캐시
  • TLS: openssl s_client … | openssl x509 -noout -dates -ext subjectAltName

다음 강에서는 이렇게 요청을 받는 서버 자체, 즉 리눅스 서버의 권한·프로세스·서비스·로그를 다루는 기본 운영 명령을 익힙니다.

📚 참고 자료

관련 주제

  • 사설 IP
  • 포트
  • 소켓
  • DNS 레코드
  • dig
  • TTL
  • TLS 인증서
  • openssl s_client
  • 방화벽
  • 개발·프로그래밍
  • 개발·프로그래밍 강의
  • 클라우드·인프라 실무 — 서버부터 도커·쿠버네티스까지 30강
  • NUGUNA
  • 누구나

📚 시리즈 전체 공유

클라우드·인프라 실무 — 서버부터 도커·쿠버네티스까지 30강

이 강의가 속한 시리즈는 총 30강(수강생 전용 보너스 · 1~3강 무료)입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.

댓글

0/1000

불러오는 중...