Your SlideShare is downloading. ×
Vyatta 改造入門
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Vyatta 改造入門

7,594
views

Published on

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

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

Published in: Technology

0 Comments
20 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,594
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
87
Comments
0
Likes
20
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Transcript

    • 1. Vyatt a Co re 6.4 対応Vyatta 改造入門浅間 正和 @ 有限会社 銀座堂
    • 2. もくじ• Vyatta 改造の流れ• 詳解 CLI 定義ファイル• 実例: MAP 機能の追加
    • 3. Vyatta 改造の流れ Vyatta のソースコードを管理しているサーバ ② ソースコードの入手 ③ ビルド環境の構築 ④ パッケージの準備 ⑤ CLI 定義ファイルの準備 ⑥ ISO イメージの作成 出来た ISO イメージで① ビルド環境の準備 インストール ビルド環境: Debian GNU/Linux 6(Squeeze)/i386 インストールターゲット
    • 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. ソースコードの入手 ※ 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. ビルド環境の構築• 最新情報は build-iso/README に書かれている ので必ず読む• 基本的には Debian のパッケージで構築するが 一部(squashfs-tools 等)は Vyatta 独自パッケージ を用いる• Vyatta のパッケージをインストールした際 Debian のものに置き換わらないよう /etc/pat/ preferences.d 内に Pin を打つ必要がある
    • 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. CLI 定義ファイルの準備 核心なので後ほど詳しく説明します!
    • 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. ちなみに... • 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. 詳解 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. 詳解 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. 詳解 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. 詳解 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. 詳解 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. 詳解 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. 詳解 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. 詳解 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. 詳解 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. 詳解 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. 詳解 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. 詳解 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. 詳解 CLI 定義ファイル アクション一覧 begin commit 開始時 create 新規に設定する時 update 既存の設定値を変更する時 delete 設定を削除する時 end commit 終了時
    • 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. 詳解 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. 詳解 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. 実例: MAP 機能の追加• MAP とは?☞ 現在 IETF で標準化が進められている IPv4 サービスを IPv6 インフラの上で提供する為 のプロトコル☞ IPv6 アドレスと Mapping Rule から機械的に IPv4 アドレスを計算する☞ プロバイダ側に NAPT 機能を必要としない☞ http://enog.jp/~masakazu/vyatta/map/  
    • 28. 実例: MAP 機能の追加• どうやって追加するの?☞ Linux Kernel に手を入れる必要があるので linux-image とネットワーク関連の設定コマ ンドである iproute2 を改造する☞ 改造した iproute2 を実行する為の CLI 定義 ファイルを用意しそれを vyatta-cfg-system に 組み込む☞ ISO イメージを作成しインストールする
    • 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. 実例: 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. 実例: 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. まとめ• Vyatta なら簡単にルータを改造できます• CLI 定義ファイルはそんなに難しくありません• すでに書かれた膨大な数の CLI 定義ファイル があるので参考にしましょう• おもしろい改造をしたら是非 vyatta-users@vyatta-users.jp に教えてください