ubuntu 16.04 - 브릿지 네트워크 구성 시 networking 서비스 restart하는 것과 재부팅의 차이
안녕하세요,
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 정보가 바뀐다고 자동으로 갱신되는 게 아니고 따로 수정을(엔트리를 추가하거나 삭제하는) 해주어야 하는 건지요?
오늘 KVM 가상 머신 가지고 (가상 머신 안에 다시
오늘 KVM 가상 머신 가지고 (가상 머신 안에 다시 가상 머신을 띄울 수는 없더라도, 네트워크 세팅에서 브릿지를 올리는 것까지는 가능할 테니) 이렇게 저렇게 해봤는데요.
1. 처음 상태
2. interfaces 파일을 브릿지 내용으로 교체한 후 /etc/init.d/networking restart 를 한 직후
콘솔 쪽에서 syslog, ip route, ip addr show 결과: (복사할 방법이 없어서 스샷으로...)
어제 적은 것처럼 IP주소가 ens3 쪽에 할당되어 있는 상태에서 br0 에도 할당되어 있고, 그렇게 충돌이 나서인지 ifup 이 실패를 했고, 라우팅 테이블에는 동일한 목적지로 ens3(기존)과 br0(추가)이 둘 다 있는 상태였네요.
이 상태에서 제가 수습한다고 ip addr del 192.168.122.210/24 dev ens3 하니까 라우팅 테이블에서 ens3을 사용하는 엔트리들이 사라지면서 이 때 디폴트 게이트웨이도 사라진 거였습니다. (어제 쓴 글에서 실제 순서가 달랐네요)
3. 해결법?
어느 게 가장 좋은 해결책인지 모르겠지만 몇 번 테스트하면서 다음과 같이 하면 제대로 네트워크 설정이 교체되는 걸 확인했습니다. 원격 연결도 끊기지 않고.
(가상 머신에서 잘 되었으니 이제 실제 서버에서도 적용을 했을 때도 잘 되길 기도할 수밖에...?)
좋은 하루 되세요!
원상복구도 원격에서 한번에 할 수 있도록 이런 저런
원상복구도 원격에서 한번에 할 수 있도록 이런 저런 시도를 해보니 다음과 같이 하면 되는 것 같습니다. 정확한 건지 확신은 이번에도 없습니다만...
좋은 하루 되세요!
아무도 관심이 없으신 것 같지만ㅎ 기록 차원에서
아무도 관심이 없으신 것 같지만ㅎ 기록 차원에서 꿋꿋이 씁니다.
이제 보니 /etc/init.d/networking 스크립트(사실 systemd를 쓰기 때문에 이 스크립트가 아니라 systemctl 쪽으로 넘어가겠지만)는 ifdown 으로 인터페이스를 내리고 다시 ifup 으로 올리는데, 인터페이스를 내릴 때도 떠 있는 걸 그냥 내릴 수 있는 게 아니라 interfaces 파일에 정확히 적혀 있는 상태여야 하는가보네요.
그래서 interfaces 파일에 기존 인터페이스와 브릿지를 다 적어주었습니다.
이렇게 작성한 후,
1. 브릿지를 구성하고 싶으면 auto br0 을, 아니면 auto ens3 쪽을 남기고 다른 쪽을 주석처리
2. /etc/init.d/networking restart
하면 원격에서 재시작해도 연결이 끊기지 않고 잘 전환되었습니다.
interfaces 파일을 고치지 않고 일시적으로만 전환하는 것도 가능했습니다.
다만 networking restart 와 직접 ifdown, ifup 하는 게 완전히 동일한지, 아니면 netwokring 스크립트에서는 뭔가 추가 작업을 더 하는지는 잘 모르겠습니다.
좋은 하루 되세요!
댓글 달기