コンソールからのCisco IOUオートメーション

長い間この記事を公開することを考えていましたが、最終的に決定したとき、興味深いCisco IOUエミュレーターにそれを捧げました。 むしろ、GNS3やIOU Webなどのグラフィカルツールを使用せずに、複雑な回路の起動段階に進みます。



私は自転車を発明せず、@ Avtandiko 記事 Raising the Simplified Provider Network at Home」を基礎として、特に著者のコメントの中で、彼らはスタンドを共有するように頼みました。



著者は、画像i86bi_linux-adventerprisek9-ms.152-4.M1およびi86bi_linux_l2-ipbasek9-ms.jan24-2013-Bを使用しましたが、実際、これはポイントではありません。 残念ながら、ArchLinuxでのみ動作する代替手段を提供したいと思います。 これは、IOUパッケージをビルドするためです。



利点の中には、画像を持ち歩く必要がない、異なるスタンドを立ち上げるための統一されたアプローチがあります。 ArchLinuxでパッケージを収集する方法については詳しく説明しません。これについてはインターネット上に十分な情報があります。 PKBUILDのみを提供してインストールします。 追加コンポーネントiou2net.pl、CiscoIOUKeygen.py、IOUsniffer、wrapper-linuxは無料で入手できます。



PKBUILD
pkgname=iou pkgver=1.2 pkgrel=1 pkgdesc="Cisco IOU" arch=("any") url="http://www.cisco.com/" license=("custom") depends=("libpcap" "cryptsetup" "lib32-openssl" "perl-net-pcap") options=("emptydirs") install="${pkgname}.install" source=("${pkgname}.install" "iou2net.pl" "CiscoIOUKeygen.py" "IOUsniffer.tar.gz" "wrapper-linux.tar.gz" "i86bi_linux-adventerprisek9-ms.152-2.15.T" "i86bi_linux_l2-ipbasek9-ms.jan24-2013-team_track") build() { cd "${srcdir}/IOUsniffer" && make || return 1 cd "${srcdir}/wrapper-linux" && make || return 1 } package() { install -Dm 0755 "${srcdir}/iou2net.pl" "${pkgdir}/usr/bin/iou-live" install -Dm 0755 "${srcdir}/CiscoIOUKeygen.py" "${pkgdir}/usr/bin/iou-keygen" install -Dm 0755 "${srcdir}/IOUsniffer/iousniff" "${pkgdir}/usr/bin/iou-sniff" install -Dm 0755 "${srcdir}/wrapper-linux/wrapper-linux" "${pkgdir}/usr/bin/iou-wrapper" install -Dm 0755 "${srcdir}/i86bi_linux-adventerprisek9-ms.152-2.15.T" "${pkgdir}/usr/bin/iou-router" install -Dm 0755 "${srcdir}/i86bi_linux_l2-ipbasek9-ms.jan24-2013-team_track" "${pkgdir}/usr/bin/iou-switch" install -dm 0755 "${pkgdir}/usr/lib32/" ln -s "/usr/lib32/libcrypto.so.1.0.0" "${pkgdir}/usr/lib32/libcrypto.so.4" } md5sums=('SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP')
      
      







iou.install
 post_install() { grep xml.cisco.com /etc/hosts > /dev/null if [ $? -ne 0 ] then echo '127.0.0.127 xml.cisco.com' >> /etc/hosts fi /usr/bin/iou-keygen } post_upgrade() { grep xml.cisco.com /etc/hosts > /dev/null if [ $? -ne 0 ] then echo '127.0.0.127 xml.cisco.com' >> /etc/hosts fi } post_remove() { grep xml.cisco.com /etc/hosts > /dev/null if [ $? -ne 1 ] then sed -i '/xml.cisco.com/d' /etc/hosts fi }
      
      







次に、スキームに移りましょう。 思い出させてください(ネットワーク図の画像は上記の記事から取られています):







このプロセスの最も徹底的な手順は、NETMAPを正しくコンパイルすることです。



NETMAP
1:0/1 3:0/1 1

2:0/1 3:0/2 1

2:0/3 5:1/1 1

2:0/2 7:0/0 1

2:0/0 6:0/1 1

2:1/0 15:0/0 1

6:1/0 15:0/1 1

5:1/0 6:0/2 1

6:0/3 7:0/1 1

6:0/0 8:0/0 1

3:0/0 4:0/0 1

3:0/3 5:0/0 1

4:0/2 5:1/2 1

5:0/3 7:1/0 1

7:0/2 8:0/2 1

8:0/1 12:0/0 1

4:0/1 9:0/0 1

5:0/1 10:0/0 1

5:0/2 11:0/0 1

7:0/3 11:0/1 1

9:0/1 10:0/2 1

9:0/2 13:0/0 1

10:0/1 13:0/1 1

11:0/2 14:0/0 1



基本的に、各行の末尾の数字「1」を除いて、新しいものはありません。 IOUSnefferに必要であり、接続のタイプを示します。 この場合、イーサネット。



最後に、最も興味深いのはスタンド起動スクリプト自体です。



run.sh
 #!/bin/bash WRAPPER="/usr/bin/iou-wrapper" ROUTER="/usr/bin/iou-router" SWITCH="/usr/bin/iou-switch" IOUSNIFF="/usr/bin/iou-sniff" DUMPDIR="./dump" DUMPDIRTMP="${DUMPDIR}/tmp" DUMPFILE="${DUMPDIR}/dump-$(date +%F-%T).pcap" DELAY="5" MODE=${1:-"--help"} # Name Type ID Port Serial Ethernet DEVICES=( "R-01" "R" "1" "10001" "0" "1" "R-02" "R" "2" "10002" "0" "2" "R-03" "R" "3" "10003" "0" "1" "R-04" "R" "4" "10004" "0" "1" "R-05" "R" "5" "10005" "0" "2" "R-06" "R" "6" "10006" "0" "2" "R-07" "R" "7" "10007" "0" "2" "R-08" "R" "8" "10008" "0" "1" "R-09" "R" "9" "10009" "0" "1" "R-10" "R" "10" "10010" "0" "1" "R-11" "R" "11" "10011" "0" "1" "SW-12" "S" "12" "10012" "0" "1" "SW-13" "S" "13" "10013" "0" "1" "SW-14" "S" "14" "10014" "0" "1" "R-15" "R" "15" "10015" "0" "1" ) start-iou() { for ((index=0; index < ${#DEVICES[@]}/6; index++)) do if [ "X_${DEVICES[${index}*6+1]}" == "X_R" ] then ${WRAPPER} -m ${ROUTER} -p ${DEVICES[${index}*6+3]} -- \ -s ${DEVICES[${index}*6+4]} \ -e ${DEVICES[${index}*6+5]} ${DEVICES[${index}*6+2]} &> /dev/null & else ${WRAPPER} -m ${SWITCH} -p ${DEVICES[${index}*6+3]} -- \ -s ${DEVICES[${index}*6+4]} \ -e ${DEVICES[${index}*6+5]} ${DEVICES[${index}*6+2]} &> /dev/null & fi done } start-konsole() { touch ./tabs for ((index=0; index < ${#DEVICES[@]}/6; index++)) do echo "title: ${DEVICES[${index}*6]};; command: telnet localhost ${DEVICES[${index}*6+3]}" >> ./tabs done konsole --tabs-from-file ./tabs &> /dev/null rm ./tabs &> /dev/null } reset-konsole() { for ((index=0; index < ${#DEVICES[@]}/6; index++)) do sudo kill -SIGHUP $(fuser -n tcp ${DEVICES[${index}*6+3]} 2>&1 | awk '{print $2}') done } start-sniff() { [ -d ${DUMPDIR} ] || mkdir -p ${DUMPDIR} &> /dev/null mkdir -p "${DUMPDIRTMP}" &> /dev/null ${IOUSNIFF} -f -o -i /tmp/netio$(id -u) -n ./NETMAP -s ${DUMPDIRTMP} &> /dev/null & } stop() { ps -e | grep "${1}" | awk '{ print $1 }' | xargs sudo kill "-${2}" &> /dev/null } case "${MODE}" in --start) start-iou sleep ${DELAY} start-konsole ;; --stop) stop "iou" "SIGKILL" ;; --start-iou) start-iou ;; --start-konsole) start-konsole ;; --reset-konsole) reset-konsole ;; --start-sniff) start-sniff ;; --stop-sniff) stop "iou-sniff" "SIGINT" fdupes -d -N ${DUMPDIRTMP} &> /dev/null mergecap -w ${DUMPFILE} ${DUMPDIRTMP}/*.pcap rm -rf ${DUMPDIRTMP} &> /dev/null ;; --help|*) echo -e "\nUsage: ${0} [OPTIONS]" echo -e "\nOPTIONS:\n" echo -e "\t--start \t- Start" echo -e "\t--stop \t\t- Stop" echo -e "\t--start-iou \t- Start IOU" echo -e "\t--start-sniff \t- Start Sniff" echo -e "\t--stop-sniff \t- Stop Sniff" echo -e "\t--start-konsole - Start konsole" echo -e "\t--reset-konsole - Reset konsole" echo -e "\t--help \t\t- Help\n" ;; esac
      
      







提示されたスクリプトは、現在のスタンドで動作するように構成されています。 別のスキームで使用する場合は、 DEVICES配列を正しく設定するだけです。



 # Name Type ID Port Serial Ethernet DEVICES=( "R-01" "R" "1" "10001" "0" "1" "R-02" "R" "2" "10002" "0" "2" "R-03" "R" "3" "10003" "0" "1" "R-04" "R" "4" "10004" "0" "1" "R-05" "R" "5" "10005" "0" "2" "R-06" "R" "6" "10006" "0" "2" "R-07" "R" "7" "10007" "0" "2" "R-08" "R" "8" "10008" "0" "1" "R-09" "R" "9" "10009" "0" "1" "R-10" "R" "10" "10010" "0" "1" "R-11" "R" "11" "10011" "0" "1" "SW-12" "S" "12" "10012" "0" "1" "SW-13" "S" "13" "10013" "0" "1" "SW-14" "S" "14" "10014" "0" "1" "R-15" "R" "15" "10015" "0" "1" )
      
      





1次元配列DEVICESは、6つの疑似列で構成されます(このアプローチはCを使用したときから根付いています。この問題に対するより洗練された解決策を排除するものではありません)。



  1. 名前 -コンソールのタブに署名するときに使用されるデバイスの条件付きの名前。
  2. タイプ -デバイスタイプ:R-ルーター、S-スイッチ。
  3. ID -NETMAPでも使用されるデバイス識別子。
  4. ポート -telnetがデバイスのコンソールに接続できるポート番号。
  5. シリアル -シリアルポートを備えたデバイスにインストールされているカードの数。
  6. イーサネット -イーサネットポートを備えたデバイスにインストールされているカードの数。




記事の最後で、スクリプトの開始オプションを明らかにします。

  1. --start-コンソールへの同時接続を伴うスタンドの完全な開始。
  2. --stop-スタンドの完全なシャットダウン。
  3. --start-iou-コンソールから追加の接続なしですべてのデバイスを起動します。
  4. --start-konsole-コンソールを介してすべてのデバイスに接続します。
  5. --reset-konsole-コンソールがフリーズした場合、時々これが起こります。 現在のオプションを使用すると、デバイスを再起動せずにすべての接続をリセットできます。
  6. --start-sniff-スニッフィングが必要になった場合、このオプションでスクリプトを実行する必要があります。 パケットがキャプチャされる期間に耐える。 次に、-stop-sniffオプションでパケットキャプチャを停止する必要があります。ネットワークの完全なダンプが./dumpフォルダーに取得されます。
  7. --stop-sniff-パケットキャプチャモードを停止します。



All Articles