Kubespray offline 설치 - 사전 작업

진웅·2026년 2월 14일

k8s deploy

목록 보기
17/20

폐쇄망(Air-Gap) 환경에서 kubespray 설치(offline)시 사전에 필요한 작업들을 설명

폐쇄망 환경이란?

폐쇄망(Air-Gap) 환경은 보안을 위해 외부 인터넷과 물리적으로 분리된 네트워크다.

특징

  • 내부망에서는 외부 인터넷 접속 불가
  • 필요한 파일은 방화벽 정책 승인 후 Bastion Server를 통해 다운로드
  • 모든 소프트웨어, 이미지, 패키지를 사전에 준비해야 함

왜 폐쇄망을 사용하는가?

보안 요구사항:

  • 금융권 시스템
  • 국방/군사 네트워크
  • 의료 데이터 시스템
  • 산업 제어 시스템 (ICS/SCADA)

격리 이유:

  • 외부 공격 차단
  • 데이터 유출 방지
  • 규제 준수 (ISMS, ISO 27001)

폐쇄망 네트워크 구조

3-Tier 아키텍처

각 영역의 역할

1. Internet Zone (인터넷 영역)

구성 요소:

  • Public Repository
    • GitHub
    • Docker Hub
    • PyPI (Python Package Index)
    • Maven Central
    • npm Registry

역할:

  • 공개 소프트웨어 저장소
  • 패키지 배포처
  • 컨테이너 이미지 저장소

2. 외부 방화벽

역할:

  • 인터넷 ↔ DMZ 간 트래픽 제어
  • 허용된 다운로드만 통과
  • 정책 기반 접근 제어

통제 항목:

  • 소스 IP 화이트리스트
  • 목적지 도메인 제한
  • 프로토콜 제한 (HTTP/HTTPS만)
  • 다운로드 파일 검증

3. DMZ (Demilitarized Zone)

구성 요소:

  • Bastion Server (Jump Host)

역할:

  • 파일 임시 저장소
  • 승인된 파일만 내부망으로 전달
  • 보안 검사 수행
  • 접근 로그 기록

동작 흐름:
1. 외부에서 파일 다운로드
2. 바이러스/악성코드 스캔
3. 승인 대기
4. 내부 방화벽 정책 추가
5. 내부망으로 전달

4. 내부 방화벽

역할:

  • DMZ ↔ 내부망 간 트래픽 제어
  • 승인된 파일 전송만 허용
  • 내부망 보호

5. 내부망 (Internal Network)

구성 요소:

  • Admin Server: Ansible/Kubespray 실행
  • Kubernetes Cluster
  • 내부 서비스 (NTP, DNS, Registry 등)

특징:

  • 인터넷 접속 완전 불가
  • 모든 리소스를 내부에서 제공
  • 자체 DNS, NTP, Repository 운영

폐쇄망 실습 환경 구성

실습은 VirtualBox와 Vagrant를 이용해 로컬 환경에서 폐쇄망을 시뮬레이션한다. 일반적으로는 Bastion → Admin → K8s Node 순서로 구성하지만, PC 리소스와 시간을 고려해 Admin 서버가 외부 통신도 가능하도록 단순화했다.

실습 환경 구성

  • Admin 서버 1대: 외부 인터넷 접속 가능, NAT Gateway 역할
  • K8s Node 2대: k8s-node1(Control Plane), k8s-node2(Worker Node)
  • 네트워크: 192.168.10.0/24 (내부망)

Admin 서버 스펙

  • CPU: 4 Core
  • Memory: 2GB
  • Disk: 120GB (증설)
  • IP: 192.168.10.10

K8s Node 서버 스펙

  • CPU: 4 Core
  • Memory: 2GB
  • IP: 192.168.10.11 (node1), 192.168.10.12 (node2)

실습 환경 배포 설명

Vagrant 기반 Kubespray Offline Lab 구성 (Rocky Linux 10)

구성 개요

  • Base Box: bento/rockylinux-10.0

  • VM 구성

    • admin 서버 (디스크 120GB 증설)
    • k8s-node1 (Control Plane)
    • k8s-node2 (Worker)
  • Private Network: 192.168.10.0/24

  • SSH root 비밀번호: qwe123


구성

NodeIP역할CPUMemoryDisk
admin192.168.10.10Kubespray 실행 / 관리42GB120GB
k8s-node1192.168.10.11Control Plane42GB기본
k8s-node2192.168.10.12Worker42GB기본

Vagrantfile

Vagrantfile 구성

Vagrantfile은 3대의 VM을 생성한다. Rocky Linux 10.0 기반으로 K8s Node 2대와 Admin 서버 1대를 구성한다.

BOX_IMAGE = "bento/rockylinux-10.0"
BOX_VERSION = "202510.26.0"
N = 2  # k8s-node 개수

Vagrant.configure("2") do |config|
  # k8s-node1, k8s-node2
  (1..N).each do |i|
    config.vm.define "k8s-node#{i}" do |subconfig|
      subconfig.vm.box = BOX_IMAGE
      subconfig.vm.box_version = BOX_VERSION
      subconfig.vm.provider "virtualbox" do |vb|
        vb.name = "k8s-node#{i}"
        vb.cpus = 4
        vb.memory = 2048
      end
      subconfig.vm.hostname = "k8s-node#{i}"
      subconfig.vm.network "private_network", ip: "192.168.10.1#{i}"
      subconfig.vm.provision "shell", path: "init_cfg.sh", args: [N]
    end
  end

  # Admin Server
  config.vm.define "admin" do |subconfig|
    subconfig.vm.box = BOX_IMAGE
    subconfig.vm.box_version = BOX_VERSION
    subconfig.vm.provider "virtualbox" do |vb|
      vb.name = "admin"
      vb.cpus = 4
      vb.memory = 2048
    end
    subconfig.vm.hostname = "admin"
    subconfig.vm.network "private_network", ip: "192.168.10.10"
    subconfig.vm.disk :disk, size: "120GB", primary: true  # 디스크 증설
    subconfig.vm.provision "shell", path: "admin.sh", args: [N]
  end
end

주요 설정

항목AdminK8s Node1K8s Node2
Hostnameadmink8s-node1k8s-node2
CPU4 Core4 Core4 Core
Memory2GB2GB2GB
Disk120GB기본기본
IP (enp0s9)192.168.10.10192.168.10.11192.168.10.12
IP (enp0s8)DHCPDHCPDHCP
Provisioningadmin.shinit_cfg.shinit_cfg.sh

네트워크 구성

  • enp0s8: NAT 네트워크 (외부 인터넷 접속용, DHCP)
  • enp0s9: Host-Only 네트워크 (내부망 192.168.10.0/24)

admin.sh (프로비저닝 스크립트)

#!/usr/bin/env bash

echo ">>>> Initial Config Start <<<<"

# 1. Timezone 및 NTP 설정
timedatectl set-timezone Asia/Seoul

# 2. 방화벽 및 SELinux 비활성화
systemctl disable --now firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

# 3. Hosts 파일 설정
echo "192.168.10.10 admin" >> /etc/hosts
for (( i=1; i<=$1; i++ )); do 
  echo "192.168.10.1$i k8s-node$i" >> /etc/hosts
done

# 4. enp0s9 기본 라우트 삭제
nmcli connection modify enp0s9 ipv4.never-default yes
nmcli connection up enp0s9

# 5. IP forwarding 활성화
cat << EOF > /etc/sysctl.d/99-ipforward.conf
net.ipv4.ip_forward = 1
EOF
sysctl --system

# 6. 패키지 설치
dnf install -y python3-pip git sshpass cloud-utils-growpart

# 7. Helm 설치
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | \
  DESIRED_VERSION=v3.20.0 bash

# 8. 디스크 증설
growpart /dev/sda 3
xfs_growfs /dev/sda3

# 9. SSH 설정
echo "root:qwe123" | chpasswd
cat << EOF >> /etc/ssh/sshd_config
PermitRootLogin yes
PasswordAuthentication yes
EOF
systemctl restart sshd

# 10. SSH Key 생성 및 배포
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa
sshpass -p 'qwe123' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.10.10
for (( i=1; i<=$1; i++ )); do 
  sshpass -p 'qwe123' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.10.1$i
done

# 11. K9s 설치
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
wget -P /tmp https://github.com/derailed/k9s/releases/latest/download/k9s_linux_${CLI_ARCH}.tar.gz
tar -xzf /tmp/k9s_linux_${CLI_ARCH}.tar.gz -C /tmp
mv /tmp/k9s /usr/local/bin/
chmod +x /usr/local/bin/k9s

echo ">>>> Initial Config End <<<<"

Admin 서버 초기화 스크립트다. NAT Gateway 역할을 수행하고 Kubespray 실행을 위한 환경을 구성한다.

TASK설명주요 명령
1. Timezone & NTP시간대를 Asia/Seoul로 설정timedatectl set-timezone Asia/Seoul
2. 방화벽/SELinux방화벽 비활성화, SELinux Permissive 모드systemctl disable firewalld
setenforce 0
3. Local DNS/etc/hosts에 admin과 k8s-node 정보 추가echo "192.168.10.10 admin" >> /etc/hosts
4. 라우팅 설정enp0s9는 디폴트 라우트 생성 안함nmcli connection modify enp0s9 ipv4.never-default yes
5. IP Forward커널 파라미터로 IP 포워딩 활성화net.ipv4.ip_forward = 1
6. 패키지 설치Python, Git, sshpass 설치dnf install -y python3-pip git sshpass
7. Helm 설치Helm v3.20.0 설치curl -fsSL ... \| bash
8. 디스크 확장Admin 서버 디스크를 120GB로 확장growpart /dev/sda 3
xfs_growfs /dev/sda3
9. SSHD 설정Root 로그인 허용, 비밀번호 인증 활성화PermitRootLogin yes
PasswordAuthentication yes
10. SSH KeySSH Key 생성 및 배포ssh-keygen -t rsa
ssh-copy-id
11. K9s 설치Kubernetes CLI 도구 K9s 설치아키텍처 자동 감지 후 설치

주요 포인트

  • Admin 서버는 외부 인터넷과 내부망을 연결하는 Gateway 역할을 한다.
  • IP Forwarding 설정으로 패킷 포워딩이 가능하지만, NAT 설정은 별도로 해야 한다.
  • SSH Key 기반 인증으로 K8s Node들에 비밀번호 없이 접속할 수 있다.

init_cfg.sh (k8s-node 프로비저닝)

#!/usr/bin/env bash

echo ">>>> Initial Config Start <<<<"

# 1. Timezone 설정
timedatectl set-timezone Asia/Seoul

# 2. 방화벽 및 SELinux 비활성화
systemctl disable --now firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

# 3. SWAP 비활성화
swapoff -a
sed -i '/swap/d' /etc/fstab
sfdisk --delete /dev/sda 2
partprobe /dev/sda

# 4. 커널 모듈 로드
cat << EOF > /etc/modules-load.d/k8s.conf
overlay
br_netfilter
vxlan
EOF
modprobe overlay
modprobe br_netfilter

# 5. sysctl 설정
cat << EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
sysctl --system

# 6. Hosts 파일 설정
echo "192.168.10.10 admin" >> /etc/hosts
for (( i=1; i<=$1; i++ )); do 
  echo "192.168.10.1$i k8s-node$i" >> /etc/hosts
done

# 7. enp0s9 기본 라우트 삭제
nmcli connection modify enp0s9 ipv4.never-default yes
nmcli connection up enp0s9

# 8. SSH 설정
echo "root:qwe123" | chpasswd
cat << EOF >> /etc/ssh/sshd_config
PermitRootLogin yes
PasswordAuthentication yes
EOF
systemctl restart sshd

# 9. 패키지 설치
dnf install -y python3-pip git

echo ">>>> Initial Config End <<<<"

K8s Node 초기화 스크립트다. Kubernetes 운영을 위한 기본 환경을 설정한다.

TASK설명주요 명령
1. Timezone & NTP시간대를 Asia/Seoul로 설정timedatectl set-timezone Asia/Seoul
2. 방화벽/SELinux방화벽 비활성화, SELinux Permissive 모드systemctl disable firewalld
setenforce 0
3. SWAP 비활성화Kubernetes 요구사항에 따라 SWAP 완전 제거swapoff -a
sed -i '/swap/d' /etc/fstab
sfdisk --delete /dev/sda 2
4. 커널 모듈컨테이너 네트워킹에 필요한 모듈 로드overlay
br_netfilter
vxlan
5. 커널 파라미터브리지 트래픽과 IP 포워딩 설정net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
6. Local DNS/etc/hosts에 admin과 k8s-node 정보 추가echo "192.168.10.10 admin" >> /etc/hosts
7. 라우팅 설정enp0s9는 디폴트 라우트 생성 안함nmcli connection modify enp0s9 ipv4.never-default yes
8. SSHD 설정Root 로그인 허용, 비밀번호 인증 활성화PermitRootLogin yes
PasswordAuthentication yes
9. 패키지 설치Python, Git 설치dnf install -y python3-pip git

주요 포인트

  • SWAP 완전 제거: Kubernetes는 SWAP이 활성화되면 kubelet이 정상 동작하지 않는다.
  • 커널 모듈 로드: overlay(컨테이너 파일시스템), br_netfilter(브리지 네트워크 필터링), vxlan(오버레이 네트워크)
  • bridge-nf-call-iptables: 브리지 트래픽이 iptables 규칙을 거치도록 설정한다.

주요 설정 포인트

1️⃣ Base Box 설정

BOX_IMAGE = "bento/rockylinux-10.0"
BOX_VERSION = "202510.26.0"
N = 2

2️⃣ k8s Node 생성 루프

(1..N).each do |i|
  • k8s-node1, k8s-node2 자동 생성
  • Private IP 자동 할당
  • SSH 포트 포워딩 자동 설정

3️⃣ admin 서버 디스크 120GB 증설

subconfig.vm.disk :disk, size: "120GB", primary: true

👉 Vagrant Disk 기능 사용
👉 루트 파티션은 admin.sh에서 growpart + xfs_growfs로 확장


배포 실행

# 작업 디렉터리 생성 및 이동
mkdir k8s-offline
cd k8s-offline

# 설정 파일 다운로드
curl -O https://raw.githubusercontent.com/gasida/vagrant-lab/refs/heads/main/k8s-kubespary-offline/Vagrantfile
curl -O https://raw.githubusercontent.com/gasida/vagrant-lab/refs/heads/main/k8s-kubespary-offline/admin.sh
curl -O https://raw.githubusercontent.com/gasida/vagrant-lab/refs/heads/main/k8s-kubespary-offline/init_cfg.sh

# VM 생성
vagrant up

# 상태 확인
vagrant status

# 서버 접속
sshpass -p 'qwe123' ssh root@192.168.10.10  # admin
sshpass -p 'qwe123' ssh root@192.168.10.11  # k8s-node1
sshpass -p 'qwe123' ssh root@192.168.10.12  # k8s-node2

내부망에 필요한 서비스

폐쇄망에서 Kubernetes를 운영하려면 외부 의존성을 모두 내부화해야 한다.

1. ⏱️ NTP Server (시간 동기화)

필요성:

  • 인증서 유효성 검증
  • 로그 타임스탬프 정확성
  • 분산 시스템 동기화

구축 방법:

# Chrony 설치
dnf install -y chrony

# 설정 파일 편집
cat << EOF > /etc/chrony.conf
server time.google.com iburst
allow 192.168.0.0/16
EOF

# 서비스 시작
systemctl enable --now chronyd

클라이언트 설정:

# /etc/chrony.conf
server 192.168.10.10 iburst

2. 🌐 DNS Server (도메인 해석)

필요성:

  • 서비스 디스커버리
  • CoreDNS 동작
  • 내부 도메인 관리

구축 방법 (bind9):

# BIND 설치
dnf install -y bind bind-utils

# 설정
cat << EOF > /etc/named.conf
options {
    listen-on port 53 { any; };
    allow-query { any; };
    recursion yes;
};

zone "cluster.local" IN {
    type master;
    file "/var/named/cluster.local.zone";
};
EOF

# 재시작
systemctl enable --now named

대안: CoreDNS를 내부 DNS로 사용

3. 📦 YUM/DNF Repository (Linux 패키지)

필요성:

  • OS 패키지 설치
  • 보안 패치 적용
  • 시스템 유틸리티

구축 방법:

Step 1: 인터넷 연결된 서버에서 동기화

# reposync 설치
dnf install -y dnf-plugins-core createrepo

# Rocky Linux 10 패키지 동기화
reposync --repo baseos --download-metadata --repoid=baseos -p /srv/repos
reposync --repo appstream --download-metadata --repoid=appstream -p /srv/repos
reposync --repo extras --download-metadata --repoid=extras -p /srv/repos

Step 2: Repository 메타데이터 생성

createrepo /srv/repos/baseos
createrepo /srv/repos/appstream
createrepo /srv/repos/extras

Step 3: HTTP 서버로 제공

# nginx 설치
dnf install -y nginx

# 설정
cat << EOF > /etc/nginx/conf.d/repos.conf
server {
    listen 80;
    server_name repos.internal;
    root /srv/repos;
    autoindex on;
}
EOF

systemctl enable --now nginx

Step 4: 클라이언트 설정

cat << EOF > /etc/yum.repos.d/local.repo
[local-baseos]
name=Local Rocky Linux BaseOS
baseurl=http://192.168.10.10/baseos
enabled=1
gpgcheck=0

[local-appstream]
name=Local Rocky Linux AppStream
baseurl=http://192.168.10.10/appstream
enabled=1
gpgcheck=0
EOF

# 캐시 정리 및 확인
dnf clean all
dnf repolist

4. 🐳 Private Container Registry

필요성:

  • Docker/containerd 이미지 저장
  • Kubernetes 시스템 이미지
  • 애플리케이션 이미지

옵션:

A. Docker Registry (간단)

# Registry 실행
docker run -d -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /mnt/registry:/var/lib/registry \
  registry:2

# 이미지 푸시
docker tag myapp:latest 192.168.10.10:5000/myapp:latest
docker push 192.168.10.10:5000/myapp:latest

클라이언트 설정 (insecure registry):

# /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.10.10:5000"]
    endpoint = ["http://192.168.10.10:5000"]

B. Harbor (고급 - 웹 UI, RBAC, 취약점 스캔)

주의: Harbor는 현재 arm64 지원이 제한적이다 (GitHub Issue).

# docker-compose로 설치
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
tar xzvf harbor-offline-installer-v2.10.0.tgz
cd harbor

# 설정
cp harbor.yml.tmpl harbor.yml
vim harbor.yml  # hostname, harbor_admin_password 수정

# 설치
./install.sh

# 접속
open http://192.168.10.10
# admin / Harbor12345

5. 🧭 Helm Repository

필요성:

  • Helm Chart 저장
  • 버전 관리
  • 배포 자동화

옵션:

A. ChartMuseum

# ChartMuseum 설치
docker run -d -p 8080:8080 \
  --restart=always \
  --name chartmuseum \
  -v /mnt/charts:/charts \
  -e STORAGE=local \
  -e STORAGE_LOCAL_ROOTDIR=/charts \
  chartmuseum/chartmuseum:latest

# Chart 업로드
curl --data-binary "@mychart-0.1.0.tgz" http://192.168.10.10:8080/api/charts

# Helm 클라이언트 설정
helm repo add internal http://192.168.10.10:8080
helm repo update

B. OCI Registry (최신 - 컨테이너 레지스트리와 통합)

# Helm Chart를 OCI 형식으로 푸시
helm package mychart
helm push mychart-0.1.0.tgz oci://192.168.10.10:5000/charts

# 설치
helm install myrelease oci://192.168.10.10:5000/charts/mychart --version 0.1.0

장점:

  • 컨테이너 레지스트리와 통합
  • 별도 서버 불필요
  • 표준 OCI 스펙

C. zot (OCI Artifact Registry)

경량 OCI 레지스트리로 컨테이너 이미지와 Helm Chart를 모두 저장할 수 있다.

# zot 설치
wget https://github.com/project-zot/zot/releases/download/v2.0.0/zot-linux-amd64
chmod +x zot-linux-amd64
mv zot-linux-amd64 /usr/local/bin/zot

# 설정
cat << EOF > zot-config.json
{
  "storage": {
    "rootDirectory": "/var/lib/zot"
  },
  "http": {
    "address": "0.0.0.0",
    "port": "5000"
  }
}
EOF

# 실행
zot serve zot-config.json

6. 🐍 Private PyPI Mirror

필요성:

  • Python 패키지 설치
  • Ansible 의존성
  • 애플리케이션 라이브러리

구축 방법 (Devpi):

# Devpi 설치
pip install devpi-server devpi-web

# 초기화
devpi-init

# 서버 시작
devpi-server --host 0.0.0.0 --port 3141

# 클라이언트 설정
pip config set global.index-url http://192.168.10.10:3141/root/pypi/+simple/

미러링:

# PyPI 패키지 미러링
devpi use http://192.168.10.10:3141
devpi login root --password ''
devpi index -c mirror bases=root/pypi
devpi use mirror
devpi upload *.whl

7. 🛜 Network Gateway

필요성:

  • 내부망 간 라우팅
  • 필요 시 DMZ 통신
  • NAT 게이트웨이

구축 방법:

# IP forwarding 활성화
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-ipforward.conf
sysctl -p /etc/sysctl.d/99-ipforward.conf

# iptables NAT 설정
iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADE
iptables -A FORWARD -i enp0s9 -o enp0s8 -j ACCEPT
iptables -A FORWARD -i enp0s8 -o enp0s9 -m state --state RELATED,ESTABLISHED -j ACCEPT

# 영구 저장
iptables-save > /etc/sysconfig/iptables

배포

# 디렉터리 생성
mkdir k8s-offline
cd k8s-offline

# 파일 다운로드
curl -O https://raw.githubusercontent.com/gasida/vagrant-lab/refs/heads/main/k8s-kubespary-offline/Vagrantfile
curl -O https://raw.githubusercontent.com/gasida/vagrant-lab/refs/heads/main/k8s-kubespary-offline/admin.sh
curl -O https://raw.githubusercontent.com/gasida/vagrant-lab/refs/heads/main/k8s-kubespary-offline/init_cfg.sh

# VM 생성
vagrant up

# 상태 확인
vagrant status

출력:

Current machine states:

k8s-node1                 running (virtualbox)
k8s-node2                 running (virtualbox)
admin                     running (virtualbox)

접속

# admin 서버
sshpass -p 'qwe123' ssh root@192.168.10.10

# k8s-node1
sshpass -p 'qwe123' ssh root@192.168.10.11

# k8s-node2
sshpass -p 'qwe123' ssh root@192.168.10.12

NetworkManager 이해하기

Rocky Linux 10은 NetworkManager를 사용하여 네트워크를 관리한다.

기본 구조

NetworkManager (systemd)
   ↓
Connection Profiles (/etc/NetworkManager/system-connections/)
   ↓
Network Interfaces (enp0s8, enp0s9)

Connection Profile 예시

enp0s8 (NAT - DHCP)

cat /etc/NetworkManager/system-connections/enp0s8.nmconnection

내용:

[connection]
id=enp0s8
type=ethernet
interface-name=enp0s8

[ipv4]
method=auto  # DHCP로 IP 자동 할당

[ipv6]
method=auto

역할:

  • VirtualBox NAT 네트워크
  • 외부 인터넷 접속 (10.0.2.x/24)
  • 기본 게이트웨이

enp0s9 (Host-Only - Static)

cat /etc/NetworkManager/system-connections/enp0s9.nmconnection

내용:

[connection]
id=enp0s9
type=ethernet
interface-name=enp0s9
autoconnect-priority=-100
autoconnect-retries=1

[ipv4]
address1=192.168.10.10/24
method=manual
never-default=true  # 절대 기본 라우트 생성 안 함

[ethernet]
mac-address=08:00:27:86:00:C2

역할:

  • Host-Only 네트워크
  • 내부망 통신 (192.168.10.x/24)
  • 기본 라우트 생성 안 함 (never-default=true)

nmcli 명령어

# Connection 목록
nmcli connection show

# IP 주소 확인
ip addr show

# 라우팅 테이블
ip route

출력:

default via 10.0.2.2 dev enp0s8 proto dhcp metric 100
10.0.2.0/24 dev enp0s8 proto kernel scope link src 10.0.2.15 metric 100
192.168.10.0/24 dev enp0s9 proto kernel scope link src 192.168.10.10 metric 101

의미:

  • 기본 라우트: enp0s8 (외부 인터넷)
  • 192.168.10.0/24: enp0s9 (내부망)

NetworkManager 서비스 구조

1. NetworkManager.service

핵심 데몬이다.

systemctl status NetworkManager.service

역할:

  • 네트워크 장치 관리
  • IP 할당
  • D-Bus 통신

2. NetworkManager-wait-online.service

부팅 시 네트워크 연결을 기다린다.

systemctl status NetworkManager-wait-online.service

역할:

  • 부팅 시 네트워크 완전 연결 대기
  • 다른 서비스 시작 전 네트워크 준비

3. NetworkManager-dispatcher.service

인터페이스 이벤트 시 스크립트를 실행한다.

systemctl status NetworkManager-dispatcher.service

역할:

  • 인터페이스 UP/DOWN 이벤트 감지
  • /etc/NetworkManager/dispatcher.d/ 스크립트 실행

사용 예시:

# VPN 연결 시 DNS 변경
cat << 'EOF' > /etc/NetworkManager/dispatcher.d/10-vpn-dns
#!/bin/bash
if [ "$2" = "vpn-up" ]; then
  echo "nameserver 10.0.0.1" > /etc/resolv.conf
fi
EOF
chmod +x /etc/NetworkManager/dispatcher.d/10-vpn-dns

profile
bytebliss

0개의 댓글