VyOS(vyatta Core後継)のFW基本機能を試してみる(NAT/ステートフルFW)

VyattaがBrocade社に買収されて約2年が経ちました。無償版のVyatta Coreがなくなり、その後継としてVyOSがあるのですが、知ってますか?

wikiからの抜粋ですが、

VyOSは、Vyattaから派生したオープンソースのネットワーク・オペレーティング・システムで、ソフトウェアベースのルーティング、ファイアウォールVPNなどの機能を提供します。

ユーザ会もあります。 - http://www.vyos-users.jp

商用のBrocade Vyatta vRouterと機能面での大きな違いは、ざっくり言うとWEB GUIREST APIでしょうか。

Vyatta -> BrocadeについてのOSS側から見た反応の詳細はこちら http://stuff.baturin.org/post/89016735950

今回はFWやインターネットルータの置き換えとして使うであろう基本機能を検証してみました。

  • VyOSインストール
  • VyOSの基本コマンド
  • VyOSでDynamic NATを設定してみる
  • VyOSでStatic NATを設定してみる
  • VyOS ステートフルファイアウォールを設定してみる

BGPはハード依存の性能面の方が気になるので一旦保留です。

VyOSインストール

まず、現時点での安定バージョンは以下の通りです。
Current stable release: VyOS 1.1.0 (Helium)

Downloads: http://mirror.vyos.net/iso/release/1.1.0.
Physical and virtual 64-bit: vyos-1.1.0-amd64.iso
Physical 32-bit: vyos-1.1.0-i586.iso
Virtual 32-bit: vyos-1.1.0-i586-virt.iso

環境に合わせてダウンロードをしてください。

起動は省略しますが、仮想マシンなり物理マシンなり自身の環境に合わせてインストールしてください。

インストール後に実施すること

  • 時刻設定
  • install images
  • インタフェース設定
  • ssh設定

vyos/vyosでログインできます。上記問題なければ、続いてinstall imageコマンドを叩いて対話型の設定、再起動。その後初期コンフィグです。

インストール自体は以下を参考にさせて頂きました。

vyatta』からフォークした『vyos』をインストールして

VyOSの基本コマンド

show configurationで現在のコンフィグレーションを確認します。

vyos@vyos:~$ show configuration
interfaces {
    ethernet eth0 {
        hw-id 00:00:00:00:00:00
    }
    loopback lo {
    }
}
system {
    config-management {
        commit-revisions 20
    }
    console {
        device ttyS0 {
            speed 9600
        }
    }
    login {
        user vyos {
            authentication {
                encrypted-password ****************
            }
            level admin
        }
    }
    ntp {
        server 0.pool.ntp.org {
        }
        server 1.pool.ntp.org {
        }
        server 2.pool.ntp.org {
        }
    }
    package {
        repository community {
            components main
            distribution helium
            url http://packages.vyos.net/vyos
        }
    }
    syslog {
        global {
            facility all {
                level notice
            }
            facility protocols {
                level debug
            }
        }
    }
}

では、設定してみましょう。以下のコマンドでコンフィグレーションモードに入ります。

$ configure

プロンプトが「#」に変わるのでモードが遷移したことを確認できます。

使い方

eth1を追加してみます。事前にOS側で新たに認識済みの状態です。

vyos@vyos# set interfaces ethernet eth1
[edit]

設定はすぐには反映されません。compareで差分を確認し、commit(適用)/save(保存)で完了です。

vyos@vyos# compare
[edit interfaces]
+ethernet eth1 {
+    duplex auto
+    smp_affinity auto
+    speed auto
+}
[edit]
vyos@vyos# commit
[edit]
vyos@vyos# save
Saving configuration to '/config/config.boot'...
Done
  • アドレス設定
vyos@vyos# set interfaces ethernet eth0 address 172.16.100.1/24
[edit]

vyos@vyos# set interfaces ethernet eth1 address 192.168.100.250/24
[edit]
  • ルーティング設定
vyos@vyos# set protocols static route 0.0.0.0/0 next-hop 172.16.100.254 distance '1'
[edit]

eth1をLAN側としてホストをぶら下げてみました。hostのデフォルトGWはVyOSに設定されており、VyOSの172.16.100.0/24をGlobalと読み替えてください。

internet -- VyOS -- host(192.168.100.11)

  • 疎通確認

hostからpingを打ってみます。

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

この状態では当然疎通が取れません。

VyOSでDynamic NATを設定してみる

上記の構成でインターネットに出るために、Dyanamic NAT(IPマスカレード)を設定してみます。

vyos@vyos# set nat source rule 100 outbound-interface 'eth0'
vyos@vyos# set nat source rule 100 source address '192.168.100.0/24'
vyos@vyos# set nat source rule 100 translation address 'masquerade'
  • 疎通確認
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=46 time=40.6 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=46 time=40.5 ms

疎通を確認できました。

VyOSでStatic NATを設定してみる

先ほどのDynamic NATを削除して綺麗な状態にしておきます。コマンドはsetではなくdeleteです。

  • Dyamic NAT削除
vyos@vyos# delete nat source rule 100 
  • HTTPサーバ起動

host側でHTTP Serverを起動します。ポートの変換も確認したいので、8000番で起動します。

python -m SimpleHTTPServer 8000

Static NAT設定

setコマンドの一つ一つは省略しますが、以下の通り新しいルールでNATを設定してみました。sourceとdestinationで、物理ポート・アドレス・TCPポートを設定しています。

172.16.100.2:80 <-> 192.168.100.11:8000の変換です。

nat {
    destination {
        rule 200 {
            description "1-to-1 NAT"
            destination {
                address 172.16.100.2
                port 80
            }
            inbound-interface eth0
            protocol tcp
            translation {
                address 192.168.100.11
                port 8000
            }
        }
    }
    source {
        rule 200 {
            description "1-to-1 NAT"
            outbound-interface eth0
            source {
                address 192.168.100.11
            }
            translation {
                address 172.16.100.202
            }
        }
    }
}

Tips: VyOSのNAT時に出力されるWarning IP address does not exist on the system!の対応

commitする際にWarnningが出力されると思います。

Warning: IP address 172.16.100.2 does not exist on the system!

動作を見てみるとVyOSがNATで使用しているアドレスのARPに応答していませんでした。以下にも記載がありました。

http://forum.vyos.net/archive/index.php?thread-6336.html

Static NATは避けたいので、以下のように複数アドレスを設定して回避しました。setコマンドで追記が可能です。

vyos@vyos# set interfaces ethernet eth0 address 172.16.100.2/24

vyos@vyos# show interfaces
 ethernet eth0 {
     address 172.16.100.1/24
+    address 172.16.100.2/24

動作確認としては、ARPも問題なく無事外部から80番でweb画面を閲覧できました。

VyOS ステートフルファイアウォールを設定してみる

これまでの設定ではfirewallはかかってない状態です。FWのRuleを定義して、Zoneかインタフェースに紐づけます。ここではOUTSIDE-INというRuleを作成してeth0に設定しています。

vyos@vyos# set firewall name OUTSIDE-IN default-action drop
vyos@vyos# set firewall name OUTSIDE-IN rule 10 action accept
vyos@vyos# set firewall name OUTSIDE-IN rule 10 state established enable
vyos@vyos# set firewall name OUTSIDE-IN rule 10 state related enable
vyos@vyos# set firewall name OUTSIDE-IN rule 20 action drop
vyos@vyos# set firewall name OUTSIDE-IN rule 20 state invalid enable
vyos@vyos# set interfaces ethernet eth0 firewall in name OUTSIDE-IN

tips: ステートレスファイアウォールを設定する方法

この2行がポイントです。established enableの名前から分かる通りINSIDE発の通信の折り返しを許可してくれます。

vyos@vyos# set firewall name OUTSIDE-IN rule 10 state established enable
vyos@vyos# set firewall name OUTSIDE-IN rule 10 state related enable

このRuleを適当すると外からはINSIDE発の通信の折り返しか通らなくなりますので、当然先ほどの80番も通らなくなります。

外から通信はすべてdropとしていますが、INSIDEからのWEB通信の折り返しはOKでした。

ということでrule15としてtcp8000番を許可するルールを追加します。

vyos@vyos# set firewall group port-group PORT-TCP-SERVER1 port 8000
vyos@vyos# set firewall name OUTSIDE-IN rule 15 action accept
vyos@vyos# set firewall name OUTSIDE-IN rule 15 destination group port-group PORT-TCP-SERVER1
vyos@vyos# set firewall name OUTSIDE-IN rule 15 protocol tcp
vyos@vyos# set firewall name OUTSIDE-IN rule 15 state new enable
vyos@vyos# set firewall name OUTSIDE-IN rule 15 state established enable
vyos@vyos# set firewall name OUTSIDE-IN rule 15 state related enable

tips: VyOSのNAT処理順序

outsideからの通信では、NATの後にFWルールが適用されるようです。 なので今回は8000番でFWのacceptをしています。

VyOSのFWでFTPを許可してみる

せっかくのステートフルファイアウォールなのでFTPもためしてみます。host側にvsftpdをインストールして確認します。vsftpdはデフォルトがPassiveで動作します。

さっそく以下の通りnatルールを追加します。今回はアドレスのみ変換しています。set interfaceも忘れないようにしてください。

vyos@vyos# show nat
 destination {
     rule 100 {
         description ftp
         destination {
             address 172.16.100.3
         }
         inbound-interface eth0
         source {
         }
         translation {
             address 192.168.100.11
         }
     }
 source {
     rule 100 {
         outbound-interface eth0
         source {
             address 192.168.100.11
         }
         translation {
             address 172.16.100.3
         }
     }

先ほどのfirewallルールに追加するため、port-groupを追加します。

set firewall group port-group PORT-TCP-SERVER1 port 21

結果は貼付けませんが、問題なくセッションを張ってデータもやりとりできました。vsftpdのコンフィグにpasv_enable=NOを追加してactiveモードで動作を確認しましたが、こちらも問題なかったです。

ステートフルファイアウォールの動作も問題なさそうです。


シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。

このエントリーをはてなブックマークに追加

オープンソース・ソフトウェアルータVyatta入門 ――実践ルーティングから仮想化まで (Software Design plus)

オープンソース・ソフトウェアルータVyatta入門 ――実践ルーティングから仮想化まで (Software Design plus)

Vyatta仮想ルータ活用ガイド

Vyatta仮想ルータ活用ガイド