Vyatta

Vyatta は大変性能の高いソフトウェアルーターです。オープンソース版が無料で使えます。
更新日 2016-05-29

Vyatta とは

とても高機能なソフトウェアルーターです。簡単に仮想化環境のゲストOS としてインストールできます。
dd if=/dev/zero of=/vm/VyOS.zena.img bs=1M count=3000

virt-install \
 --name VyOS.zena \
 --disk path=/vm/VyOS.zena.img \
 --vcpus 1 \
 --ram 512 \
 --cdrom '/vm/vyos-1.1.7-i586-virt.iso' \
 --network bridge=br0 \
 --network bridge=br1 \
 --network bridge=br2 \
 --os-type linux \
 --os-variant debiansqueeze

仮想環境にインストール

CentOS6.4 x86_64 KVM にゲストOS としてインストールします。オフィシャルサイトから VC6.6R1 64bit 版をダウンロードします。
// Disk
dd if=/dev/zero of=/vm/Vyatta3.img bs=1M count=8000

virt-install \
 --connect qemu:///system \
 --name Vyatta3 \
 --ram 512 \
 --vcpus 1 \
 --disk path=/vm/Vyatta3.img \
 --os-type linux \
 --os-variant debiansqueeze \
 --cdrom '/ddrv/vyatta-livecd-virt_VC6.6R1_i386.iso' \
 --accelerate \
 --network bridge=br0 \
 --network bridge=br2 \
 --keymap ja \
 --hvm \
 --vnc \
 --vncport 5927
インストールメディア起動後にログインし、インストーラーを実行します。
// ユーザー名(vyatta)、パスワード(vyatta)

// インストールを実行
install system

// インストール完了後はシャットダウン
poweroff

NIC の追加

必要に応じてNIC を追加します。仮想環境の設定ファイルにブリッジ接続を追加します。

設定と操作

vyatta ログイン後のコンソールは運用モードです。configure と打ち、設定モードに移行して作業を行います。set、delete コマンドで 設定し、commit で反映します。save で保存しておけば、次回起動時にも適用されます。

設定について

フリー版ではGUI が使えません(残念)。設定はブロックスコープで入れ子構造になってます。 Tabキーで次の候補や入力補完ができます。set, delete を使います。
// 設定モードに移行
configure

// 内容確認(show)
show
show interfaces
show interfaces ethernet
show interfaces ethernet eth0

// 設定(set)
set interfaces ethernet eth0 
set interfaces ethernet eth0 addres 192.168.8.9/24

// 削除(delete)
delete interfaces ethernet eth0 addres 192.168.8.9/24
delete interfaces ethernet eth0 

// 変更を適用
commit

// 保存(ファイルに保存され、再起動時に読み込まれる)
save

// オペレーションモードに戻る
exit

設定ファイルの保存先

以下のファイルに保存されます。直接編集する事はありません。
/opt/vyatta/etc/config/config.boot

初期化及び初期設定

eth0 から始まって無い場合など、再初期化すると治ります。
// 初期設定をロード
load /opt/vyatta/etc/config.boot.default

// パスワード再設定
set system login user vyatta authentication plaintext-password PASSWORD 
set system time-zone Asia/Tokyo

インターフェイスの設定

とりあえずNIC にアドレスを振ります。

NIC にアドレスを振る

set コマンドで設定します。tab キーを押すとヘルプが出ます。入力途中であれば入力補完が出ます。
set interfaces ethernet eth1 address 192.168.23.9/24
IPv6 は以下の方法で設定します。
// ステートレス自動で設定(要再起動?)
set interfaces ethernet eth0 ipv6 disable-forwarding
set interfaces ethernet eth0 ipv6 address autoconf

// 決め打ちの場合
set interfaces ethernet eth1 address 2400:xxxx:yyyy:3300:1111::23:9/64

// プレフィックスのみ指定(インターフェイスID は自動 頻度:低)
set interfaces ethernet eth2 ipv6 address eui64 2400:xxxx:yyyy:3300::/64

SSH を有効化

設定したIP アドレスでSSH 接続を受け付けるようにします。
set service ssh listen-address 192.168.23.9
確認はshow で
show service ssh

インターネットに接続

PPPoE 接続を扱えます。

PPPoE 接続

常時接続になります。eth0 を使って接続します。
set interfaces ethernet eth0 pppoe 0 user-id test@test.net 
set interfaces ethernet eth0 pppoe 0 password PASSWORD 
set interfaces ethernet eth0 pppoe 0 default-route auto
set interfaces ethernet eth0 pppoe 0 name-server auto 
運用モードからshow int を実行してPPPoE とグローバルIP アドレスが確認できれば 接続成功です。DNS は/etc/resolv.conf に自動追記されます。

MTU の指定

LAN のデバイス向けにインターネット接続向けのパケットサイズ(MTU) の指定を行います。必須です。
set policy route PPPOE-IN rule 10 destination address 0.0.0.0/0
set policy route PPPOE-IN rule 10 protocol tcp
set policy route PPPOE-IN rule 10 tcp flags 'SYN,!ACK,!FIN,!RST'
set policy route PPPOE-IN rule 10 set tcp-mss 1414
 
set interfaces ethernet eth1 policy route PPPOE-IN

// 参考URL
// http://speed47.com/adiary/adiary.cgi/0145

IP マスカレードを行う

Vyatta はルーターとして使います。eth0 をPPPOE 接続として使い、eth1 をLAN 内からの リクエスト受付けとします。IP マスカレードを行います。
// Source NAT
set nat source rule 99 outbound-interface pppoe0
set nat source rule 99 translation address masquerade
最後にWebProxy も設定します。これを使わないと、インターネットへのアクセスが極端に遅くなる 症状が出ます(ver6.6時)。広告画像など。DNS のキャッシュでしょうか。

DNS フォワード

eth1 ではDNS リクエストも受付けます。
set service dns forwarding listen-on eth1

ローカルIP アドレスが外に出ないようにする

設定無しではeth1 に届く全てのプライベートIP アドレス宛パケットまでがマスカレードされて外部に 出てしまいます。これは違反なので、適切に除去します。
// ファイアーウォールを定義
set firewall name PPPOE0_OUT default-action accept

set firewall name PPPOE0_OUT rule 1 action reject
set firewall name PPPOE0_OUT rule 1 destination address 10.0.0.0/8

set firewall name PPPOE0_OUT rule 2 action reject
set firewall name PPPOE0_OUT rule 2 destination address 172.16.0.0/12

set firewall name PPPOE0_OUT rule 3 action reject
set firewall name PPPOE0_OUT rule 3 destination address 192.168.0.0/16


// PPPOE 0 を適用
set int eth eth0 pppoe 0 firewall out name PPPOE0_OUT

外からのアクセスを拒否する

インターネットからのアクセスは拒否します。
// ファイアーウォールを定義
set firewall name PPPOE0_IN default-action drop

set firewall name PPPOE0_IN rule 1 action accept
set firewall name PPPOE0_IN rule 1 state established enable

// PPPOE 0 を適用
set int eth eth0 pppoe 0 firewall in name PPPOE0_IN

ESTABLISHED とは

パケットのTCP フラグのACK がセットされている事です。TCP コネクション確立の為の最初のパケットには ACK が含まれません。そこで判定します。

proxy を起動

既にインターネットには繋がっていますが、内蔵のsquid を使って透過的プロキシとする事もできます。
set service webproxy listen-address 192.168.23.9

DHCP サーバー

Vyatta 配下のLAN にIP アドレス及びデフォルトゲートウェイ、DNS を割り振ります。

DHCP server(IPv4)

eth1 に接続する機器にIPv4 を振ります。
// DHCPの振り出し範囲
set service dhcp-server shared-network-name MYNETWORK \
 subnet 192.168.24.0/24 start 192.168.24.150 stop 192.168.24.200

// デフォルトゲートウェイ
set service dhcp-server shared-network-name MYNETWORK \
 subnet 192.168.24.0/24 default-router 192.168.24.9

// DNS
set service dhcp-server shared-network-name MYNETWORK \
 subnet 192.168.24.0/24 dns-server 192.168.24.9

// リース時間
set service dhcp-server shared-network-name MYNETWORK \
 subnet 192.168.24.0/24 lease 86400

DHCPv6 server (IPv6)

IPv6アドレスとDNS サーバー情報を配布するステートフルDHCPv6 とします。デフォルトゲートウェイはまだDHCPv6 で 設定されないので、RA にて取得します。
// eth1 をDNSフォワーダとするので、IPアドレスを決め打ち
set interfaces ethernet eth0 address 2400:xxxx:yyyy:3300::9/64
set interfaces ethernet eth0 ipv6 router-advert prefix 2400:xxxx:yyyy:3300::/64

set interfaces ethernet eth1 address 2400:xxxx:yyyy:3303::9/64
set interfaces ethernet eth1 ipv6 router-advert prefix 2400:xxxx:yyyy:3303::/64
// set interfaces ethernet eth2 ipv6 router-advert send-advert true
// set interfaces ethernet eth2 ipv6 router-advert max-interval 10
// set interfaces ethernet eth2 ipv6 router-advert prefix 2400:xxxx:yyyy:3300::/64
// set interfaces ethernet eth2 ipv6 router-advert default-preference medium

set interfaces ethernet eth1 ipv6 router-advert other-config-flag true
set interfaces ethernet eth1 ipv6 router-advert managed-flag true
DHCPv6-server は下記の3つの設定が無いと実際のIPv6 の配布は行われません。
// 配布アドレスの範囲を指定
set service dhcpv6-server shared-network-name MYNETWORK6 \
 subnet 2400:xxxx:yyyy:3303::/64 address-range \
 start 2400:xxxx:yyyy:3303::100 stop 2400:xxxx:yyyy::200

// ネームサーバーを設定
set service dhcpv6-server shared-network-name MYNETWORK6 \
 subnet 2400:xxxx:yyyy:3303::/64 name-server 2400:xxxx:yyyy:3303::9

// リース時間
set service dhcpv6-server shared-network-name MYNETWORK6 \
 subnet 2400:xxxx:yyyy:3303::/64 lease-time default 86400
LAN 内のパソコンにてIPv6 が割り当てられているか確認します。ping -6 ipv6.google.com が通れば成功です。

通らない場合

IP アドレスが見つからない場合はDNS エラーです。パケットが外に出ていけない場合、一時IPv6 を使ってる可能性があります。

外部に公開する

Web、mail、DNS サーバーなどを公開するにはDNAT を設定します。

ポートフォワードを設定する

pppoe インターフェイスには一つのグローバルIP アドレスなので、 destination address は不要です。ポート番号も変更してないのでtranslation port も不要です。
// ssh(22)
set nat destination rule 22 description ssh
set nat destination rule 22 inbound-interface pppoe0
set nat destination rule 22 protocol tcp
set nat destination rule 22 destination port 22
set nat destination rule 22 translation address 192.168.23.3

// DNS(53)
set nat destination rule 53 description DNS
set nat destination rule 53 inbound-interface pppoe0
set nat destination rule 53 protocol udp
set nat destination rule 53 destination port 53
set nat destination rule 53 translation address 192.168.23.7

// http(80)
set nat destination rule 80 description http
set nat destination rule 80 inbound-interface pppoe0
set nat destination rule 80 protocol tcp
set nat destination rule 80 destination port 80
set nat destination rule 80 translation address 192.168.23.5

// POP3(110)
set nat destination rule 110 description POP3
set nat destination rule 110 inbound-interface pppoe0
set nat destination rule 110 protocol tcp
set nat destination rule 110 destination port 110
set nat destination rule 110 translation address 192.168.23.7

// SMTP(25)
set nat destination rule 25 description SMTP
set nat destination rule 25 inbound-interface pppoe0
set nat destination rule 25 protocol tcp
set nat destination rule 25 destination port 25
set nat destination rule 25 translation address 192.168.23.7

// Message Submission(587) translation SMTP
set nat destination rule 587 description "Message Submission"
set nat destination rule 587 inbound-interface pppoe0
set nat destination rule 587 protocol tcp
set nat destination rule 587 destination port 587
set nat destination rule 587 translation port 25
set nat destination rule 587 translation address 192.168.23.7

// FTP(20)
set nat destination rule 20 description FTP
set nat destination rule 20 inbound-interface pppoe0
set nat destination rule 20 protocol tcp
set nat destination rule 20 destination port ftp
set nat destination rule 20 translation address 192.168.23.5

// FTP-data(21)
set nat destination rule 21 description FTP-data
set nat destination rule 21 inbound-interface pppoe0
set nat destination rule 21 protocol tcp
set nat destination rule 21 destination port 21
set nat destination rule 21 translation address 192.168.23.5

// squid(3128)
set nat destination rule 3128 description squid
set nat destination rule 3128 inbound-interface pppoe0
set nat destination rule 3128 protocol tcp
set nat destination rule 3128 destination port 3128
set nat destination rule 3128 translation address 192.168.23.5

// MySQL(3306)
set nat destination rule 3306 description squid
set nat destination rule 3306 inbound-interface pppoe0
set nat destination rule 3306 protocol tcp
set nat destination rule 3306 destination port 3306
set nat destination rule 3306 translation address 192.168.23.6

// SoftEtherVPN(443)
set nat destination rule 443 description SoftEtherVPN
set nat destination rule 443 inbound-interface pppoe0
set nat destination rule 443 protocol tcp
set nat destination rule 443 destination port 443
set nat destination rule 443 translation address 192.168.24.3

// Web Camera(8920)
set nat destination rule 8920 description WebCamera
set nat destination rule 8920 inbound-interface pppoe0
set nat destination rule 8920 protocol tcp
set nat destination rule 8920 destination port 8920
set nat destination rule 8920 translation port 80
set nat destination rule 8920 translation address 192.168.23.94

ファイアーウォールを設定する

外部からのアクセスは拒否する設定済みなので、ポートを個別に開放設定します。
// ssh(22)
set firewall name PPPOE0_IN rule 22 description ssh
set firewall name PPPOE0_IN rule 22 action accept
set firewall name PPPOE0_IN rule 22 destination port 22
set firewall name PPPOE0_IN rule 22 protocol tcp

// DNS(53)
set firewall name PPPOE0_IN rule 53 description DNS
set firewall name PPPOE0_IN rule 53 action accept
set firewall name PPPOE0_IN rule 53 destination port 53
set firewall name PPPOE0_IN rule 53 protocol udp

// http(80)
set firewall name PPPOE0_IN rule 80 description HTTP
set firewall name PPPOE0_IN rule 80 action accept
set firewall name PPPOE0_IN rule 80 destination port 80
set firewall name PPPOE0_IN rule 80 protocol tcp

// POP3(110)
set firewall name PPPOE0_IN rule 110 description POP3
set firewall name PPPOE0_IN rule 110 action accept
set firewall name PPPOE0_IN rule 110 destination port 110
set firewall name PPPOE0_IN rule 110 protocol tcp

// SMTP(25)
set firewall name PPPOE0_IN rule 25 description SMTP
set firewall name PPPOE0_IN rule 25 action accept
set firewall name PPPOE0_IN rule 25 destination port 25
set firewall name PPPOE0_IN rule 25 protocol tcp

// Message Submission(587) translation SMTP
set firewall name PPPOE0_IN rule 587 description "Message Submission"
set firewall name PPPOE0_IN rule 587 action accept
set firewall name PPPOE0_IN rule 587 destination port 587
set firewall name PPPOE0_IN rule 587 protocol tcp

// FTP(20)
set firewall name PPPOE0_IN rule 20 description FTP
set firewall name PPPOE0_IN rule 20 action accept
set firewall name PPPOE0_IN rule 20 destination port 20
set firewall name PPPOE0_IN rule 20 protocol tcp

// FTP-data(21)
set firewall name PPPOE0_IN rule 21 description FTP-data
set firewall name PPPOE0_IN rule 21 action accept
set firewall name PPPOE0_IN rule 21 destination port 21
set firewall name PPPOE0_IN rule 21 protocol tcp

// squid(3128)
set firewall name PPPOE0_IN rule 3128 description squid
set firewall name PPPOE0_IN rule 3128 action accept
set firewall name PPPOE0_IN rule 3128 source address 219.117.203.86
set firewall name PPPOE0_IN rule 3128 source address 219.117.202.105
set firewall name PPPOE0_IN rule 3128 destination port 3128
set firewall name PPPOE0_IN rule 3128 protocol tcp

// MySQL(3306)
set firewall name PPPOE0_IN rule 3306 description MySQL
set firewall name PPPOE0_IN rule 3306 action accept
set firewall name PPPOE0_IN rule 3306 source address 219.117.203.86
set firewall name PPPOE0_IN rule 3306 source address 219.117.202.105
set firewall name PPPOE0_IN rule 3306 destination port 3306
set firewall name PPPOE0_IN rule 3306 protocol tcp

// MyNetwork(no blocking)
set firewall name PPPOE0_IN rule 9999 description MyNetwork
set firewall name PPPOE0_IN rule 9999 action accept
set firewall name PPPOE0_IN rule 9999 source address 219.117.202.105

// WebCamera
set firewall name PPPOE0_IN rule 8920 description WebCamera
set firewall name PPPOE0_IN rule 8920 action accept
set firewall name PPPOE0_IN rule 8920 destination port 8920
set firewall name PPPOE0_IN rule 8920 protocol tcp

静的ルーティングを行う

LAN 内のPC からデフォルトゲートウェイとして様々なパケットが届きます。内部の別セグメントに転送するのは static ルーティングで行います。

パケットを他所に転送する

192.168.26.0/24 宛のパケットは192.168.23.3(KVM ホストのbridge インターフェイス)に転送します。
set protocols static route 192.168.26.0/24 next-hop 192.168.23.3