Cuturnの適当日記

徒然なるままに適当に駄文を吐き出しております

vyattaのNAT設定

Juniper社のSRXとSSGしか経験ないのだけれど、仮想アプライアンスファイアウォールをやろう、ついでにOSSで無料の範囲でいいんでねということでvyattaを触った。

で、色々癖があるなぁと思った。Juniper SRXって優秀なインタフェースしてるんだなぁとも。何か、今いち不評そうなイメージですけど。

良い所

  • 無料で使える
  • 有料版との差もほとんどIPSやらとWebGUIと設定同期機能だけ
  • Junosっぽくて使いやすいCLI
  • Junosっぽくありつつ、普通のLinuxサーバとしてがちゃがちゃやっても動く
  • Junosっぽくてコンフィグも割と読みやすい
  • HAクラスタ設定が実に簡単だった

妙だと思った/嫌だと思った所

  • commit時、JUNOSなら検証に失敗したら設定適用しないのにvyattaは部分的でも設定を適用してしまう
  • rollback時、JUNOSと違って何故か再起動を要求する。でもコンフィグをテキストからロードしたときは別に再起動を要求しない。意味がわからない。
  • ファイアウォール設定がいまいちゾーンの設定と離れたところに書かれるのが、何か妙にしっくりこない
  • ファイアウォール設定をゾーン設定と離したせいでアドレスグループの設定もしっくりこない ゾーンとアドレスグループは一体になってるイメージなのだがなぁ
  • 何も考えず作ると「ステートレス」なファイアウォールの動きになって、パケットが行きは通るけど返ってこないという状態になる。ちゃんと戻りのパケットは発行済みセッションは通そう、とかファイアウォールルールに書く必要がある。
  • 1対1NATが無い。 双方向のNATを書こうとすると、そのままソース/宛先両方のNATルールを書かないといけない。さらに、10IPを10IP別のIP帯にマッピングする場合もIP範囲を1つのルールで書くと動的NATになってしまう。よって1対1NATをたくさん書く場合はIP数*2の設定が必要になってしまう。
  • MACアドレスやIP等、HAクラスタ内各機固有の設定を各機ごとに持たせるせいでコンフィグの一斉適用が面倒。

コンフィグ例(クラスタ)

クラスタ設定は、共通部分がこんな感じ。

cluster {
    dead-interval 10000
    group vycl1 {
        auto-failback true
        primary RT01
        secondary RT02
        service 172.31.93.192/24/eth0            ←VIP
        service 172.31.93.128/24/eth0            ←NATするアドレス分だけ記載
        service 172.31.93.129/24/eth0
        service 10.150.0.1/16/eth1               ←VIP
    }
    interface eth1
    keepalive-interval 2000
    monitor-dead-interval 20000
    pre-shared-secret ****************
}

インタフェース設定は各々の設定の中で別々になる。
そこがまたJUNOSと違う。

1号機

interfaces {
    ethernet eth0 {
        address 172.31.93.193/24
        duplex auto
        hw-id 00:50:56:ac:28:e4
        smp_affinity auto
        speed auto
    }
    ethernet eth1 {
        address 10.150.0.2/16
        duplex auto
        hw-id 00:50:56:ac:29:42
        smp_affinity auto
        speed auto
    }
    loopback lo {
    }
}

2号機

interfaces {
    ethernet eth0 {
        address 172.31.93.194/24
        duplex auto
        hw-id 00:50:56:ac:1a:bf
        smp_affinity auto
        speed auto
    }
    ethernet eth1 {
        address 10.150.0.3/16
        duplex auto
        hw-id 00:50:56:ac:11:c2
        smp_affinity auto
        speed auto
    }
    loopback lo {
    }
}

1対1NATの例

nat {
    destination {
        rule 1 {
            destination {
                address 172.31.93.128
            }
            inbound-interface eth0
            translation {
                address 10.150.0.103
            }
        }
        rule 2 {
            destination {
                address 172.31.93.129
            }
            inbound-interface eth0
            translation {
                address 10.150.2.1
            }
        }
    }
    source {
        rule 1 {
            outbound-interface eth0
            source {
                address 10.150.0.103
            }
            translation {
                address 172.31.93.128
            }
        }
        rule 2 {
            outbound-interface eth0
            source {
                address 10.150.2.1
            }
            translation {
                address 172.31.93.129
            }
        }
    }
}