[부트캠프 - 17일차] 1/14.수 - Network

developowl·2026년 1월 14일

부트캠프

목록 보기
8/29
post-thumbnail

10. NetworkManagement

네트워크 설정

route - 라우팅 테이블과 게이트웨이 주소 관리

  • ip route 명령은 라우팅 테이블을 출력하거나 게이트웨이를 설정하고 삭제
  • gateway
    • 네트워크를 다른 네트워크와 연결할 때 연결점이 되는 장치
    • 게이트웨이도 하나의 컴퓨터로 보통 라우터라고 부름
    • 게이트웨이는 패킷을 보고 같은 네트워크로 보내는 것이 아니면 외부로 전송
    • 게이트웨이 주소가 설정되어 있지 않으면 같은 네트워크가 아닌 컴퓨터와는 접속할 수 없음

라우팅 테이블 확인

ip route show
  • 결과
    • default via 192.168.64.1 dev enp0s1 proto dhcp src 192.168.64.2 metric 100
    • 192.168.64.0/24 dev enp0s1 proto kernel scope link src 192.168.64.2 metric 100
    • 192.168.64.1 dev enp0s1 proto dhcp scope link src 192.168.64.2 metric 100
  • default는 기본 게이트웨이
  • 두번째(dev eno0s3 proto kernel scope link src 1.1.1.1 metric 100) 는 서브넷 설정과 커널이 자동 설정한 것

기본 게이트웨이 설정

  • sudo ip route add default via 게이트웨이 주소 dev 디바이스
    • ex) sudo ip route add default via 192.168.56.1 dev enp0s8

라우팅 경로 삭제

  • sudo ip route del 네트워크 주소
    • ex) sudo ip route del 192.168.2.0/24

네트워크 인터페이스 관리 명령

# 네트워크 인터페이스 비활성화
sudo ip link set enp0s8 down

# 네트워크 인터페이스 활성화
sudo ip link set enp0s8 upd

ifconfig

# net-tools 라는 패키지를 설치해야 함
sudo apt install net-tools

# ifconfig [인터페이스명] [옵션] [값]
  • 옵션

    • -a: 시스템의 전체 인터페이스에 대한 정보를 출력
    • -up/down: 인터페이스를 활성화 및 비활성화
    • -netmask 주소: 넷마스크 주소를 설정
    • -broadcast 주소: 브로드캐스트 주소를 설정
  • 모든 네트워크 인터페이스 확인: ifconfig

    enp0s1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            
            # inet, netmask, broadcast
            inet 192.168.64.2  netmask 255.255.255.0  broadcast 192.168.64.255
            
            # IPv6
            inet6 fe80::c42e:7bff:fe86:d9c5  prefixlen 64  scopeid 0x20<link>
            inet6 fd8b:c0b4:d374:f3ea:c42e:7bff:fe86:d9c5  prefixlen 64  scopeid 0x0<global>
            
            # MAC Address
            ether c6:2e:7b:86:d9:c5  txqueuelen 1000  (Ethernet)
            
            # 부팅 후 받은 패킷 수와 바이트 수
            RX packets 3803  bytes 567648 (567.6 KB)
            RX errors 0  dropped 0  overruns 0  frame 0
            
            # 부팅 후 보낸 패킷 수와 바이트 수
            TX packets 2059  bytes 233912 (233.9 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    • MAC 주소(ether)
    • IP 주소(inet)
    • netmask
    • Broadcast
    • IPv6
    • RX: 부팅 후 현재까지 받은 패킷 수와 바이트 수
    • TX: 부팅 후 현재까지 보낸 패킷 수와 바이트 수
  • 인터페이스 설정

    • sudo ifconfig <디바이스> <ip 주소> netmask <서브넷 마스크> broadcast <브로드캐스트 주소>

      sudo ifconfig enp0s3 192.168.0.101 netmask 255.255.255.0 broadcast 192.168.0.255

Gateway 설정

route [명령]
  • 명령
    • add : 라우팅 경로나 기본 게이트웨이 추가
    • del : 라우팅 경로나 기본 게이트웨이 제거

route - 라우팅 테이블 보기

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    100    0        0 enp0s1
192.168.64.0    0.0.0.0         255.255.255.0   U     100    0        0 enp0s1
_gateway        0.0.0.0         255.255.255.255 UH    100    0        0 enp0s1
  • Destination : 목적지
  • Gateway : 게이트웨이
  • Genmask : 서브넷마스크
    • 255.255.255.255 이면 호스트이고, 0.0.0.0 이면 default 경로
  • Flags :
  • Metric : 대상까지의 거리 (리눅스에서는 사용하지 않음)
  • Ref : 해당 경로에 대한 참조 수 (리눅스에서는 사용하지 않음)
  • Use : 사용 여부
  • Iface : 패킷이 전달되는 인터페이스 이름

게이트웨이 설정

# 기본 게이트웨이 설정
sudo route add default gw 192.168.147.2 dev ens33

# 기본 게이트웨이 삭제
sudo route del default gw 192.168.147.2

DNS 설정

  • Domain Name Service
  • 호스트 이름을 IP 주소로 바꾸는 역할을 수행
  • DNS가 설정되어 있지 않으면 이름으로 서버에 접속할 수 없으며, 직접 IP 주소를 사용하여 접속해야 함
  • 17.04 버전부터 DNS를 관리하는 systemd-resolved 서비스를 도입
  • 리눅스는 DNS 서버의 주소를 /etc/resolv.conf 파일에 저장
  • 확인 - cat /etc/resolv.conf
    nameserver 127.0.0.53
    options edns0 trust-ad
    search tail0e1ecb.ts.net
    • 127.0.0.53 이 기본으로 설정되어 있지만 이 주소가 실제 DNS 주소는 아님
    • Linux 시스템에서는 /etc/resolv.conf 파일에 DNS 서버 목록이 직접 명시되지만 systemd-resolved 를 사용하는 우분투에서는 이 파일이 로컬 스터브 주소(127.0.0.53)를 가리키는 심볼릭 링크인 경우가 많음

DNS 정보 확인 - resolvectl status

Global
         Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
  resolv.conf mode: stub

Link 2 (enp0s1)
    Current Scopes: DNS
         Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.64.1
       DNS Servers: 192.168.64.1 fe80::a09a:8eff:fe27:764
        DNS Domain: tail0e1ecb.ts.net
  • Global 섹션
    • 전역 DNS 설정을 보여줌
  • Link 섹션
    • 각 네트워크 인터페이스(eth0, wlan0 등)별 DNS 설정을 보여줌
  • Current DNS Server 섹션
    • 현재 활발하게 사용되는 DNS 서버 주소
      • DNS Servers 해당 링크에 설정된 모든 DNS 서버 목록

DNS 설정

# nmcli 명령으로 DNS 정보 설정
nmcli con mod connection-name ipv4.dns

# DNS 서버에 질의(exit으로 종료)
nslookup

netplan

  • 우분투에서 네트워크 구성을 관리하는 도구 중 하나
  • 네트워크 구성을 설정 파일을 이용해서 작업
  • /etc/etplan 디렉토리에 YAML 파일을 만들어주면 됨
  • 파일 이름은 아무거나 상관 없음
  • 파일을 수정하고 적용할 때는 sudo netplan apply 또는 재부팅

📌 yaml

  • 데이터 직렬화 양식(데이터를 텍스트로 표현하기 위한 방법)
  • 사람이 읽고 쓰기 매우 편하게 설계된 방식
  • 설정 파일, 데이터 저장, 시스템 간 데이터 교환(쿠버네티스, 도커, 스프링 붑트 등)에 널리 사용
  • JSON 이나 XML 보다 문장 구조가 단순
  • 공백을 이용해서 계층 구조를 정의(들여쓰기)
  • 주석 지원(JSON은 주석 지원 x)
  • 상위 호환성(모든 JSON 파일은 유요한 yaml 파일)
  • 확장자는 일반적으로 yaml, yml을 사용

DHCP

  • 동적 호스트 설정
  • IP pool을 가지고 있다가 클라이언트가 접속할 때 IP를 할당해주는 서비스
  • 직접 IP를 설정하면 관리자가 계속해서 IP가 중복되지 않도록 할당을 해야 함
  • 단점) 부팅할 때마다 IP가 변경될 수 있음
# 인터페이스 설정
sudo vim /etc/netplan/01-netcfg.yaml

# 작성
network:
	version: 2
	renderer: networkd
	ethernets:
		enp0s1:
			dhcp4: no
			addresses:
				- <IP Address>
				- <IP Address>
			gateway4: <Gateway Address>
			nameservers:
				addresses: [8.8.8.8, <DNS Address>]

Host Name 설정

호스트 이름 출력 - uname

uname [옵션]
  • -m: 하드웨어 종류를 출력
  • -n: 호스트 이름을 출력
  • -r: 운영체제의 릴리즈 정보를 출력
  • -s: 운영체제의 이름을 출력
  • -v: 운영체제의 버전을 출력
  • -a: 위의 모든 정보

호스트 이름 출력 및 설정

hostname

hostname [옵션] [호스트 이름]
  • 옵션

    • -l : 모든 IP 주소 출력
    • -f : 전체 도메인(FQDN)
  • 이름 변경(현재 세션에서만 유효)

    • sudo hostname <변경할 이름>

hostnamectl

hostnamectl [옵션] [명령]
  • 옵션
    • -h : 도움말 출력
    • --version : 버전을 출력
  • 명령
    • status : 현재 호스트 이름과 관련 정보 출력
    • set-hostname : 호스트 이름을 설정

/etc/hosts

  • 도메인 이름(hostname)을 IP 주소에 수동으로 매핑하는 데 사용되는 텍스트 파일(로컬 DNS 파일)
  • DNS(Domain Name System) 조회를 거치지 않고 특정 호스트 이름을 IP 주소로 변환하는 데 사용되며, 주로 로컬 시스템에서 가장 먼저 참조하는 파일
  • 도메인을 IP로 변환해서 로컬에서 강제로 지정
    • 127.0.0.1 localhost 로 설정되어 있으면 localhost를 접속하고자 하는 명령을 수행하면 127.0.0.1 로 변환해서 수행
    • DNS를 조회하지 않음
  • 용도
    • 로컬 호스트 개발
    • 시스템 최적화
    • 특정 사이트 차단
    • 자체 호스트 이름 정의
    • <IP Address> 호스트 이름 [alias1, alias2, …]
  • hosts 파일을 수정 후 체크사항
    • DNS 캐시를 삭제
      # Linux
      sudo systemctl restart systemd-resolved
      
      # Windows
      # 윈도우로 서버를 만들 일이 있을까,,?
      ipconfig /flushdns
      
      # Mac OS
      sudo dscacheutil -flushcache
      sudo killall -HUP mDNSResponser
  • 운영하는 서버에선 hosts 사용을 피해야 하는 이유
    • DNS 변경이 반영되지 않을 수 있음
    • 서버마다 설정이 달라짐(일관성 붕괴)
      • 서버 A에는 hosts가 있는데 서버 B에는 hosts가 없음
    • 장애 발생 시 원인 추적이 어려워짐
      • SSH / API / DB의 간헐적 실패
      • → 로그상 네트워크 문제처럼 보임
    • 서버 교체 또는 오토스케일링과 충돌
      • 클라우드 환경
        • Auto Scaling
        • Immutable Infrastructure
        • Blue/Green 배포
    • 보안 사고 위험
      • 내부자 공격이나 침해 시 피해 증폭
    • 운영 자동화 도구와도 충돌
      • Ansible, Terraform, Kubernetes, CI/CD 파이프라인
      • 인프라 도구는 DNS 기준으로 설정함
      • hosts는 로컬 수동 설정
  • → 허용하는 경우
    • 로컬 개발 PC
    • 개인 테스트 서버
    • 단기 장애 우회

📌 IP 주소를 찾는 과정

  • URL 입력 → /etc/host.conf 조회(hosts 파일의 위치를 조회) → /etc/hosts 를 조회
    • /etc/hosts 에 있는 경우 → IP 주소 획득
    • /etc/hosts 에 없는 경우 → /etc/resolve.conf 를 조회해서 DNS Server 설정을 확인
      • DNS Server 설정이 있는 경우 → DNS Server 에게 질의를 해서 응답을 받아서 IP 주소 획득
      • DNS Server 설정이 없는 경우 → 호스트 이름 알 수 없음

host와 DNS 우선 선위

  1. hosts 파일
  2. DNS 캐시
  3. DNS 서버

네트워크 상태 확인

ping

  • 외부와 통신되는지 확인하거나 외부 서버가 동작하는지 확인할 때 사용
    ping [옵션] [목적지 주소]
    • 옵션
      • -a : 통신이 되면 소리가 남
      • -q : 테스트 결과를 지속적으로 보여주지 않고 종합 결과만 출력
      • -c 개수 : 보낼 패킷 수를 지정
    • 시스템에 따라서 보안을 강화하기 위해 ping 패킷이 왔을 때 응답하지 않도록 설정하는 경우도 있음
    • 옵션 없이 사용 → 계속해서 패킷을 보냄
    • 결과
      • icmp_seq는 응답이 보낸 ICMP 패킷의 순서
      • ttl은 Time To Live의 약자로 패킷이 목적지에 도달하기까지 거친 라우터의 수를 간접적으로 알려주는 것인데 이 값을 시작점에서 라우터를 거칠 때마다 1씩 감소
      • time은 패킷의 왕복 시간

netstat

  • 네트워크 연결 상태, 라우팅 테이블, 인터페이스 관련 통계 정보 등을 출력하며 현재 시스템에 열려 있는 포트가 무엇인지도 확인할 수 있는 명령
netstat [옵션]
  • 옵션
  • -a: 모든 소켓 정보를 출력
  • -r: 라우팅 정보를 출력
  • -n: 호스트 이름 대신 IP 주소로 출력
  • -i: 모든 네트워크 인터페이스 정보를 출력
  • -s: 프로토콜별로 네트워크 통계 정보를 출력
  • -p: 해당 소켓과 관련된 프로세스의 이름과 PID를 출력
# 열려있는 포트 확인
netstat -an | grep LISTEN

열매 있는 포트를 사용 중인 프로세스 확인

netstat -P

프로토콜 별로 사용 중인 포트 통계 정보 확인

netstat

MAC Addresse 와 IP 주소 확인

  • ARP(Address Resolution Prtotocol)
  • 동일한 네트워크에 연결된 시스템들의 MAC Address 와 IP 주소를 확인하는 명령
arp

패킷 캡쳐 명령

  • tcpdump: 네트워크 상태를 확인하기 위해 패킷을 캡쳐하여 분석할 때 사용
tcp [옵션]
  • 옵션
    • -c 패킷 수: 지정한 패킷 수만큼 덤프 받고 종료
    • -i 인터페이스명: 특정 인터페이스를 지정
    • -n: IP 주소를 호스트 이름으로 바꾸지 않음
    • -q: 정보를 간단한 형태로 출력
    • -X: 패킷의 내용을 16진수와 ASCII로 출력
    • -w 파일명: 덤프한 내용을 지정한 파일에 저장
    • -r 파일명: 덤프를 저장한 파일에서 읽어옴
    • host 호스트 이름 또는 주소: 지정한 호스트가 받거나 보낸 패킷만 덤프
    • tcp port 번호: 지정한 포트 번호 패킷만 덤프
    • ip: IP 패킷만 덤프
  • sudo tcpdump

가상머신 클러스터 구축

UTM에 3대의 가상머신을 띄워서 Master, node01, node02 만들고 연결하기

1단계: 가상머신 간의 식별자 충돌 해결

  • 가상머신을 복제(Clone)하면 식별 값까지 똑같은 가상머신이 하나 더 생기는 구조라 네트워크 충돌이 발생함.

해결

  • MAC(Media Access Control, 물리 주소) 변경
    • UTM 설정에서 각 VM의 네트워크 카드 고유 번호(MAC)을 수정
  • Machine ID 초기화
    • 리눅스 시스템 고유 ID가 같아서 발생하는 IP 중복 문제를 해결하기 위해 /etc/machine-id 를 새로 만듦
      # 기존 /etc/machine-id 삭제
      rm /etc/machine-id
      
      # 새롭게 작성
      sudo vi /etc/machine-id
  • Hostname 변경
    • 각 서버를 구분하기 위해 master, node01, node02 로 호스트 이름을 수정

2단계: DHCP와 Static IP

  • DHCP (유동 IP): 서버가 자동으로 IP를 할당하는 방식. 재부팅 혹은 임대시간 초과 시 IP가 바뀔 수 있음. → 클러스터 운영에는 불안정함
  • Static IP: Netplan 설정을 통해 직접 주소를 고정. 재부팅을 해도 주소가 변하지 않음
    network:
      version: 2
      renderer: networkd
      ethernets:
        enp0s1:
          dhcp4: no # 동적 IP 사용 X
          addresses:
            - <Static IP Address>
          routes:
            - to: default
              via: <Router 역할을 하는 노드의 IP Address>
          nameservers:
            addresses: [8.8.8.8, 8.8.4.4] # DNS 네임서버
          dhcp-identifier: mac

3단계: Netplan을 이용한 네트워크 설정

  • 각 노드에 네트워크 설정 파일(/etc/netplan/01-netcfg.yaml) 을 작성
  • 설정 파일 권한이 너무 열려 있다는 경고(warning)를 해결하기 위해 sudo chmod 600 명령어로 소유자만 읽고 쓸 수 있도록 수정

4단계: Host Mapping(Hostname 으로 소통하기)

  • 서로를 Hostname으로 알 수 있도록 작업
  • /etc/hosts 수정 : 모든 가상머신의 hosts 파일에 IP - hostname 쌍을 등록

profile
Don’t get mad at the computer.

0개의 댓글