Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Vyatta 改造入門

9,405 views

Published on

Vyatta を改造して独自機能を追加する方法について解説します。

Published in: Technology
  • Be the first to comment

Vyatta 改造入門

  1. 1. Vyatt a Co re 6.4 対応Vyatta 改造入門浅間 正和 @ 有限会社 銀座堂
  2. 2. もくじ• Vyatta 改造の流れ• 詳解 CLI 定義ファイル• 実例: MAP 機能の追加
  3. 3. Vyatta 改造の流れ Vyatta のソースコードを管理しているサーバ ② ソースコードの入手 ③ ビルド環境の構築 ④ パッケージの準備 ⑤ CLI 定義ファイルの準備 ⑥ ISO イメージの作成 出来た ISO イメージで① ビルド環境の準備 インストール ビルド環境: Debian GNU/Linux 6(Squeeze)/i386 インストールターゲット
  4. 4. ソースコードの入手 • ソースコードは Git で管理されている • build-iso というリポジトリがメイン • build-iso の pkgs 内にその他のパッケージの ソースコードが用意される# apt-get update# apt-get install git-core$ git clone http://git.vyatta.com/build-iso.git$ cd build-iso$ git checkout --track -b oxnard origin/oxnard$ less README ※ oxnard は Vyatta のコードネームで 6.4 を表します。 ※ コードネームは Vyatta のロードマップで確認できます。 - http://www.vyatta.org/documentation/product-roadmap
  5. 5. ソースコードの入手 ※ vyatta-cfg-* は設定モードに関するパッケージです。$ git submodule init ※ vyatta-op-* は一般モードに関するパッケージです。$ ls pkgs/barnyard2 ppp vyatta-ipv6-rtradvconntrack-tools squashfs vyatta-keepaliveddaq squidguard vyatta-lldp...linux-firmware vyatta-cfg-system vyatta-snortlinux-image vyatta-cfg-vpn vyatta-strongswanlive-initramfs vyatta-cluster vyatta-util... ※ iptables や linux-image(kernel) のように Debian のものをそのまま使わず Vyatta で独自に手を入れたものもここに含まれます。$ git submodule update pkgs/linux-image$ cd pkgs/linux-image$ git checkout --track -b oxnard origin/oxnard
  6. 6. ビルド環境の構築• 最新情報は build-iso/README に書かれている ので必ず読む• 基本的には Debian のパッケージで構築するが 一部(squashfs-tools 等)は Vyatta 独自パッケージ を用いる• Vyatta のパッケージをインストールした際 Debian のものに置き換わらないよう /etc/pat/ preferences.d 内に Pin を打つ必要がある
  7. 7. パッケージの準備 • 既存の Vyatta パッケージを改造したい: ☞ build-iso/pkgs 内のソースコードを改造後以下の コマンドを実行(linux-image の例) ※ make (パッケージ名) で build-iso/pkgs ディレクトリ$ make clean-linux-image 内に “パッケージ名_バージョン.deb” というファイル$ make linux-image が生成されます。 • 新しくパッケージを組み込みたい: ☞ build-iso/pkgs ディレクトリに .deb パッケージ を置き build-iso/livecd/config.vyatta/chroot_local- packageslists/hoge.list に列挙する
  8. 8. CLI 定義ファイルの準備 核心なので後ほど詳しく説明します!
  9. 9. ISO イメージの作成 • あとは簡単♪$ export PATH=/sbin:/usr/sbin:$PATH$ autoreconf -i$ ./configure$ sudo make iso$ ls livecd/auto cache mk.livecdbinary chroot mk.livecd.confbinary.iso config mk.livecd.conf.inbinary.list config.vyatta mk.livecd.functionsbinary.packages livecd-1209171135-25e07fb.iso templates ※ 上記の例で livecd-1209171135-25e07fb.iso が生成された ISO イメージです。 ※ sudo 経由でコマンドを実行する場合実行ユーザが sudo グループに属して いる必要があります。
  10. 10. ちなみに... • configure 実行時に以下のオプションをつける と仮想化環境用の ISO イメージが作られます$ ./configure --with-kernel-flavor=586-vyatta-virt • 通常の ISO イメージと仮想化環境用の ISO イ メージでは以下の違いがありますvyatta:-linux-image-3.0.32-1-586-vyattavyatta-virt:+linux-image-3.0.32-1-586-vyatta-virt+open-vm-modules-3.0.32-1-586-vyatta-virt+open-vm-tools
  11. 11. 詳解 CLI 定義ファイル# set interfaces ethernet eth0 address 192.168.1.1/24 /opt/vyatta/share/vyatta-cfg/templates/ interfaces/ ethernet/ node.def node.tag/ address/ node.def
  12. 12. 詳解 CLI 定義ファイルtemplates/interfaces/ethernet/node.tag/address/node.def:multi:type: txthelp: IP addresssyntax:expression: exec "/opt/vyatta/sbin/valid_address $VAR(@)"commit:expression: exec "/opt/vyatta/sbin/vyatta-interfaces.pl --valid-addr-commit $VAR(@@) --dev $VAR(../@)"create: sudo /opt/vyatta/sbin/vyatta-address add $VAR(../@) $VAR(@)delete: sudo /opt/vyatta/sbin/vyatta-address delete $VAR(../@) $VAR(@)allowed: echo "dhcp dhcpv6 <>"val_help: ipv4net; IP address and prefix lengthval_help: ipv6net; IPv6 address and prefix lengthval_help: dhcp; Dynamic Host Configuration Protocolval_help: dhcpv6; Dynamic Host Configuration Protocol for IPv6
  13. 13. 詳解 CLI 定義ファイルtemplates/interfaces/ethernet/node.tag/address/node.def:multi:type: txthelp: IP addresssyntax:expression: exec "/opt/vyatta/sbin/valid_address $VAR(@)"commit:expression: exec "/opt/vyatta/sbin/vyatta-interfaces.pl --valid-addr-commit $VAR(@@) --dev $VAR(../@)"create: sudo このノードの値の型を書く /opt/vyatta/sbin/vyatta-address add $VAR(../@) $VAR(@) text : 文字列 bool : 論理値delete: sudo /opt/vyatta/sbin/vyatta-address delete $VAR(../@) $VAR(@) u32 : 32bit 整数 macaddr : MAC アドレスallowed: ipv4 "dhcp IPv4 アドレス echo : dhcpv6 <>" ipv6 : IPv6 アドレス ipv4net : IPv4 ネットワーク ipv6net : IPv6 ネットワークval_help: ipv4net; IP address and prefix lengthval_help: ipv6net; IPv6 address and prefix lengthval_help: dhcp; Dynamic Host Configuration Protocolval_help: dhcpv6; Dynamic Host Configuration Protocol for IPv6
  14. 14. 詳解 CLI 定義ファイルtemplates/interfaces/ethernet/node.tag/address/node.def:multi:type: txthelp: IP addresssyntax:expression: exec "/opt/vyatta/sbin/valid_address $VAR(@)"commit:expression: exec "/opt/vyatta/sbin/vyatta-interfaces.pl --valid-addr-commit $VAR(@@) --dev $VAR(../@)" タブ補完で表示されるヘルプを書くcreate: sudo /opt/vyatta/sbin/vyatta-address add $VAR(../@) $VAR(@)delete: sudo /opt/vyatta/sbin/vyatta-address delete $VAR(../@) $VAR(@)allowed: echo "dhcp dhcpv6 <>"val_help: ipv4net; IP address and prefix lengthval_help: ipv6net; IPv6 address and prefix lengthval_help: dhcp; Dynamic Host Configuration Protocolval_help: dhcpv6; Dynamic Host Configuration Protocol for IPv6
  15. 15. 詳解 CLI 定義ファイルtemplates/interfaces/ethernet/node.tag/address/node.def:multi:type: txthelp: IP addresssyntax:expression: exec "/opt/vyatta/sbin/valid_address $VAR(@)"commit:expression: exec "/opt/vyatta/sbin/vyatta-interfaces.pl --valid-addr-commit $VAR(@@) --dev $VAR(../@)"create: sudo /opt/vyatta/sbin/vyatta-address add $VAR(../@) $VAR(@)delete: sudo /opt/vyatta/sbin/vyatta-address delete $VAR(../@) $VAR(@)allowed: echo "dhcp dhcpv6 <>" 値の制約条件を書くval_help: ipv4net; IP address and prefix lengthval_help: ipv6net; : IPv6 address and prefixbrN(N は整数)) syntax 主に値のフォーマット (Ex: lengthval_help: dhcp; Dynamic Host Configuration Protocol commit : 主に値の整合性チェック (Ex: 他の必須項目有無)val_help: dhcpv6; Dynamic Host Configuration Protocol for IPv6
  16. 16. 詳解 CLI 定義ファイルtemplates/interfaces/ethernet/node.tag/address/node.def:multi:type: txthelp: IP addresssyntax:expression: exec "/opt/vyatta/sbin/valid_address $VAR(@)"commit:expression: exec "/opt/vyatta/sbin/vyatta-interfaces.pl --valid-addr-commit $VAR(@@) --dev $VAR(../@)"create: sudo /opt/vyatta/sbin/vyatta-address add $VAR(../@) $VAR(@)delete: sudo /opt/vyatta/sbin/vyatta-address delete $VAR(../@) $VAR(@) $VAR(...) は対応する引数に置き換えられるallowed: echo "dhcp dhcpv6 <>" $VAR(@) : この node.def に対応する値 (Ex: 192.168.1.1/24)val_help: ipv4net; IP address and prefix lengthval_help: ipv6net; : IPv6 address and prefix length $VAR(../@) ひとつ前の node.tag の値 (Ex: eth0)val_help: dhcp; Dynamic Host Configuration 時も値を参照可能 $VAR(@@) : $VAR(@) と同じだが delete Protocolval_help: dhcpv6; Dynamic Host Configuration Protocol for IPv6
  17. 17. 詳解 CLI 定義ファイルtemplates/interfaces/ethernet/node.tag/address/node.def:multi:type: txthelp: IP address commit 時のアクションを定義syntax:expression: exec "/opt/vyatta/sbin/valid_address $VAR(@)"commit:expression: exec "/opt/vyatta/sbin/vyatta-interfaces.pl --valid-addr-commit $VAR(@@) --dev $VAR(../@)"create: sudo /opt/vyatta/sbin/vyatta-address add $VAR(../@) $VAR(@)delete: sudo /opt/vyatta/sbin/vyatta-address delete $VAR(../@) $VAR(@)allowed: echo "dhcp dhcpv6 <>"val_help: ipv4net; IP address and prefix lengthval_help: ipv6net; IPv6 address and prefix lengthval_help: dhcp; Dynamic Host Configuration Protocolval_help: dhcpv6; Dynamic Host Configuration Protocol for IPv6
  18. 18. 詳解 CLI 定義ファイルtemplates/interfaces/ethernet/node.tag/address/node.def:multi:type: txthelp: IP addresssyntax:expression: exec "/opt/vyatta/sbin/valid_address $VAR(@)" 許容される値の一覧commit:expression: exec "/opt/vyatta/sbin/vyatta-interfaces.pl --valid-addr-commit $VAR(@@) --dev $VAR(../@)"create: sudo /opt/vyatta/sbin/vyatta-address add $VAR(../@) $VAR(@)delete: sudo /opt/vyatta/sbin/vyatta-address delete $VAR(../@) $VAR(@)allowed: echo "dhcp dhcpv6 <>"val_help: ipv4net; IP address and prefix lengthval_help: ipv6net; IPv6 address and prefix lengthval_help: dhcp; Dynamic Host Configuration Protocolval_help: dhcpv6; Dynamic Host Configuration Protocol for IPv6
  19. 19. 詳解 CLI 定義ファイルtemplates/interfaces/ethernet/node.tag/address/node.def:multi:type: txthelp: IP addresssyntax:expression: exec "/opt/vyatta/sbin/valid_address $VAR(@)"commit:expression: exec "/opt/vyatta/sbin/vyatta-interfaces.pl --valid-addr-commit $VAR(@@) --dev $VAR(../@)"create: sudo 値の型に応じた詳細なヘルプ /opt/vyatta/sbin/vyatta-address add $VAR(../@) $VAR(@)delete: sudo /opt/vyatta/sbin/vyatta-address delete $VAR(../@) $VAR(@)allowed: echo "dhcp dhcpv6 <>"val_help: ipv4net; IP address and prefix lengthval_help: ipv6net; IPv6 address and prefix lengthval_help: dhcp; Dynamic Host Configuration Protocolval_help: dhcpv6; Dynamic Host Configuration Protocol for IPv6
  20. 20. 詳解 CLI 定義ファイルtemplates/interfaces/ethernet/node.tag/address/node.def:multi:type: txthelp: IP addresssyntax:expression: exec "/opt/vyatta/sbin/valid_address $VAR(@)"commit:expression: exec "/opt/vyatta/sbin/vyatta-interfaces.pl 複数の値を設定できる場合は multi: と書く --valid-addr-commit $VAR(@@) --dev $VAR(../@)"create: sudo /opt/vyatta/sbin/vyatta-address add $VAR(../@) $VAR(@)delete: sudo /opt/vyatta/sbin/vyatta-address delete $VAR(../@) $VAR(@)allowed: echo "dhcp dhcpv6 <>"val_help: ipv4net; IP address and prefix lengthval_help: ipv6net; IPv6 address and prefix lengthval_help: dhcp; Dynamic Host Configuration Protocolval_help: dhcpv6; Dynamic Host Configuration Protocol for IPv6
  21. 21. 詳解 CLI 定義ファイルtemplates/interfaces/ethernet/node.def:tag:priority: 318type: txthelp: Ethernet interface nameallowed: /opt/vyatta/sbin/vyatta-interfaces.pl --show=ethernetval_help: <ethN>; Ethernet interface namesyntax:expression: pattern $VAR(@) "^eth[0-9]+$" node.tag と同じディレクトリ階層には tag: と書く ; "interface ethernet $VAR(@): not a valid name"syntax:expression: exec "if [ ! -d /sys/class/net/$VAR(@) ]; then echo "interface ethernet $VAR(@): does not exist"; exit 1; fi"begin: rm -f /tmp/speed-duplex.$VAR(@) if [ -d "/sys/class/net/$VAR(@)" ]; then if [ -n "$VAR(mac/@)" ]; then... (省略) ...
  22. 22. 詳解 CLI 定義ファイルtemplates/interfaces/ethernet/node.def:tag:priority: 318type: txthelp: Ethernet interface nameallowed: /opt/vyatta/sbin/vyatta-interfaces.pl --show=ethernetval_help: <ethN>; Ethernet interface namesyntax:expression: pattern $VAR(@) "^eth[0-9]+$" ; "interface ethernet $VAR(@): not a valid name" commit 時の処理実行の優先度を指定するsyntax:expression: exec "if [ ! -d /sys/class/net/$VAR(@) ]; then echo "interface ethernet $VAR(@): does not exist"; exit 1; fi"begin: rm -f /tmp/speed-duplex.$VAR(@) if [ -d "/sys/class/net/$VAR(@)" ]; then if [ -n "$VAR(mac/@)" ]; then... (省略) ...
  23. 23. 詳解 CLI 定義ファイル アクション一覧 begin commit 開始時 create 新規に設定する時 update 既存の設定値を変更する時 delete 設定を削除する時 end commit 終了時
  24. 24. 詳解 CLI 定義ファイル expression: 書式一覧 pattern pattern $VAR(@) “^br[0-9]+$” exec exec “.../valid_address $VAR(@)” cond $VAR(@) in “enable”, “disable” and $VAR(@) >= 0 && $VAR(@) < 64 or $VAR(@) == “auto” || pattern ...
  25. 25. 詳解 CLI 定義ファイル# set interfaces ethernet eth0 address 192.168.1.1/24/opt/vyatta/config/からの相対 すでにアドレスが設定されている場合はactive/interfaces その値がかかれているactive/interfaces/ethernet まだ設定されていない場合は存在しないactive/interfaces/ethernet/eth0active/interfaces/ethernet/eth0/addressactive/interfaces/ethernet/eth0/address/node.val tmp/new_config_25193/interfacestmp/new_config_25193/interfaces/.modified 新しい値が書かれているtmp/new_config_25193/interfaces/ethernettmp/new_config_25193/interfaces/ethernet/.modifiedtmp/new_config_25193/interfaces/ethernet/eth0tmp/new_config_25193/interfaces/ethernet/eth0/.modifiedtmp/new_config_25193/interfaces/ethernet/eth0/addresstmp/new_config_25193/interfaces/ethernet/eth0/address/.modifiedtmp/new_config_25193/interfaces/ethernet/eth0/address/node.val
  26. 26. 詳解 CLI 定義ファイル#!/usr/bin/perluse lib "/opt/vyatta/share/perl5";use Vyatta::Config;my $config = new Vyatta::Config;@curr = $config->returnValues(interfaces ethernet);@orig = $config->returnOrigValues(interfaces ethernet);print "curr:n";foreach my $v (@curr) { print "t[$v]n";}print "orig:n";foreach my $v (@orig) { print "t[$v]n";} 詳しくは /opt/vyatta/share/perl5/Vyatta/Config.pm を参照…
  27. 27. 実例: MAP 機能の追加• MAP とは?☞ 現在 IETF で標準化が進められている IPv4 サービスを IPv6 インフラの上で提供する為 のプロトコル☞ IPv6 アドレスと Mapping Rule から機械的に IPv4 アドレスを計算する☞ プロバイダ側に NAPT 機能を必要としない☞ http://enog.jp/~masakazu/vyatta/map/  
  28. 28. 実例: MAP 機能の追加• どうやって追加するの?☞ Linux Kernel に手を入れる必要があるので linux-image とネットワーク関連の設定コマ ンドである iproute2 を改造する☞ 改造した iproute2 を実行する為の CLI 定義 ファイルを用意しそれを vyatta-cfg-system に 組み込む☞ ISO イメージを作成しインストールする
  29. 29. 実例: MAP 機能の追加templates/interfaces/map/node.def:tag:priority: 380type: txthelp: MAP interfaceval_help: <mapN>; MAP interface namesyntax:expression: pattern $VAR(@) "^map[0-9]+$" ; "MAP interface must be (map0-map999)"commit:expression: $VAR(./role/) != "" ; "Must configure the tunnel role for $VAR(@)"commit:expression: $VAR(./tunnel-source/) != "" || $VAR(./role/@) == "br"; "Must configure the tunnel tunnel-source for $VAR(@)"commit:expression: $VAR(./br-address/) != "" ; "Must configure the tunnel br-address for $VAR(@)"commit:expression: $VAR(./default-forwarding-mode/) != "" ; "Must configure the tunnel default-forwar... for $VAR(@)"... (続く) ...
  30. 30. 実例: MAP 機能の追加templates/interfaces/map/node.def:... (続き) ...create: if [ -n "$VAR(./tunnel-source/@)" ] ; then TS="tunnel-source $VAR(./tunnel-source/@)" fi if [ -n "$VAR(./default-forwarding-rule/@)" ] ; then DFR="default-forwarding-rule $VAR(./default-forwarding-rule/@)" fi if [ -n "$VAR(./always-napt/@)" ] ; then AN="always-napt $VAR(./always-napt/@)" fi ip map add $VAR(@) role $VAR(./role/@) $TS br-address $VAR(./br-address/@)default-forwarding-mode $VAR(./default-forwarding-mode/@) $DFR $AN ip link set $VAR(@) up || echo "interfaces MAP $VAR(@): error setting MAP interface active"delete: ip link set $VAR(@) down ip map del $VAR(@)
  31. 31. 実例: MAP 機能の追加templates/interfaces/map/node.tag/role/node.def:type: txthelp: Role of this MAP interface [REQUIRED]syntax:expression: $VAR(@) in "br", "ce"; "Must be (br, ce)"allowed: echo br cecreate:expression: "true"update:expression: "false" ; "Role can only be set at MAP creation for$VAR(../@)"val_help: br; Role as BRval_help: ce; Role as CEtemplates/interfaces/map/node.tag/br-address/node.def:type: ipv6netval_help: ipv6net; IPv6 address and prefix lengthhelp: BR IP address/prefix [REQUIRED]syntax:expression: exec "/opt/vyatta/sbin/valid_address $VAR(@)"create:expression: "true"update:expression: "false" ; "BR IP address/prefix can only be set at MAPcreation for $VAR(../@)"
  32. 32. まとめ• Vyatta なら簡単にルータを改造できます• CLI 定義ファイルはそんなに難しくありません• すでに書かれた膨大な数の CLI 定義ファイル があるので参考にしましょう• おもしろい改造をしたら是非 vyatta-users@vyatta-users.jp に教えてください

×