VyOS で Policy Based Routing して複数の ISP を使い分ける

はじめに

こんにちは yosida95 です。 先月4月26日の話なのですが、ブログエントリになっていなかったので、今になって書いてみます。

昨年の9月にひとり暮らしを始め てから今まで、 WG1800HP で PPP してゲートウェイとして使ってきました。 しかし、定期的に具合が悪くなり PPP セッションが切れる事、足元には Xeon と Intel NIC を計4ポート積んだサーバーが眠っていてもったいないと感じていた事から、このサーバーを KVM で仮想化して、ソフトウェアルーターである VyOS をそのゲストとして動かすことで、 WG1800HP をタダの WiFi AP として運用することにしました。

今回組んだネットワークのネットワーク図は以下の通りです。
ネットワーク図

ここまでは実家に居たころと変わらず、 2年以上前に前に書いた Vyatta の記事ともほとんど変わらないのですが、自宅では2つの ISP と契約しています。 これを有効活用するため、今回は DMZ からインターネットへ出ていくパケットと、それ以外のネットワークからインターネットへ出て行くパケットのソースを分けることにしました。

設定例

今回の設定をするにあたっていくらか検索してみたのですが、なかなか上手な設定をみつけられず、 if-pre-up などのフックを使って VyOS の世界から抜けてしまっているような例もあったため、必要な部分のみを抜粋したものを参考例としてここに書いておきます。

interfaces {
    ethernet eth0 {
        pppoe 0 {}
        pppoe 1 {}
    }
    ethernet eth1 {
        address 172.16.10.1/24
    }
    ethernet eth2 {
        address 172.16.20.1/24
    }
    ethernet eth3 {
        address 172.16.30.1/24
    }
}
nat {
    source {
        rule 10 {
            outbound-interface pppoe1
            translation {
                address masquerade
            }
        }
        rule 20 {
            outbound-interface pppoe0
            source {
                address 172.16.10.0/24
            }
            translation {
                address masquerade
            }
        }
    }
}
policy {
    route dmz {
        rule 1 {
            set {
                table 1
            }
            source {
                address 172.16.10.0/24
            }
        }
    }
}
protocols {
    static {
        table 1 {
            interface-route 0.0.0.0/0 {
                next-hop-interface pppoe0 {
                }
            }
            interface-route 172.168.20.0/24 {
                next-hop-interface eth2 {
                }
            }
            interface-route 172.168.30.0/24 {
                next-hop-interface eth3 {
                }
            }
        }
    }
}

ポイントは、 policy route dmz で DMZ から出てきたパケットに対して、 protocols static table 1 で定義しているルールをあてている点です。 このルールでは、既知の内部宛てのパケットは適切なインターフェースに、未知のアドレス宛てのパケットはデフォルトで使われる pppoe1 ではなく pppoe0 から出て行くようにルーティングを曲げています。

また、 DMZ でもそうでないネットワークも IP アドレスの数以上に端末が居るため、 nat セクションで NAPT してあげています。

終わりに

遊んでいたサーバーをルーターにして、また MTU などの値を調整したことで、体感できるほどネットワークの品質が高くなり、ルーターが動いているということで24時間サーバーを落とせなくなって体感できるほど電気代が高くなり、このサーバーの排熱によって室温が体感できるほど高くなりました。

サーバーで遊んでいると yosida95VPS を作って運用していた頃のことを思い出し、とても楽しいです。 yosida95VPS は 2012年に PyCon JP で発表して以降も、ゲストとして Ubuntu のパッケージリポジトリミラーを動かしたり、 L2TP/IPSec VPN サーバーが動いていたりと、現役です。

こちらからは以上です。

追記

【2015-05-18 00:36 追記】ソースルーティングとポリシーベースルーティングを混同していたので、タイトルを変えました。