2016年4月30日土曜日

仮想ネットワークアプライアンス「VyOS」の導入・初期設定をしてみた

先日自宅の検証環境用途としてESXiサーバを構築し、複数台の仮想マシンを作ったのだが、インターネット接続に使用しているセグメントと検証用のセグメントを分離したいと考えていた。

構成として考えているのは以下の様になる。ESXiのvSwitchを使って内部セグメントを作り、1台仮想マシンでルーターを建てて、必要に応じてルーティングできるようにしたい。

   |
   |
  ◎ブロードバンドルーター
   |
   |
--------------------------vSwitch0 192.168.33.0/24 外部セグメント
      |                     |
      | .31          PC/NAS etc
     ◎仮想ルーター
      | .31
      |
--------------------------vSwitch1 192.168.11.0/24 内部セグメント
            |
     検証用サーバ etc

上記を実現するために当初はLinuxで仮想ルーターを作ろうと思っていたのだが、オープンソースで「VyOS」というネットワークアプライアンスOSが存在することがわかったので使ってみることにした。

以下にインストールから初期設定までに実施内容を記載する。

VyOSのインストール

VyOSのインストールはVyOS.jpのユーザーガイドに詳しく記載されているため、そちらを参照。


基本操作

VyOSはよくあるネットワーク機器のような操作性を持っており、通常モードと設定モードの2つがある。ただし、CISCOのOSと異なり特権モードとグローバルコンフィグレーションモードといった違いはない。

現在どちらのモードとなっているかは、プロンプトから見分けることができる。

$ ←通常モード
# ←設定モード

コマンド体系については、確認系のコマンド(show ~)はCISCOライクだが、設定系(set ~)・削除系(delete ~)のコマンド体系はわりと異なる印象。また、TAB補完については、コマンドとその意味が表示されるなど、かなり親切に作られている。

設定投入時は通常以下の流れとなる。

$ configure  ←設定モードに移行
# set ~      ←設定コマンドを投入(削除の場合はdelete ~)
# compare   ←現在の設定と未反映の設定の差異を確認
# commit     ←設定の反映
# save         ←設定の保存
# exit          ←通常モードに戻る
$ show ~    ←設定確認

初期設定

起動直後の状態ではネットワーク設定がされていないので通信ができない。したがって、vSphere Clientの仮想コンソールを利用して初期設定を行う。

◆sshアクセスの有効化
# set service ssh port '22'

◆インターフェースの設定
外側のインターフェースのIP設定
# set interfaces ethernet eth0 address '192.168.33.31/24'
# set interfaces ethernet eth0 description 'OUTSIDE'

内側のインターフェースのIP設定
# set interfaces ethernet eth1 address '192.168.11.31/24'
# set interfaces ethernet eth1 description 'INSIDE'

◆デフォルトゲートウェイ設定
0.0.0.0/0に対するルーティング設定を実施。これがデフォルトゲートウェイと同義になる
# set protocols static route 0.0.0.0/0 next-hop 192.168.33.1 distance '1'

確認
$ show ip route
---------------
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

S>* 0.0.0.0/0 [1/0] via 192.168.33.1, eth0
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.11.0/24 is directly connected, eth1
C>* 192.168.33.0/24 is directly connected, eth0
---------------

◆タイムゾーン設定
# set system time-zone Asia/Tokyo

◆ntp設定
既存のNTP設定をすべて削除
# delete system ntp server 

新たにNTP同期先を設定
# set system ntp server 192.168.33.3

設定を反映して保存
# commit
# save

※反映時に以下メッセージが表示される
---------------
[ system time-zone Asia/Tokyo ]
Stopping enhanced syslogd: rsyslogd.
Starting enhanced syslogd: rsyslogd.

[ system ntp ]
Stopping NTP server: ntpd.
Starting NTP server: ntpd.
---------------

NTPの同期状況の確認
$ show ntp 
     remote           local      st poll reach  delay   offset    disp
=======================================================================
*192.168.33.3    192.168.33.31    2   64    1 0.00014 -0.000208 0.96825

◆コンソールデバイスの削除
仮想マシン環境ではコンソールデバイスが不要であり、ログに以下の様なエラーが10秒毎に出力されてしまうため無効化する。

---------------
Apr  6 17:03:44 vyos001 getty[22165]: ttyS0: tcgetattr: Input/output error
Apr  6 17:03:54 vyos001 getty[22166]: ttyS0: tcgetattr: Input/output error
Apr  6 17:09:05 vyos001 getty[22167]: ttyS0: tcgetattr: Input/output error
Apr  6 17:09:15 vyos001 getty[22169]: ttyS0: tcgetattr: Input/output error
Apr  6 17:09:25 vyos001 getty[22170]: ttyS0: tcgetattr: Input/output error
Apr  6 17:09:35 vyos001 getty[22171]: ttyS0: tcgetattr: Input/output error
---------------

現在の設定を確認
# show system console 
---------------
 device ttyS0 {
     speed 9600
 }
---------------

デバイスを削除
# delete system console device ttyS0 

SourceNAT設定

内部セグメントにいる192.168.11.110の仮想マシンにSourceNATをかけて、インターネット接続をできるように設定してみる。

outbound-interfac(通信が出て行く側のインタフェース)をeth0に設定
# set nat source rule 110 outbound-interface eth0

ソースアドレス(NAT変換対象)を192.168.11.110に設定
# set nat source rule 110 source address '192.168.11.110'

NAT変換後IPアドレスを192.168.33.31(VyOSのeth0のIPアドレス)に設定
# set nat source rule 110 translation address '192.168.33.31'

設定確認
$ show nat source rules
---------------
Disabled rules are not shown
Codes: X - exclude rule, M - masquerade rule

rule    intf              translation
----    ----              -----------
110     eth0              saddr 192.168.11.110 to 192.168.33.31
        proto-all         sport ANY
---------------



Firewall設定

外部セグメントから内部セグメントに対してFirewallによる通信制御を行う。とりあえず、pingと管理通信のみ実施可能になるよう設定する。

内部と外部セグメントのグループを作成
# set firewall group network-group NET-11 network '192.168.11.0/24'
# set firewall group network-group NET-33 network '192.168.33.0/24'

管理通信のポート番号のグループを作成
# set firewall group port-group PORT-MNT port '22'
# set firewall group port-group PORT-MNT port '443'
# set firewall group port-group PORT-MNT port '3389'

OUTSIDE-INというFirewallを作成し、デフォルト拒否に設定
# set firewall name OUTSIDE-IN default-action 'drop'

TCPの確立済み戻り通信の許可
※established:確立済みパケット
※related:確立済みパケットに関連するパケット
# set firewall name OUTSIDE-IN rule 10 action 'accept'
# set firewall name OUTSIDE-IN rule 10 state established 'enable'
# set firewall name OUTSIDE-IN rule 10 state related 'enable'

外部からのecho-requestの許可
# set firewall name OUTSIDE-IN rule 20 action 'accept'
# set firewall name OUTSIDE-IN rule 20 icmp type-name 'echo-request'
# set firewall name OUTSIDE-IN rule 20 protocol 'icmp'

外部からの管理通信の許可
# set firewall name OUTSIDE-IN rule 100 action 'accept'
# set firewall name OUTSIDE-IN rule 100 destination group network-group 'NET-11'
# set firewall name OUTSIDE-IN rule 100 destination group port-group 'PORT-MNT'
# set firewall name OUTSIDE-IN rule 100 protocol 'tcp'

外部インタフェースにFirewallを適用
# set interfaces ethernet eth0 firewall in name 'OUTSIDE-IN'

設定の確認
$ show firewall
---------------
-----------------------------
Rulesets Information
-----------------------------
--------------------------------------------------------------------------------
IPv4 Firewall "OUTSIDE-IN":

 Active on (eth0,IN)

rule  action   proto     packets  bytes
----  ------   -----     -------  -----
10    accept   all       767928   1335923290
  condition - saddr 0.0.0.0/0 daddr 0.0.0.0/0 state RELATED,ESTABLISHED

20    accept   icmp      801      76896
  condition - saddr 0.0.0.0/0 daddr 0.0.0.0/0 icmptype 8

100   accept   tcp       21       1080
  condition - saddr 0.0.0.0/0 daddr 0.0.0.0/0 match-DST-NTWRK-GROUP NET-11 match
              -set PORT-MNT dst

10000 drop     all       307      36694
  condition - saddr 0.0.0.0/0 daddr 0.0.0.0/0
---------------

参考

VyOS.jp


人気の投稿