원작자 : Greg Anuzelli
번역자/의역자/추가 : SkullQ
도움준친구 : Santafe
소개Dynamips는 크리스프 필롯(필명 Chris)이라는 사람에 의해서 만들어진 Cisco router 에뮬레이터 이다. 이 에뮬레이터는 실제 Cisco IOS를 이용해서2691, 3620, 3640, 3660, 3725, 3745와 7206 하드웨어를 에뮬레이트 할수가 있다.
Note : 절대 Boson류와 같은 시뮬레이터라 생각하지 마십시요.
Chris에 의하면
“이런 종류의 에뮬레이터는 실제 생활에서 사용하는 IOS를 이용해서 연습을 할때 아주 유용하다. 에뮬레이터를 사용함으로서 좀더 Cisco 장비들과 친숙해질수 있다.
IOS의 기능을 검사, 실험할수 있으며 설정들을 빠르게 검증하고 실제 라우터에 적용하는데 사용할수 있다.”
고 한다.
물론 이런 에뮬레이터가 실제 라우터를 대치할수 없다. 단순히 시스코 네트웍 관라자나 CCNA/CCNP/CCIE 시험을 준비하는 사람들에게 보완적인 도구로 사용할수가 있다.
Dynagen은 text-based Dynamips와 "Hypervisor"모드를 이용하여 통신을 할수 있는 Front-end이며 가상네트웍을 구축하고 동작을 쉽게 해주는 역할을 한다. 내부적으로 연결된 router, bridge, frame-relay 그리고 ATM과 Ethernet스위치들을 간단하고 이해하기 쉬운 설정파일을 사용하여 가상의 라우터설정을 쉽게 할수 있다.
Chris가 만든 Dynamips에 사용하는 NetIO들을 고민하지 않고 dynamips가 실행중인 back-end서버와 통신하게끔 Dynagen은 client/server모드로 구성할수 있다. 또한 Dynagen은 각 가상라우터를 나열하고 실행, 정지, 재실행 그리고 가상라우터의 console에 접속할수 있도록 관리 CLI를 제공하고 Danamips와 같은 시스템에서 동작시킬수 있다.
Dynagen은 Python으로 제작되었고 Python 인터프리터가 사용되는 어떤 OS에서도 사용할수 있다.
Dynamips와 서로 공유하기 위한 분리 OOP API modular형식으로 디자인 되었다. 다른 Python 어플리케이션들은 모듈형식으로된 API을 이용하여 계획적인 설비 가상네트웍 또는 다른 front-end를 제공할수 있다.
Yannick Le Teigner는 Python library를 이용하여 Dynagui라는 GUI front-end를 제작하고 있다.
The design is modular, with a separate OOP API for interfacing with Dynamips. Other Python applications could be written that use this API for programmatically provisioning virtual networks, or to provide other front-ends. Yannick Le Teigner is working on Dynagui; a GUI front-end using this library.
Dynamips와 Dynagen에 관련된 참고사이트를 찾지않고 이 메뉴얼을 어렵게 보고 있다면 다른 중요 사이트를 참조하라.
Dynamips (the actual emulator):
http://www.ipflow.utc.fr/index.php/Cisco_7200_SimulatorDynamips Blog (where most of the action is):
http://www.ipflow.utc.fr/blog/Dynagen (a front-end to the emulator):
http://dyna-gen.sourceforge.net/Dynagui:
http://dynagui.sourceforge.net/Dynamips / Dynagen Bug tracking:
http://www.ipflow.utc.fr/bts/Hacki’s Dynamips / Dynagen / Dynagui Forum:
http://hacki.at/7200emu/index.phpConfigObj Library를 제작한분께 감사~
http://www.voidspace.org.uk/python/modules.shtml#configobj .
이 library는 Dynagen 설정파일을 읽어들일때 사용되었다.
설치
Dynage은 Python을 지원하는 어떤 platform에서도 실행할수 있다. 또한 Windows installer packet를 통해서 Dynamips와 Python을 install을 하지 않게끔 이미 컴파일된 Dynagen을 함께 넣어서 배포한다. 또한 Explorer상에서 설정파일인 network file을 더블클릭해서 실행될수 있게끔 조정해 놓았다.
Dynagen을 실행하려면 해당 Platform에 맞는 winpcap을 설치해야 한다. winpcap은 router interface들과 물리적 네트웍카드를 연결해주는 역할을 한다. windows사용자들은 Wincap 4.0이나 그 이상을 설치해야한다. 현재 Wincap 4.0은 beta버전이다.
Linux사용자들은 tarball로 압축된 Dynamips / Danagen을 다운로드해서 적당한 디렉토리에 (eg.g. /opt/dynagen)에 압축을 푼다. 그리고 Binary실행이 가능한 Path가 지정된 디렉토리 (e.g. /usr/loca/bin) 와 같은곳에 symbolic link를 해서 어디에서든 실행가능하게 한다.
Note: Redhat이나 Fedora 패키지를 사용하는 사용자라면 Dynamips FAQ items #2를 자세히 봐야한다. Dynamips를 실행할때 segmentation fault에러가 날수 있다.
/sbin/sysctl -w kernel.exec-shield=0
/sbin/sysctl -w kernel.randomize_va_space=0
IOS Images
Dynamips는 Cisco 2691, 3620, 3640, 3660, 3725, 3745, and 7200 IOS를 실행할수 있다.
Note : emule이나 pruna 혹은 IOS Hunter와 같은것을 이용해서 쉽게 IOS를 얻을수가 있다.
Windows 사용자라면 IOS image를 C:\Program Files\Dynamips\images에 넣어둔다. IOS를 어디에 놓아두건 상관은 없지만 sample lab은 image를 이곳에서 참고를 하게끔 설정 되어 있다.
Cisco IOS image는 압축이 되어 있다. 압축된 image들은 Dynamips에서 실행이 가능하나 라우터가 booting할때 압축된 이미지를 풀기위해서 적지않은 리소스가 사용되며 부팅시간도 길어진다. IOS의 압축을 먼저 풀어놓고 실행하기를 권장한다. Linux/Unix/Cygwin에서 압축을 풀려면 다음과 같이 해야한다.
unzip -p c7200-g6ik8s-mz.124-2.T1.bin > c7200-g6ik8s-mz.124-2.T1.imageResource Utilization Dynamips는 에뮬레이션을 하기 위해서 어느정도의 RAM과 CPU를 사용한다. 7200 라우터에서 256MB의 메모리를 필요로 하는 IOS image를 실행하고자 한다면 똑같이 virtual router에 256M의 메모리를 할애해야 한다. 또한 Dynamips는 기본적으로 Unix system에서 65MB의 메모리를 Windows systems에서는 16MB의 메모리를 JIT변환 캐쉬를 위해서 추가적으로 할당한다. virtual router를 실행하기 위해서 필요한 총 메모리양이 이정도이나 사용자가 가지고 있는 메모리 량은 이보단 훨씬 부족하다. working directory안을 보게되면 virtual router의 RAM 크기와 똑같은 ram file을 보게될 것이다. OS에서 자연스럽게 RAM을 캐쉬하기위해 사용하는 mmap file들이다.
현재 Dynagen과 Dynamips는 대규모 lab을 구성할때 각각의 host가 사용하는 RAM을 줄일수 있는 Ghost RAM이라는 기능을 제공한다. 이 기능을 사용해서 각 virtual router들의 IOS를 각각의 virtual router들이 virtual RAM에 저장하는 대신 메모리의 일부 영역을 모든 virtual router가 공유하게된다. 예를들어서 10개의 router가 60MB 크기의 IOS image로 실행한다고 했을때 9*60 = 540MB만큼의 실제 메모리를 절약 할 수가 있다.
자세항 사항은 README파일을 참조하기 바람.
충분한 RAM을 가지고 있다면 설정파일안에서 device의 default설정안이나 router section에 mmap을 사용하지 않도록 mmap = false를 설정한다. 이렇게 설정하게 되면 Ghost RAM기능을 사용할수 없게된다. GhostRAM을 사용하려면 GhostIOS파일하나를 서로 공유해야하기 때문에 꼭 mmap기능을 사용해야한다.
Dynamips는 각각의 라우터의 cpu를 에뮬레이팅 하기 때문에 CPU에 많은 로드를 준다. 초기에는 virtual router의 CPU가 언제 활동을 하지 않는지 알길이 없어서 host의 CPU 로드는 항상 100%였다. 하지만 지금은 에뮬레이션 하고자 하는 IOS image를 실행하고 idlepc프로세스를 통해서 idlepc값을 설정할수 있어서 CPU사용률을 현격하게 줄일수 있었다.
Telnet Client 설정하기Dynagen은 CLI를 통해서 직접 virtual router의 console에 접속하기 위해 telnet명령어를 포함하고 있다. 하지만 먼저 dynagen.ini (C:\Program Files\Dynagen) 파일에서 어떤 telnet client를 사용할지를 설정해야 한다. 기본적으로는 아무것도 설정이 되어있지 않다.
Network FilesDynagen은 virtual lab을 구성하기 위해 모든 router와 switch의 내부접속설정을 하나의 network file에 저장하고 사용한다. 이 파일은 INI 파일과 비슷한 문법을 사용한다. 문서편집기로 simple1.net 파일을 열면 다음과 같다.
# Simple lab
autostart = true
# 모든 virtual router들이 .net파일을 실행했을 때 한번에 실행되게끔 하는 역할을 한다. 또한 device당 중첩해서 사용할수 있다.
debug = 0
# Debug출력 레벨을 줄수가 있다. 높은번호일수록 더많은 정보를 볼수가 있다. Default는 1이다.
model = 7200
# 기본 라우터 모델을 결정한다. 다른 현재 다음과 같은 옵션을 제공한다. 2691, 3620, 3640, 3660, 3725, 3745, 7200
ghostios = false
# 전체적으로 ghostios를 사용할지 여부를 결정한다.
ghostsize = 128
# 수동으로 ghost image에 virtua ram을 지정할 수가 있다. 현재는 자동으로 계산을 하기 때문에 전혀 쓸모가 없는 명령어가 되어버렸다.
idlemax = 1500
# 향상된 idlepc값 조작기능.
idlesleep = 30
# Each DYNAMIPS section sepecifies a dynamips server and the devices it hosts
[bender:7200]
# Dynamips서버의 호스트이름이나 ip주소 이고 7200은 제어포트 포트번호 이다. 만약 두개 이상의 서버를 실행하기를 원한다면 다른 포트번호를 설정해야 하며 서버를 띄울때도 network파일에 설정된 포트번호를 서버를 실행해야 한다.
port = 7200
# 옛날 스타일의 포트 설정방법. 되도록이면 위의 기능을 사용하기를 권장
console = 2000
# 기본 콘솔포트를 말하며 특별히 Device에 콘솔포트설정을 하지 않으면 기본포트인 2000 + 인스턴스 번호가 콘솔포트가 된다. Virtual router를 두개이상 띄우게 되면 인스턴스번호는 0부터 1씩 증가한다. 직접 각 인스턴스당 콘솔포트를 설정하기를 권장.
workingdir = /home/labs/test
# nvram이나 lock파일 그리고 mmap cahce파일이 저장될 디렉토리
udp = 10000
# NIO를 위한 udp 시작포트번호. 예측가능한 번호를 설정해야 하며 두개 이상의 서버를 띄울 때 포트를 적당하게 나눠줘야 한다. (ex. Udp = 20000 ß- 두번째 서버가 쓸 udp port 시작번호)
# 7200 라우터를 위한 설정파일이다. 다른라우터 설정들도 비슷하지만 특히
# section is optional, and defaults to whatever the default is in Dynamips
[[7200]]
image = /opt/7200-images/c7200-ik9o3s-mz.122-15.T17.image
# IOS 이미지파일의 위치를 지정한다.
ram = 256
# 각 virtual router에 할당할 메모리의 양이다. 보통 IOS를 다운받게 되면 해당 IOS가 필요로하는 메모리양이 명시가 되어 있다. 대체적으로 256MB가 필요한 IOS는 192MB정도를 128MB가 필요한 IOS는 96MB정도를 설정해도 큰 무리가 없다.
nvram = 128 # NVRAM의 크기
disk0 = 64 # PCMCIA ATA disk0의 크기
disk1 = 64 # PCMCIA ATA disk1 크기
cnfg = None.
confreg = 0x2102 # config-registary
clock = 2 # Clock divisor (dynamips 0.2.5 RC1 이상부터는 필요치 않다.)
npe = npe-200 # NPE type.("npe-100", "npe-150", "npe-175", "npe-200", "npe-225", "npe-300" or "npe-400")
midplane = vxr # Midplane, "std" 또는 "vxr" 7200 옛날 샷시를 이야기하며 vxr을 권고한다.
mmap = true # false를 설정하게 되면 mmap cache파일을 이용해서 메모리의 한계를 극복하지 않고 실제 메모리를 사용하겠다는 옵션이다. 디스크를 이용하게되면 성능에 큰 영향을 줄수가 있다. 하지만 적은 메모리로 많은 virtual router를 사용하기를 원한다면 true를 설정하고 ghostram을 사용한다.
idlepc = 0x60719b98 # Idle PC 값이며 가장 중요하다.
exec_area = 64 # Set the exec area size
configuration = ... # Base 64 인코딩된 설정파일 위치를 지정한다..
ghostios = false # ghostram을 사용할지를 결정한다.
ghostsize = 128 # 자동적으로 계산하기 때문에 사용할 필요 없음.
idlemax = 1500
idlesleep = 30
# Everything is optional, and defaults to whatever the default is in Dynamips
[[3620]] 3600시리즈 설정
image = /opt/3620-images/c3620-io3-mz.123-20.image
ram = 128
rom = 4
nvram = 128
disk0 = 64
disk1 = 64
iomem = 5 # 인터페이스 버퍼용으로 사용하는 iomem의 Percentage를 설정할수 있다. 3600시리즈 라우터에만 적용된다.
cnfg = None
confreg = 0x2102
clock = 2
mmap = true
idlepc = 0x60719b98
exec_area = 64
configruation = ....
ghostios = false
ghostsize = 128
idlemax =
idlesleep = 30
[[3640]]
# 모든 옵션은 3620과 동일하다.
[[3660]]
# 모든 옵션은 3620과 동일하다
[[2961]]
# 모든 옵션은 3620과 동일하다 단 iomem은 사용할수 없다. 단지 3600시리즈에서만 가능하다.
[[3725]]
# 모든 옵션은 3620과 동일하다
[[3745]]
# 모든 옵션은 3620과 동일하다
# 각 ROUTER section이며 이부분에서 연결설정을 하게된다.
[[ROUTER R1]] # 꼭 설정해야 하며 유일한 이름이어야 한다.
model = 7200 # 사용하고자 하는 라우터 모델인 2691, 3620, 3640, 3660, 3725, 3745, 7200를 설정할수 있으며 기본은 7200이다.
console = 2000
aux = 3000
# 수동으로 7200시리즈에서 사용하는 Port Adapter와 3600이나 2600시리즈에서 사용하는 Network Module을 지정할 수가 있다.
slot0 = PA-C7200-IO-FE #기본적으로 Slot0은 지정해줄 필요가 없다. 만약 7200시리즈를 실행한다면 NPE에 달려있는 1-FE가 기본적으로 설정이되어서 부팅되고 2600이나 3600시리즈는 Leopard-2FE 즉 2포트 Fastethernet 모듈이 달려서 부팅이 된다. 테스트할때 7200보다 2600이나 3600을 선호하는 이유는 기본적으로 2-FE가 있기 때문이다.
slot1 = PA-FE-TX # Ethernet in slot 1
slot2 = NM-1E # 3600 NM-1E in slot 2
slot3 = PA-4T # PA-4T+ in slot 2
slot6 = PA-4E # PA-4E in slot 6
#slotx = PA-POS-OC3 # PA-POS-OC3 in slot x
# Interface 인터페이스 설정이며 직관적으로 이해해주길 바란다.
f1/0 = R2 f1/0 # Connect to f1/0 on device R2
f2/0 = LAN 1 # Connect to bridged LAN 1
s3/0 = R2 s3/0 # Connect to s3/0 on device R2
s3/1 = F1 1 # Connect to port 1 on device "F1" (a frame relay switch)
s3/2 = F2 1
a4/0 = A1 1 # Connect to port 1 on device "A1" (an ATM switch)
f5/0 = NIO_linux_eth:eth0 # manually specify an NIO
[[ROUTER R2]]
model = 3640
# Interface f1/0 will automatically be created because the interface was referenced in R1's config
f2/0 = LAN 1 # 특별히 LAN이라는 폐쇄된 도메인을 설정할 수가 있다. 마치 VLAN이지만 다른 VLAN으로 통신할수 없는 공간을 생각하면 된다. (특별히 사용할 이유가 없음)
s3/0 = F1 2
s3/1 = F2 2
s3/2 = F1 3
a5/0 = A1 2
[[router R3]] # Case is not significant
# Examples of other manually specified NIOs
f1/0 = NIO_gen_eth:\Device\NPF_{B00A38DD-F10B-43B4-99F4-B4A078484487} #외부와 연결된 인터페이스를 virtual router의 특정 인터페이스에 연결해서 통신을 할 수가 있다. 하나의 물리적 인터페이스더라도 여러 virtual router의 인터페이스에서 사용할 수가 있다.
f2/0 = NIO_udp:10000:127.0.0.1:10001
f3/0 = NIO_tap:tap0 #패킷 모니터링을 위해서 사용할수 있다. (본인은 테스트 해보지 못함)
f4/0 = NIO_unix:/tmp/local:/tmp/remote
f5/0 = NIO_vde:foo:bar
# 프래임릴레이 스위치 설정
[[FRSW F1]]
1:102 = 2:201 # DLCI설정이며 자세한 설정은 뒤에서 예제파일을 통해서 다시 설명하겠다.
1:103 = 3:301
[[FRSW F2]]
1:102 = 2:201
# Define an ATM Switch
[[ATMSW A1]]
1:10 = 2:20 # 포트 1번에 vpi 10이 설정되었고 포트 2번에는 vpi 20이 설정되었다.
#1:10:200 = 2:20:100 # 포트 1에는 vpi 10과 vci 200이 설정되었고 포트 2에는 vpi 20과 vci 100이 설정되었다.
# Ethernet Switch 설정을 할 수가 있다.
[[ETHSW S1]]
1 = access 1 # 1번포트는 스위치에서 switchport access vlan 1과 같이 1번vlan에 접속되어있다.
2 = access 20
3 = dot1q 1 # Port 3번포트는 trunk port이며 native vlan은 1번이다.
4 = dot1q 1 NIO_gen_eth:eth0 # 4번 포트는 trunk포트이며 encapsulation은 dot1q이다. 그리고 native vlan은 1번으로 설정되었다. Eth0는 linux에서 물리적 포트를 이야기한다.
#4 = dot1q 1 NIO_gen_eth:\Device\NPF_{B00A38DD-F10B-43B4-99F4-B4A078484487} 위의예를 윈도우에서 표현하면 이와같다.