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を使い分けるマルチホーミング構成を作ってみました。

2014-10-13_vyos-logic-network-map.png

  • 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 コマンドで移る事が出来るため、基本的な操作としては下記操作の繰り返しになります。

  1. 設定モードへ移る : configure コマンド
  2. 設定を入力
  3. 設定を反映 : commit コマンド(エラーが表示されなければ設定反映完了)
  4. 設定の永続化 : save コマンド(OSを再起動しても設定を維持する様にファイルに書き出す)
  5. 一般モードへ移る : exit コマンド

vmware-toolsをインストール(open-vm-toolsと入れ替え)

今回の環境はESXi上へセットアップしているため、vmware-toolsの設定を行います。 VyOSでは標準でOSS版のopen-vm-toolsが導入済みですが、今回はこちらを削除した上でESXi付属のvmware-toolsを導入しています。

参考 : Vyattaに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のセットアップ

構成のおさらい

2014-10-13_vyos-logic-network-map-interfaces.png

  • 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'
  • 各インターフェースへポリシールート割り当て

eth1eth2 へポリシールート 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

ファイアウォールのルールを作成

2014-10-13_vyos-logic-network-map-firewallrules.png

ゾーン間のフィルタを定義します。

かなり冗長な記載をしていますが、分かりやすさ重視で記載しています。

※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
    }
}

Comments