반응형

Host OS: Ubuntu 16.04 LTS (amd64)


Linux Container를 이용해서 ns-3에서 네트워크 시뮬레이션을 할 필요가 생겼다. 일단 ns-3 공식 사이트에 나와 있는 튜토리얼을 따라해 보니 Linux Container 생성은 되는데, 외부 네트워크에 접속할 수 없다. 개별 네트워크 설정이 가능한 Container가 인터넷이 되게 하는 방법은 VM과 다를 바가 없지만, Container 생성 단계에서 약간의 작업이 들어가기 때문에 기록하게 되었다.



1. Host 머신 설정


Host가 Container들을 브릿지로 관리하는지, NAT로 관리하는지에 따라 설정이 다른데, 여기서는 NAT를 쓰는 경우를 기준으로 설명한다.


우분투에 lxc를 설치하고 나면 자동으로 브릿지가 하나 생성되어 있는데 보통 br과 lxc라는 단어가 동시에 들어가 있다. 필자의 경우 lxcbr0 이름으로 브릿지가 생성되어 있었고, IP주소는 10.0.3.1로 잡혀 있었다.


(Host에서 lxc 설치 후에 lxcbr0 인터페이스가 새로 생긴 것을 확인할 수 있다.)



Host에서 NAT를 통해 인터넷 접속을 허용하기 위해서 몇 가지 작업을 해 줘야 한다. 먼저 iptables에서 NAT 내부에서 인터넷으로 나가는 패킷을 masquerade 시켜 준다.

$ sudo iptables -t nat -A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE


그리고 /etc/sysctl.conf 파일에서,


net.ipv4.ip_forward=1 

위 라인의 주석을 제거한 다음, sysctl을 새로 적용한다.


$ sudo sysctl -p /etc/sysctl.conf



일단 ns-3에서 Linux Container를 생성해서 "시뮬레이션용 네트워크"에 연결하는 튜토리얼 [1] 을 따라해 보면 샘플 lxc 설정 파일이 있는데, 여기에 외부접속 용도의 네트워크 인터페이스를 하나 추가해 준다.


(NOTE)

ns-3 용도가 아니라 일반 VM처럼 쓰고 싶으면 네트워크 인터페이스를 굳이 여러 개 할 필요는 없고, 기본으로 설정하는 한 개의 네트워크 인터페이스 구성을 변경하면 된다.



lxc 설정 파일(여기서는 ns-3에서 샘플로 쓰는 lxc-left.conf 파일에 내용 추가 [1])에 아래 내용을 추가한다.


# Container with network virtualized using a pre-configured bridge named br-left and

# veth pair virtual network devices

lxc.utsname = left

lxc.network.type = veth

lxc.network.flags = up

lxc.network.link = br-left

lxc.network.ipv4 = 10.0.0.1/24


######################################

# 여기 아래부터 새로 추가한 부분

######################################

lxc.network.type = veth

lxc.network.flags = up

lxc.network.link = lxcbr0    <-- Host에 있는 브릿지 인터페이스 이름

lxc.network.ipv4 = 10.0.3.2/24  <-- Host 브릿지의 IP주소 대역에 있는 주소

lxc.network.name = eth1 <-- Container에서 보여지는 인터페이스 이름(임의설정 가능)


이제 위의 설정파일을 가지고 left라는 이름의 Container를 생성하고 시작한다.

$ sudo lxc-create -n left -f lxc-left.conf -t /usr/share/lxc/templates/lxc-ubuntu

$ sudo lxc-start -n left -F /bin/bash



2. Container 내부 설정


만약 Container가 정상적으로 생성되었다면 left라는 이름의 root 계정으로 쉘 프롬프트가 바뀔 것이다. ifconfig를 쳐 보면 아래와 같이 eth1 인터페이스가 인식되는 것을 볼 수 있다. (eth0의 경우는 원래 설정되어 있던 것)


(lxc-left.conf 설정파일에 새로 추가한 eth1 인터페이스가 설정한 IP주소 

10.0.3.2로 표시되는 것을 확인할 수 있다.)


Container를 시작한 직후에는 default route가 설정되어 있지 않기 때문에 인터넷 상의 머신으로 ping이 되지 않는다. 따라서 Container 상의 쉘에서 Host 머신과 연결하는 route를 추가한다. Host 머신의 lxcbr0 인터페이스의 IP주소가 10.0.3.1이기 때문에, default route의 게이트웨이를 10.0.3.1로 설정한다.


root@left:/root# route add default gw 10.0.3.1



여기까지 설정하면 IP주소를 통해 인터넷 상의 아무 컴퓨터에나 접속할 수는 있다. 다만 도메인 네임 서버가 설정되어 있지 않으므로 www.google.com 과 같은 도메인 네임으로는 주소를 찾을 수 없다.


도메인 네임 서버 설정은 여러가지 방법이 있지만, Container 자체가 약간 휘발성에 잠시 쓰는 느낌이 있어서, 일단 임시방편으로 /etc/resolv.conf 파일을 직접 수정했다. (좋은 방법은 아닌 것 같지만... 당장 되긴 되니까.)

네임서버는 일단 구글 도메인 네임 서버(8.8.4.4)로 했는데, 국내 다른 도메인 네임 서버로 설정해도 상관이 없다.


root@left:/root# echo "nameserver 8.8.4.4" > /etc/resolv.conf


여기까지 하고 나면 인터넷에 접속이 된다. 
이제부터 apt-get install 을 써서 원하는 패키지를 설치할 수 있다.




<참고자료>

[1] https://www.nsnam.org/wiki/HOWTO_Use_Linux_Containers_to_set_up_virtual_networks#Running_an_ns-3_Simulated_CSMA_Network



반응형
블로그 이미지

Bryan_

,