ubuntu 16.04 - 브릿지 네트워크 구성 시 networking 서비스 restart하는 것과 재부팅의 차이

raymundo의 이미지

안녕하세요,

ubuntu 16.04 호스트에서 KVM 게스트(역시 우분투 16.04)들 여러 대를 띄우는데, 이걸 기본 설정인 NAT가 아니라 브릿지 네트워크를 써서 호스트와 동일한 망에 물리고자 합니다. (최종적으로는 여러 호스트에 게스트들을 나누어 올리고 각 게스트들간에 연결 구성)

제가 네트워크 전문가가 아니어서 이리저리 웹에서 문서를 찾아보며 적용을 하려 했는데요, 호스트 서버에서 기존에 돌고 있는 것들이 있어서 웬만하면 재부팅없이 하려고 했는데 잘 안 되어서요.

* https://wiki.libvirt.org/page/Networking
* https://help.ubuntu.com/community/KVM/Networking
* https://help.ubuntu.com/community/NetworkConnectionBridge

등을 읽어봤는데, 공통적으로 /etc/network/interfaces 파일을 고쳐서 기존 이더넷 인터페이스 대신 브릿지 인터페이스를 정의한 후 /etc/init.d/networking restart 를 하든가 재부팅을 하라고 되어 있길래 똑같이 했는데,

# 기존의 /etc/network/interfaces
auto lo
iface lo inet loopback
 
# The primary network interface
auto eno1
iface eno1 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 8.8.8.8

# 제가 고친 /etc/network/interfaces
auto lo
iface lo inet loopback
 
auto br0
iface br0 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 8.8.8.8
bridge_ports eno1
bridge_stp off
bridge_fd 0
bridge_maxwait 0

/etc/init.d/networking restart

를 하는 순간 잠시 후 해당 서버의 연결이 먹통이 되어 버렸습니다 ^_ㅠ

그런 사태를 우려해서, 5분 후에 interfaces 파일을 원상복구하고 다시 networking 서비스를 재시작하도록 crontab을 걸어놨으나 5분 후에도 여전히 먹통이어서 IDC에 가야 했고요.

가서 재부팅하기 전에 혹시 문제의 원인을 알 수 있을까 싶어 좀 살펴봤는데

일단 그 시간대의 syslog에는 다음과 같이 나와 있었고

Aug  7 09:17:15 호스트명 sh[61526]: RTNETLINK answers: File exists
Aug  7 09:17:15 호스트명 sh[61526]: Failed to bring up br0.
Aug  7 09:17:15 호스트명 systemd[1]: <a href="mailto:ifup@br0.service" rel="nofollow">ifup@br0.service</a>: Main process exited, code=exited, status=1/FAILURE
Aug  7 09:17:15 호스트명 systemd[1]: networking.service: Main process exited, code=exited, status=1/FAILURE
Aug  7 09:17:15 호스트명 systemd[1]: Failed to start Raise network interfaces.
Aug  7 09:17:15 호스트명 systemd[1]: networking.service: Unit entered failed state.
Aug  7 09:17:15 호스트명 systemd[1]: networking.service: Failed with result 'exit-code'.

다음 것들이 눈에 띄었습니다.

1) ip addr이나 ifconfig로 보면 기존 이더넷 인터페이스(eno1)와 내가 만든 브릿지(br0) 둘 다에 IP 192.168.0.100이 그대로 할당되어 있음

2) ip route로 보면 default 게이트웨이 정의가 사라져 있음

# ip route
default via 192.168.0.1 dev br0 onlink    # 이 default... 줄이 없었음. 재부팅했을 때는 나타남
169.254.0.0/16 dev br0  scope link  metric 1000
192.168.0.0/24 dev br0  proto kernel  scope link  src 192.168.0.100
192.168.0.0/24 dev eno1 proto kernel  scope link  src 192.168.0.100  # 이 eno1을 통해 나가는 라인도 여전히 남아 있었음

그래서 eno1에서 IP제거하고 라우트 테이블에 br0을 통하는 게이트웨이를 추가해주니까 그제서야 연결이 잘 되긴 했습니다만, 제대로 된 건지 확신할 수가 없어서 결국 재부팅을 하긴 했네요.

(이러고도 다른 호스트와 이 게스트 사이에 여전히 연결이 안 되어 ufw를 disable하니까 그제서야 되길래 이젠 또 ufw에서 포워딩 허용 부분을 살펴보는 중입니다만 이건 부차적인 것 같고)

networking 서비스를 restart 하면 기존 인터페이스는 일단 다 내려가고(표현이 맞는지 모르겠지만) 다시 interfaces 파일에 정의된 대로 올려줄 거라 생각했는데, 실제로는 eno1에 여전히 IP주소가 남아 있더군요. 그러면 기존에 올라가 있는 인터페이스는 놔두고 새로 띄워버리는 걸까요...? 그렇다면 이 경우 제가 기존 eno1 을 일단 내리고 브릿지를 띄우려면 어떻게 했어야 했을까요?

ip addr flush env eno1 ?
ifconfig eno1 down ?
아니면 다른 무언가?
 
그 다음 networking restart...

라우팅 테이블 정보는 interface 정보가 바뀐다고 자동으로 갱신되는 게 아니고 따로 수정을(엔트리를 추가하거나 삭제하는) 해주어야 하는 건지요?

raymundo의 이미지

오늘 KVM 가상 머신 가지고 (가상 머신 안에 다시 가상 머신을 띄울 수는 없더라도, 네트워크 세팅에서 브릿지를 올리는 것까지는 가능할 테니) 이렇게 저렇게 해봤는데요.

1. 처음 상태

root@networktest:/etc/network# ip addr show
1: lo: 생략
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
...
    inet 192.168.122.210/24 brd 192.168.122.255 scope global ens3
...
root@networktest:/etc/network# ip route
default via 192.168.122.1 dev ens3 onlink
192.168.122.0/24 dev ens3  proto kernel  scope link  src 192.168.122.210

2. interfaces 파일을 브릿지 내용으로 교체한 후 /etc/init.d/networking restart 를 한 직후

# /etc/init.d/networking restart
Restarting networking (via systemctl): networking.serviceJob for networking.service failed because the control process exited with error code. See "systemctl status networking.service" and "journalctl -xe" for details.
 failed!
(네트워크 먹통됨)

콘솔 쪽에서 syslog, ip route, ip addr show 결과: (복사할 방법이 없어서 스샷으로...)

어제 적은 것처럼 IP주소가 ens3 쪽에 할당되어 있는 상태에서 br0 에도 할당되어 있고, 그렇게 충돌이 나서인지 ifup 이 실패를 했고, 라우팅 테이블에는 동일한 목적지로 ens3(기존)과 br0(추가)이 둘 다 있는 상태였네요.

이 상태에서 제가 수습한다고 ip addr del 192.168.122.210/24 dev ens3 하니까 라우팅 테이블에서 ens3을 사용하는 엔트리들이 사라지면서 이 때 디폴트 게이트웨이도 사라진 거였습니다. (어제 쓴 글에서 실제 순서가 달랐네요)

3. 해결법?

어느 게 가장 좋은 해결책인지 모르겠지만 몇 번 테스트하면서 다음과 같이 하면 제대로 네트워크 설정이 교체되는 걸 확인했습니다. 원격 연결도 끊기지 않고.

# ip addr flush ens3 && ifup br0
또는
# ip addr flush ens3 && /etc/init.d/networking restart
 
# ip addr flush... 대신 ifconfig ens3 0.0.0.0 을 할 수도 있음

(가상 머신에서 잘 되었으니 이제 실제 서버에서도 적용을 했을 때도 잘 되길 기도할 수밖에...?)

댓글 첨부 파일: 
첨부파일 크기
Image icon screenshot1.png77.72 KB

좋은 하루 되세요!

raymundo의 이미지

원상복구도 원격에서 한번에 할 수 있도록 이런 저런 시도를 해보니 다음과 같이 하면 되는 것 같습니다. 정확한 건지 확신은 이번에도 없습니다만...

# interfaces 파일을 원래대로 복원한 후
ifconfig br0 down && brctl delbr br0 && /etc/init.d/networking restart
 
# ifconfig br0 down 대신에 ifdown br0 을 해보면 성공할 때가 있고 실패하면서 먹통이 될 때가 있는데 왜 그런지는 모르겠음

좋은 하루 되세요!

raymundo의 이미지

아무도 관심이 없으신 것 같지만ㅎ 기록 차원에서 꿋꿋이 씁니다.

이제 보니 /etc/init.d/networking 스크립트(사실 systemd를 쓰기 때문에 이 스크립트가 아니라 systemctl 쪽으로 넘어가겠지만)는 ifdown 으로 인터페이스를 내리고 다시 ifup 으로 올리는데, 인터페이스를 내릴 때도 떠 있는 걸 그냥 내릴 수 있는 게 아니라 interfaces 파일에 정확히 적혀 있는 상태여야 하는가보네요.

그래서 interfaces 파일에 기존 인터페이스와 브릿지를 다 적어주었습니다.

source /etc/network/interfaces.d/*
 
# The loopback network interface
auto lo
iface lo inet loopback
 
# 원래 구성되어 있던 이더넷 인터페이스
auto ens3
iface ens3 inet static
    address 192.168.122.210
    network 192.168.122.0
    netmask 255.255.255.0
    broadcast 192.168.122.255
    gateway 192.168.122.1
    dns-nameservers 8.8.8.8 8.8.4.4
 
 
# 새로 추가한 브릿지
 
# address, netmask 등은 위와 동일하게
# auto ens3과 auto br0 중에 하나만 코멘트로 만들고 하나는 남겨두면
# 재부팅 또는 networking restart 시에 auto 가 지정된 인터페이스가 올라옴
# (br0 이 올라올 때는 ens3 도 같이 올라와서 브릿지에 연결)
 
# 둘 다 코멘트처리 되어 있으면 인터페이스가 안 올라오니 망함
# 둘 다 지정되어 있으면 첫 글에서처럼 IP주소가 양쪽에 다 할당되고 route도 꼬이면서 연결이 먹통되어 망함
 
# auto br0
iface br0 inet static
  hwaddress ether 52:54:00:f5:a5:79
  address 192.168.122.210
  netmask 255.255.255.0
  gateway 192.168.122.1
  dns-nameservers 8.8.8.8 8.8.4.4
  bridge_ports ens3
  bridge_stp off
  bridge_fd 0
  bridge_maxwait 0

이렇게 작성한 후,

1. 브릿지를 구성하고 싶으면 auto br0 을, 아니면 auto ens3 쪽을 남기고 다른 쪽을 주석처리
2. /etc/init.d/networking restart

하면 원격에서 재시작해도 연결이 끊기지 않고 잘 전환되었습니다.

# 브릿지가 없는 상태
root@networktest:/etc/network# ip route
default via 192.168.122.1 dev ens3 onlink
192.168.122.0/24 dev ens3  proto kernel  scope link  src 192.168.122.210
 
# auto br0 쪽을 켜주고
root@networktest:/etc/network# vi interfaces
 
# 재시작
root@networktest:/etc/network# /etc/init.d/networking restart
Restarting networking (via systemctl): networking.service.
 
# 확인하면 브릿지가 생성되어 있음
root@networktest:/etc/network# ip route
default via 192.168.122.1 dev br0 onlink
192.168.122.0/24 dev br0  proto kernel  scope link  src 192.168.122.210
 
root@networktest:/etc/network# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.525400f5a579       no              ens3

interfaces 파일을 고치지 않고 일시적으로만 전환하는 것도 가능했습니다.

# 브릿지를 만들고 싶으면
ifdown ens3 && ifup br0
 
# 브릿지를 끄고 원상태로 돌리고 싶으면
ifdown br0 && ifup ens3

다만 networking restart 와 직접 ifdown, ifup 하는 게 완전히 동일한지, 아니면 netwokring 스크립트에서는 뭔가 추가 작업을 더 하는지는 잘 모르겠습니다.

좋은 하루 되세요!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.