Vyatta Core は VyOS になりました
量販店で売っている様なブロードバンドルータは機能や性能不足、そしてよく落ちる事から、ここ数年ずーっと自宅ルータにVyatta Coreを使ってきました。
Vyatta Coreはデータセンタで使う様なルータと遜色ない機能や性能を持ち、何よりも落ちないのでかなり気に入って使ってきたのですが、Vyatta社がBrocadeへ買収された結果、2013年夏を最後にOSS版の開発は中止されてしまいました。
そんな中、Vyatta Core 6.6 R1から派生する形でVyOSの開発が開始され、有志により精力的にセキュリティやバグ修正、機能追加が行われています。
先日リリースされたVyOS 1.1.0では、L2TPv3サポートやVXLANの実験的実装がされ、今後の開発も期待されます。
自分も、設定をまるまるコピーする形で、とりあえずVyatta CoreからVyOSへ移行していたのですが、今回、自宅ネットワークの構成変更に伴い新しく設定を作り直してみました。
Vyatta Core開発停止からVyOS誕生までの経緯は下記資料がよくまとまっています。
VyOSで作るマルチホーミングな自宅ネットワーク
今回は、Bフレッツ回線で2つのISPを使い分けるマルチホーミング構成を作ってみました。

- ISP A (PPPoE セッション 0)
- 固定IPを割り当て
- DMZへルーティングし、インターネットへの公開サーバのトラフィックを担当
- ISP B (PPPoE セッション 1)
- 動的IPを割り当て
- 宅内プライベートネットワークへルーティングし、宅内機器のインターネットアクセストラフィックを担当
ゾーンポリシーファイアウォールを用いて各ゾーン間のフィルタを行います。
今回の環境は、DMZとプライベートをISPから分離する事で、検証の自由度を高め、インターネットを介した検証も可能とする事を目的としていますが、複数のISPを組み合わせる事でインターネットに対する接続の信頼度を高めたい場合等にも使えるかと思います。
VyOSのインストール
ISOの入手とローカルディスクへのインストール
手順は、vyos-users.jpのユーザーガイドそのままなので参照の事。
今回のインストール先は、ESXi上に構築した仮想マシンで以下の様な構成にセットアップしました。
- CPU : 4vCPU
- メモリ : 4GB
- ディスク : 10GB
- NIC : 3vNIC (Driver vmxnet3)
- ISO : Vvyos-1.1.0-amd64.iso
ISOイメージを仮想マシンにマウント後 install image
コマンドでローカルディスクへインストールし、 reboot
コマンドで再起動します。
「一般モード(Operation Mode)」と「設定モード(Configuration Mode)」
VyOSには 「一般モード(Operation Mode)」 と 「設定モード(Configuration Mode)」 があり、設定の入力は設定モードで実施する必要があります。
一般モード→設定モードへは configure
コマンドで移る事が出来、設定モード→一般モードは exit
コマンドで移る事が出来るため、基本的な操作としては下記操作の繰り返しになります。
- 設定モードへ移る :
configure
コマンド - 設定を入力
- 設定を反映 :
commit
コマンド(エラーが表示されなければ設定反映完了) - 設定の永続化 :
save
コマンド(OSを再起動しても設定を維持する様にファイルに書き出す) - 一般モードへ移る :
exit
コマンド
vmware-toolsをインストール(open-vm-toolsと入れ替え)
今回の環境はESXi上へセットアップしているため、vmware-toolsの設定を行います。
VyOSでは標準でOSS版のopen-vm-toolsが導入済みですが、今回はこちらを削除した上でESXi付属のvmware-toolsを導入しています。
- open-vm-toolsを削除
sudo aptitude remove open-vm-tools open-vm-modules-3.3.8-1-amd64-vyos
- Debianリポジトリを追加
configure
set system package repository squeeze components 'main contrib non-free'
set system package repository squeeze distribution 'squeeze'
set system package repository squeeze url 'http://ftp.jp.debian.org/debian/'
set system package repository squeeze username ''
set system package repository squeeze password ''
set system package repository squeeze/updates components 'main'
set system package repository squeeze/updates distribution 'squeeze/updates'
set system package repository squeeze/updates username ''
set system package repository squeeze/updates password ''
set system package repository squeeze/updates url 'http://security.debian.org/'
commit
save
- vmware-toolsインストールに必要なパッケージの導入
sudo aptitude update
sudo aptitude install build-essential dh-make debhelper devscripts
- vmware-toolsのISOをマウント
vSphere Clinet等でvmware-toolsのISOをマウント
- vmware-toolsをセットアップ
sudo mount /dev/cdrom /mnt
cd /tmp/
cp -pr /mnt/VMwareTools*.tar.gz .
tar zxvf VMwareTools*.tar.gz
cd vmware-tools-distrib
sudo ./vmware-install.pl -d
- 再起動
reboot
VyOSのセットアップ
構成のおさらい

- eth0
- インターネット(パブリック)側出口で、ISP AとISP BのPPPoEセッションを張るインターフェース
- PPPoE 0 : ISP A
- PPPoE 1 : ISP B
- eth1
- DMZ側出口で、ISP Aのトラフィックを公開サーバへ流すインターフェース
- IP帯 :
10.100.20.0/22
- 割当IP :
10.100.20.1
- eth2
- プライベート側出口で、ISP Bのトラフィックを宅内機器へ流すインターフェース
- SSHで入るインターフェース
- IP帯 :
10.100.30.0/22
- 割当IP :
10.100.30.1
インターフェース設定
- eth0 の設定
インターフェースへ pppoe
という名前をつける
set interfaces ethernet eth0 description 'pppoe'
- eth1 の設定
インターフェースへ dmz
という名前を付けて、IP 10.100.20.1/22
を設定
set interfaces ethernet eth1 description 'dmz'
set interfaces ethernet eth1 address '10.100.20.1/22'
- eth2 の設定
インターフェースへ private
という名前を付けて、IP 10.100.30.1/22
を設定
set interfaces ethernet eth2 description 'private'
set interfaces ethernet eth2 address '10.100.30.1/22'
- 設定反映
commit
SSH接続設定
ポート 22
にてSSHサーバを起動
set service ssh port '22'
- 設定反映
commit
管理ユーザを作成
- ユーザの作成
vyosadmin
という名前のユーザを作成
set system login user vyosadmin
- パスワードの設定
vyosadmin
ユーザへパスワード vyosadmin##123
を設定
※平文で入力していますが、パスワードは自動で暗号化(ハッシュ化)されます。
set system login user vyosadmin authentication plaintext-password 'vyosadmin##12345'
- 管理権限の付与
vyosadmin
ユーザへ管理者権限(admin)を付与
set system login user vyosadmin level 'admin'
- vyosユーザ削除
※ vyosadmin
で再ログイン後、vyos
ユーザを削除
delete system login user vyos
- 設定反映
commit
システムの設定
時刻を設定
- 既存NTPサーバの削除
delete system ntp server 0.pool.ntp.org
delete system ntp server 1.pool.ntp.org
delete system ntp server 2.pool.ntp.org
- 国内NTPサーバの追加
mfeedのntpサーバ ntp.jst.mfeed.ad.jp
を追加
set system ntp server 'ntp.jst.mfeed.ad.jp'
- timezoneを修正
timezone Asia/Tokyo
へ変更
set system time-zone 'Asia/Tokyo'
ホスト名を設定
- ホスト名、ドメインを設定
ホスト名 gateway1
、ドメイン foo.bar.hoge.jp
へ設定
set system host-name 'gateway1'
set system domain-name 'foo.bar.hoge.jp'
- 設定反映
commit
PPPoEでISPへ接続
ISP接続設定
- ISP Aへの接続設定
MTU 1414
、接続ユーザ ispa@foo.jp
、接続パスワード hoge
、DNS設定 auto
で設定
set interfaces ethernet eth0 pppoe 0 mtu '1414'
set interfaces ethernet eth0 pppoe 0 user-id 'ispa@foo.jp'
set interfaces ethernet eth0 pppoe 0 password 'hoge'
set interfaces ethernet eth0 pppoe 0 name-server 'auto'
- ISP Bへの接続設定
MTU 1414
、接続ユーザ ispb@bar.net
、接続パスワード hoge
、DNS設定 auto
で設定
set interfaces ethernet eth0 pppoe 1 mtu '1414'
set interfaces ethernet eth0 pppoe 1 user-id 'ispb@bar.net'
set interfaces ethernet eth0 pppoe 1 password 'hoge'
set interfaces ethernet eth0 pppoe 1 name-server 'auto'
フレッツ専用設定(フレッツで一部サイトへ接続出来ない問題の対策)
このままの設定だと一部のサイトにつながらないのでMSSを修正する必要がある
参考 : Vyattaを6.5にアップしたらMTU制限が効かなくなって切り戻した→解決!?
flets
という名称のポリシールートを作成
set policy route flets rule 10 protocol 'tcp'
set policy route flets rule 10 set tcp-mss '1414'
set policy route flets 10 tcp flags 'SYN'
- 各インターフェースへポリシールート割り当て
eth1
と eth2
へポリシールート flets
を割り当てる
set interfaces ethernet eth1 policy route 'flets'
set interfaces ethernet eth2 policy route 'flets'
NAT設定
eth1
用NAT設定
set nat source rule 20 description 'dmz to IPS A'
set nat source rule 20 outbound-interface 'pppoe0'
set nat source rule 20 source address '10.100.20.0/22'
set nat source rule 20 translation address 'masquerade'
eth2
用NAT設定
set nat source rule 30 description 'private to ISP B'
set nat source rule 30 outbound-interface 'pppoe1'
set nat source rule 30 source address '10.100.30.0/22'
set nat source rule 30 translation address 'masquerade'
DHCPサーバ設定
eth1
用DHCPサーバ設定
10.100.20.230
から 10.100.20.250
までを動的払い出し
set service dhcp-server shared-network-name dmz-pool authoritative 'enable'
set service dhcp-server shared-network-name dmz-pool subnet 10.100.20.0/22 default-router '10.100.20.1'
set service dhcp-server shared-network-name dmz-pool subnet 10.100.20.0/22 dns-server '10.100.20.1'
set service dhcp-server shared-network-name dmz-pool subnet 10.100.20.0/22 lease '86400'
set service dhcp-server shared-network-name dmz-pool subnet 10.100.20.0/22 start 10.100.20.230 stop '10.100.20.250'
eth2
用DHCPサーバ設定
10.100.30.230
から 10.100.30.250
までを動的払い出し
set service dhcp-server shared-network-name private-pool authoritative 'enable'
set service dhcp-server shared-network-name private-pool subnet 10.100.30.0/22 default-router '10.100.30.1'
set service dhcp-server shared-network-name private-pool subnet 10.100.30.0/22 dns-server '10.100.30.1'
set service dhcp-server shared-network-name private-pool subnet 10.100.30.0/22 lease '86400'
set service dhcp-server shared-network-name private-pool subnet 10.100.30.0/22 start 10.100.30.230 stop '10.100.30.250'
DNS設定
set service dns forwarding cache-size '5000'
set service dns forwarding listen-on 'eth1'
set service dns forwarding listen-on 'eth2'
set service dns forwarding listen-on 'lo'
set service dns forwarding 'system'
- 設定反映
commit
ファイアウォールのルールを作成

ゾーン間のフィルタを定義します。
かなり冗長な記載をしていますが、分かりやすさ重視で記載しています。
※ZONE: local
はVyOS自体を示す
全体設定
IPv6を使わない設定
set firewall all-ping 'enable'
set firewall broadcast-ping 'disable'
set firewall config-trap 'disable'
set firewall ipv6-receive-redirects 'disable'
set firewall ipv6-src-route 'disable'
set firewall ip-src-route 'disable'
set firewall log-martians 'enable'
set firewall receive-redirects 'disable'
set firewall send-redirects 'enable'
set firewall source-validation 'disable'
set firewall syn-cookies 'enable'
set firewall twa-hazards-protection 'disable'
Publicからのアクセス
- Public→DMZ (public_to_dmz)
establish済みな通信のみ許可
他は拒否
set firewall name public_to_dmz default-action 'drop'
set firewall name public_to_dmz rule 1 action 'accept'
set firewall name public_to_dmz rule 1 protocol 'all'
set firewall name public_to_dmz rule 1 state established 'enable'
set firewall name public_to_dmz rule 1 state related 'enable'
- Public→Private (public_to_private)
establish済みな通信のみ許可
他は拒否
set firewall name public_to_private default-action 'drop'
set firewall name public_to_private rule 1 action 'accept'
set firewall name public_to_private rule 1 protocol 'all'
set firewall name public_to_private rule 1 state established 'enable'
set firewall name public_to_private rule 1 state related 'enable'
- Public→Local (public_to_local)
establish済みな通信のみ許可
他は拒否
set firewall name public_to_local default-action 'drop'
set firewall name public_to_local rule 1 action 'accept'
set firewall name public_to_local rule 1 protocol 'all'
set firewall name public_to_local rule 1 state established 'enable'
set firewall name public_to_local rule 1 state related 'enable'
DMZからのアクセス
- DMZ→Public (dmz_to_public)
全て許可
set firewall name dmz_to_public default-action 'drop'
set firewall name dmz_to_public rule 1 action 'accept'
set firewall name dmz_to_public rule 1 protocol 'all'
- DMZ→Private (dmz_to_private)
全て拒否
set firewall name dmz_to_private default-action 'drop'
- DMZ→Local (dmz_to_local)
全て拒否
set firewall name dmz_to_local default-action 'drop'
Privateからのアクセス
- Private→DMZ (private_to_dmz)
全て拒否
set firewall name private_to_dmz default-action 'drop'
- Private→Public (private_to_public)
全て許可
set firewall name private_to_public default-action 'drop'
set firewall name private_to_public rule 1 action 'accept'
set firewall name private_to_public rule 1 protocol 'all'
- Private→Local (private_to_local)
全て許可
set firewall name private_to_local default-action 'drop'
set firewall name private_to_local rule 1 action 'accept'
set firewall name private_to_local rule 1 protocol 'all'
Localからのアクセス
- Local→DMZ (local_to_dmz)
全て許可
set firewall name local_to_dmz default-action 'drop'
set firewall name local_to_dmz rule 1 action 'accept'
set firewall name local_to_dmz rule 1 protocol 'all'
- Local→Public (local_to_public)
全て許可
set firewall name local_to_public default-action 'drop'
set firewall name local_to_public rule 1 action 'accept'
set firewall name local_to_public rule 1 protocol 'all'
- Local→Private (local_to_private)
全て許可
set firewall name local_to_private default-action 'drop'
set firewall name local_to_private rule 1 action 'accept'
set firewall name local_to_private rule 1 protocol 'all'
- 設定反映
commit
ゾーンを作成(ファイアウォールルールの適用)
Publicゾーン
public
ゾーンを作成し、インターフェース eth0
, pppoe0
, pppoe1
を設定
set zone-policy zone public default-action 'drop'
set zone-policy zone public from dmz firewall name 'dmz_to_public'
set zone-policy zone public from local firewall name 'local_to_public'
set zone-policy zone public from private firewall name 'private_to_public'
set zone-policy zone public interface 'eth0'
set zone-policy zone public interface 'pppoe0'
set zone-policy zone public interface 'pppoe1'
Privateゾーン
private
ゾーンを作成し、インターフェース eth2
を設定
set zone-policy zone private default-action 'drop'
set zone-policy zone private from dmz firewall name 'dmz_to_private'
set zone-policy zone private from local firewall name 'local_to_private'
set zone-policy zone private from public firewall name 'public_to_private'
set zone-policy zone private interface 'eth2'
DMZゾーン
dmz
ゾーンを作成し、インターフェース eth1
を設定
set zone-policy zone dmz default-action 'drop'
set zone-policy zone dmz from local firewall name 'local_to_dmz'
set zone-policy zone dmz from private firewall name 'private_to_dmz'
set zone-policy zone dmz from public firewall name 'public_to_dmz'
set zone-policy zone dmz interface 'eth1'
Localゾーン
local
ゾーンを作成し、local-zone
を設定
set zone-policy zone local default-action 'drop'
set zone-policy zone local from dmz firewall name 'dmz_to_local'
set zone-policy zone local from private firewall name 'private_to_local'
set zone-policy zone local from public firewall name 'public_to_local'
set zone-policy zone local 'local-zone'
- 設定反映
commit
設定完了!
接続確認
- インターネットへのアクセス確認
ping 8.8.8.8
- 各ゾーンへVM等を作成し、IPが動的に付与されるかフィルタが適用されているか確認
設定の永続化
- ファイルへ保存して一般モードへ戻る
設定内容に問題なければ保存、設定内容をファイルへ保存して永続化
save
exit
設定内容一覧
ここまでの設定が全て完了すると下記の様な状態になっているハズ。
# run show configuration
firewall {
all-ping enable
broadcast-ping disable
config-trap disable
ipv6-receive-redirects disable
ipv6-src-route disable
ip-src-route disable
log-martians enable
name dmz_to_local {
default-action drop
}
name dmz_to_private {
default-action drop
}
name dmz_to_public {
default-action drop
rule 1 {
action accept
protocol all
}
}
name local_to_dmz {
default-action drop
rule 1 {
action accept
protocol all
}
}
name local_to_private {
default-action drop
rule 1 {
action accept
protocol all
}
}
name local_to_public {
default-action drop
rule 1 {
action accept
protocol all
}
}
name private_to_dmz {
default-action drop
}
name private_to_local {
default-action drop
rule 1 {
action accept
protocol all
}
}
name private_to_public {
default-action drop
rule 1 {
action accept
protocol all
}
}
name public_to_dmz {
default-action drop
rule 1 {
action accept
protocol all
state {
established enable
related enable
}
}
}
name public_to_local {
default-action drop
rule 1 {
action accept
protocol all
state {
established enable
related enable
}
}
}
name public_to_private {
default-action drop
rule 1 {
action accept
protocol all
state {
established enable
related enable
}
}
}
receive-redirects disable
send-redirects enable
source-validation disable
syn-cookies enable
twa-hazards-protection disable
}
interfaces {
ethernet eth0 {
description pppoe
duplex auto
hw-id 00:50:56:xx:xx:xx
pppoe 0 {
default-route auto
mtu 1414
name-server auto
password ****************
user-id ispa@foo.jp
}
pppoe 1 {
default-route auto
mtu 1414
name-server auto
password ****************
user-id ispb@bar.net
}
smp_affinity auto
speed auto
}
ethernet eth1 {
address 10.100.20.1/22
description dmz
duplex auto
hw-id 00:50:56:xx:xx:xx
policy {
route flets
}
smp_affinity auto
speed auto
}
ethernet eth2 {
address 10.100.30.1/22
description private
duplex auto
hw-id 00:50:56:xx:xx:xx
policy {
route flets
}
smp_affinity auto
speed auto
}
loopback lo {
}
}
nat {
source {
rule 20 {
description "dmz to ISP A"
outbound-interface pppoe0
source {
address 10.100.20.0/22
}
translation {
address masquerade
}
}
rule 30 {
description "private to ISP B"
outbound-interface pppoe1
source {
address 10.100.30.0/22
}
translation {
address masquerade
}
}
}
}
policy {
route flets {
rule 10 {
protocol tcp
set {
tcp-mss 1414
}
tcp {
flags SYN
}
}
}
}
service {
dhcp-server {
disabled false
shared-network-name dmz-pool {
authoritative enable
subnet 10.100.20.0/22 {
default-router 10.100.20.1
dns-server 10.100.20.1
lease 86400
start 10.100.20.230 {
stop 10.100.20.250
}
}
}
shared-network-name private-pool {
authoritative enable
subnet 10.100.30.0/22 {
default-router 10.100.30.1
dns-server 10.100.30.1
lease 86400
start 10.100.30.230 {
stop 10.100.30.250
}
}
}
}
dns {
forwarding {
cache-size 5000
listen-on lo
listen-on eth1
listen-on eth2
system
}
}
ssh {
disable-host-validation
}
}
system {
console {
device ttyS0 {
speed 9600
}
}
domain-name foo.bar.hoge.jp
host-name gateway1
login {
user vyosadmin {
authentication {
encrypted-password ****************
plaintext-password ****************
}
level admin
}
}
name-server 8.8.8.8
name-server 8.8.4.4
ntp {
server ntp.jst.mfeed.ad.jp {
}
}
package {
auto-sync 1
repository community {
components main
distribution helium
password ****************
url http://packages.vyos.net/vyos
username ""
}
repository squeeze {
components "main contrib non-free"
distribution squeeze
password ****************
url http://ftp.jp.debian.org/debian/
username ""
}
repository squeeze/updates {
components main
distribution squeeze/updates
password ****************
url http://security.debian.org/
username ""
}
}
time-zone Asia/Tokyo
}
zone-policy {
zone dmz {
default-action drop
from local {
firewall {
name local_to_dmz
}
}
from private {
firewall {
name private_to_dmz
}
}
from public {
firewall {
name public_to_dmz
}
}
interface eth1
}
zone local {
default-action drop
from dmz {
firewall {
name dmz_to_local
}
}
from private {
firewall {
name private_to_local
}
}
from public {
firewall {
name public_to_local
}
}
local-zone
}
zone private {
default-action drop
from dmz {
firewall {
name dmz_to_private
}
}
from local {
firewall {
name local_to_private
}
}
from public {
firewall {
name public_to_private
}
}
interface eth2
}
zone public {
default-action drop
from dmz {
firewall {
name dmz_to_public
}
}
from local {
firewall {
name local_to_public
}
}
from private {
firewall {
name private_to_public
}
}
interface eth0
interface pppoe0
interface pppoe1
}
}