---
title: "OpenStack 수동 설치 6 — Neutron 네트워크 서비스 설치"
description: "이 문서는 OpenStack 환경에서 Provider 네트워크 방식을 사용해 Neutron을 설치·구성하고, 에이전트 상태 확인 및 첫 인스턴스 부팅까지 검증하는 절차를 상세히 안내한다."
date: "2026-08-06"
last_modified: "2026-08-08T12:07:00.000Z"
type: "Post"
tags:
  - "openstack"
  - "install"
  - "ubuntu"
  - "network"
categories:
  - "📗 Docs"
series:
  - "오픈스택 설치"
canonical_url: "https://blog.pieroot.xyz/openstack-neutron"
markdown_url: "https://blog.pieroot.xyz/openstack-neutron.md"
---

# OpenStack 수동 설치 6 — Neutron 네트워크 서비스 설치

이 문서는 OpenStack 환경에서 Provider 네트워크 방식을 사용해 Neutron을 설치·구성하고, 에이전트 상태 확인 및 첫 인스턴스 부팅까지 검증하는 절차를 상세히 안내한다.

Nova까지 설치했다면 인스턴스에 네트워크와 IP를 제공하는 Neutron을 구성한다. 이번 글은 실습 커리큘럼에 맞춰 **Provider 네트워크 방식(Option 1)** 을 기준으로 한다. 먼저 controller와 compute1의 OVS Agent·DHCP·Metadata Agent를 정상 상태로 만든 뒤, CirrOS 인스턴스를 Provider 네트워크에 직접 연결해 첫 부팅까지 검증한다.

### 이 글에서 다루는 내용

- Neutron Server, Open vSwitch Agent, DHCP Agent, Metadata Agent의 역할

- Neutron DB, 서비스 사용자, 네트워크 엔드포인트

- flat Provider 네트워크와 `br-provider` 구성

- Nova와 Neutron 연동

- controller·compute1 에이전트 검증과 첫 인스턴스 부팅

> **전제 환경**
> 
> - OpenStack 2026.1 (Gazpacho)
> 
> - Keystone, Glance, Placement, Nova 설치 완료
> 
> - controller `192.168.56.101`, compute1 `192.168.56.111`
> 
> - 각 노드에 IP를 할당하지 않은 Provider NIC 준비
> 
> - `NEUTRON_DBPASS`, `NEUTRON_PASS`, `NOVA_PASS`, `RABBIT_PASS`, `METADATA_SECRET`은 실제 값으로 교체

### Provider 네트워크를 선택한 이유

Provider 네트워크는 인스턴스가 물리 네트워크에 직접 연결되는 최소 구성이다. VXLAN 터널과 L3 Agent를 생략할 수 있어 서비스 간 연결과 OVS 브리지 동작을 먼저 이해하기에 적합하다. 테넌트 격리·가상 라우터가 필요한 환경은 이후 Self-service 네트워크나 DVR/L3 HA 단계에서 확장한다.

```mermaid
flowchart LR
    NS["neutron-server\ncontroller :9696"] --> DB[("MariaDB: neutron")]
    NS <-->|"RabbitMQ :5672"| OVS1["OVS Agent\ncontroller"]
    NS <-->|"RabbitMQ :5672"| OVS2["OVS Agent\ncompute1"]
    NS <-->|"RabbitMQ :5672"| DHCP["DHCP Agent\ncontroller"]
    NS <-->|"RabbitMQ :5672"| META["Metadata Agent\ncontroller"]
    OVS1 --> BR1["br-provider"]
    OVS2 --> BR2["br-provider"]
    BR1 --- PHY["Provider NIC / 물리 네트워크"]
    BR2 --- PHY
```

### 1. 데이터베이스 생성

```bash
sudo mysql
```

```sql
CREATE DATABASE neutron;
CREATE USER 'neutron'@'localhost' IDENTIFIED BY 'NEUTRON_DBPASS';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost';
CREATE USER 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%';
FLUSH PRIVILEGES;
EXIT;
```

### 2. 서비스 사용자와 엔드포인트

```bash
source ~/admin-openrc
openstack user create --domain default --password-prompt neutron
openstack role add --project service --user neutron admin
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=2884cd67-a9bc-4d0e-b29e-0f06b9b22815&kind=s3&pageId=a127e26d-da13-4396-ad54-de9983e479a1&source=block&blockId=410f9aff-328b-4295-9a40-eabe59a20e71)

```bash
openstack service create --name neutron --description "OpenStack Networking" network

openstack endpoint create --region RegionOne network public http://192.168.56.101:9696
openstack endpoint create --region RegionOne network internal http://controller:9696
openstack endpoint create --region RegionOne network admin http://controller:9696
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=3e520675-b6e1-4eee-b052-391ab448800e&kind=s3&pageId=a127e26d-da13-4396-ad54-de9983e479a1&source=block&blockId=cc677bbc-847a-4b90-99e7-0272c59e5497)

![image](https://blog.pieroot.xyz/api/image-proxy?id=cd4588b5-a0fa-4911-ae01-d4e41aafc4d0&kind=s3&pageId=a127e26d-da13-4396-ad54-de9983e479a1&source=block&blockId=9a15ed0b-4627-44de-800b-613a2f968cd8)

```bash
openstack endpoint list --service neutron
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=27cd675a-5c4e-4286-aa29-c4ddf79be510&kind=s3&pageId=a127e26d-da13-4396-ad54-de9983e479a1&source=block&blockId=c23b697a-a22c-457d-8f43-103195dc955a)

### 3. controller 패키지 설치

```bash
sudo apt install -y neutron-server neutron-plugin-ml2 \
  neutron-openvswitch-agent neutron-dhcp-agent neutron-metadata-agent
```

### 4. `neutron.conf`

```
[DEFAULT]
core_plugin = ml2
service_plugins =
transport_url = rabbit://openstack:RABBIT_PASS@controller
auth_strategy = keystone
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true

[database]
connection = mysql+pymysql://neutron:NEUTRON_DBPASS@controller/neutron

[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = neutron
password = NEUTRON_PASS

[nova]
auth_url = http://controller:5000
auth_type = password
project_domain_name = Default
user_domain_name = Default
region_name = RegionOne
project_name = service
username = nova
password = NOVA_PASS

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
```

### 5. ML2와 OVS Provider 브리지 구성

`/etc/neutron/plugins/ml2/ml2_conf.ini`를 Provider 전용으로 설정한다.

```
[ml2]
type_drivers = flat,vlan
tenant_network_types =
mechanism_drivers = openvswitch
extension_drivers = port_security

[ml2_type_flat]
flat_networks = provider
```

controller와 compute1의 `/etc/neutron/plugins/ml2/openvswitch_agent.ini`에는 동일한 물리 네트워크 매핑을 둔다.

```
[ovs]
bridge_mappings = provider:br-provider

[securitygroup]
enable_security_group = true
firewall_driver = openvswitch
```

각 노드에서 실제 Provider NIC을 OVS 브리지에 연결한다.

```bash
sudo ovs-vsctl add-br br-provider
sudo ovs-vsctl add-port br-provider PROVIDER_INTERFACE
sudo ovs-vsctl show
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=381b325e-75e8-4d60-934b-23ee558c023b&kind=s3&pageId=a127e26d-da13-4396-ad54-de9983e479a1&source=block&blockId=15b5727a-d121-462c-bbca-b1dff47fda3e)

> `PROVIDER_INTERFACE`는 실제 NIC 이름으로 교체한다. 이 NIC에는 호스트 IP, DHCP, 게이트웨이를 설정하지 않는다. OVS에 포트를 추가하기 전에 `ip -br addr`와 `ip route`로 Management NIC의 default route가 유지되는지 확인한다.

### 6. DHCP·Metadata와 Nova 연동

`/etc/neutron/dhcp_agent.ini`

```
[DEFAULT]
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true
```

`/etc/neutron/metadata_agent.ini`

```
[DEFAULT]
nova_metadata_host = controller
metadata_proxy_shared_secret = METADATA_SECRET
```

controller와 compute1의 `/etc/nova/nova.conf`에 다음을 추가한다.

```
[neutron]
auth_url = http://controller:5000
auth_type = password
project_domain_name = Default
user_domain_name = Default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS
service_metadata_proxy = true
metadata_proxy_shared_secret = METADATA_SECRET
```

### 7. DB 동기화와 서비스 시작

controller에서 실행한다.

```bash
sudo su -s /bin/sh -c "neutron-db-manage \
  --config-file /etc/neutron/neutron.conf \
  --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron

sudo systemctl restart nova-api
sudo systemctl restart neutron-server neutron-openvswitch-agent \
  neutron-dhcp-agent neutron-metadata-agent
```

compute1에서는 OVS Agent와 Nova Compute를 재시작한다.

```bash
sudo systemctl restart nova-compute neutron-openvswitch-agent
```

### 8. 에이전트와 첫 인스턴스 검증

controller에서 에이전트 상태를 먼저 확인한다.

```bash
source ~/admin-openrc
openstack network agent list
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=74d64ab7-f8e6-4fbd-83fd-2281c5ebe705&kind=s3&pageId=a127e26d-da13-4396-ad54-de9983e479a1&source=block&blockId=264f65c6-0fac-4b4f-a48e-e60112f467af)

controller·compute1의 OVS Agent와 controller의 DHCP·Metadata Agent, 총 4개가 `UP` 및 alive 상태여야 한다.

Provider 네트워크와 서브넷을 생성한다. 아래 CIDR·게이트웨이·allocation pool은 **실제 Provider 네트워크 값으로 교체**한다.

```bash
openstack network create --share --external \
  --provider-network-type flat \
  --provider-physical-network provider provider-net

openstack subnet create --network provider-net \
  --subnet-range PROVIDER_CIDR \
  --gateway PROVIDER_GATEWAY \
  --allocation-pool start=POOL_START,end=POOL_END \
  --dns-nameserver DNS_SERVER provider-subnet
```

보안 그룹에 ICMP와 SSH를 허용한 뒤, 앞에서 등록한 CirrOS 이미지로 인스턴스를 부팅한다.

```bash
openstack security group rule create --proto icmp default
openstack security group rule create --proto tcp --dst-port 22 default
openstack server create --flavor m1.tiny --image cirros \
  --network provider-net instance-1
openstack server list
```

`ACTIVE` 상태와 Provider 네트워크 IP가 확인되면 Keystone → Glance → Nova → Neutron 흐름이 연결된 것이다.

### 오류 확인 순서

```bash
journalctl -u neutron-server -n 100 --no-pager
journalctl -u neutron-openvswitch-agent -n 100 --no-pager
sudo ovs-vsctl show
```

### 핵심 정리

1. Provider 네트워크는 물리 네트워크와 OVS 브리지를 직접 연결하는 최소 구성이다.

1. `bridge_mappings`의 물리 네트워크 이름과 `--provider-physical-network` 값은 반드시 같아야 한다.

1. 완료 기준은 에이전트 4개가 `UP`인 것뿐 아니라, 인스턴스가 실제로 `ACTIVE` 상태로 부팅되는 것이다.

### 재발 방지 체크리스트

- [ ] Provider NIC에는 IP와 default route가 없다.

- [ ] 양쪽 노드에 `br-provider`와 동일한 `bridge_mappings`가 있다.

- [ ] OVS, DHCP, Metadata Agent가 모두 `UP`이다.

- [ ] Provider 네트워크의 CIDR·게이트웨이·allocation pool이 실제 환경과 일치한다.

- [ ] CirrOS 인스턴스가 `ACTIVE` 상태로 Provider IP를 받는다.

### 다음 단계

다음 글에서는 인스턴스에 영구 블록 스토리지를 제공하는 **Cinder LVM + iSCSI 백엔드**를 구성하고, 볼륨을 생성·attach·마운트까지 검증한다.

### 참고 자료

- [Neutron Installation Guide](https://docs.openstack.org/neutron/2026.1/install/install-ubuntu.html)

- [Neutron Provider Networks](https://docs.openstack.org/neutron/2026.1/install/controller-install-option1-ubuntu.html)

- [OpenStack 2026.1 Installation Guide](https://docs.openstack.org/install-guide/)
