VyOS の基本設定 (DHCP/DNS/NAT/Firewall/その他)
[最終更新] (2019/06/03 00:38:00)
最近の投稿
注目の記事

概要

こちらのページで VirtualBox へのインストール方法を把握した VyOS について、DHCP/DNS/NAT/Firewall 等の基本的な設定方法をまとめます。

設定方法を検証するための構成

VirtualBox のゲスト OS として VyOS 用の VM を二つ用意します。手順はこちらです。

ホスト OS の所属するネットワーク
<--NAT--> eth0 | ゲスト vyos-0001 (VirtualBox) | eth1
<--内部ネットワーク--> eth0 | ゲスト vyos-0002 (VirtualBox)

vyos-0001 は eth0 経由でホスト OS の所属するネットワークから直接 ssh 接続できるようにします。そのための方法は様々ですが、ここでは eth0 に対応するアダプター 1 を VirtualBox の NAT で設定することにします。vyos-0002 はホスト OS の所属するネットワークとは直接通信できず、vyos-0001 を介して通信するようにします。そのために、vyos-0001 の eth1 と vyos-0002 の eth0 は VirtualBox の「内部ネットワーク」として設定します。

vyos-0001

Uploaded Image

vyos-0002

Uploaded Image

DHCP 設定

vyos-0001 を eth1 側の内部ネットワークにおける DHCP サーバとして設定します。

vyos-0001 の eth1 に固定 IP を設定

ネットワークアダプタ 1 に対応する eth0 は「NAT」設定のため、VirtualBox が提供する仮想 DHCP サーバによって IP が自動的に割り当てられます。一方、ネットワークアダプタ 2 に対応する eth1 は「内部ネットワーク」設定のため DHCP が存在しません。vyos-0001 自身を DHCP サーバおよび後述の DNS サーバ、NAT サーバとして機能させる都合上、eth1 には固定 IP を割り当てます。内部ネットワークのアドレスは 192.168.200.0/24 として設定することにします。

vyos-0001

vyos@myhostname# set interfaces ethernet eth1 address 192.168.200.1/24
vyos@myhostname# show interfaces
 ethernet eth0 {
     address dhcp
     duplex auto
     hw-id 08:00:27:8c:9a:7b
     smp_affinity auto
     speed auto
 }
 ethernet eth1 {
+    address 192.168.200.1/24
     hw-id 08:00:27:2f:b1:85
 }
 loopback lo {
 }
vyos@myhostname# commit
vyos@myhostname# save

vyos-0001 の DHCP サービスを有効化

以下のコマンドで vyos-0001 の DHCP サービスを開始します。eth1 側の DHCP サーバとして機能させることを意図しています。DHCP クライアントに対して 192.168.200.100 から 192.168.200.199 の IP を割り当て、ネットワークのデフォルトゲートウェイおよび DNS サーバとして vyos-0001 の IP を返します。

vyos@myhostname# set service dhcp-server shared-network-name MY_SUBNET subnet 192.168.200.0/24
vyos@myhostname# set service dhcp-server shared-network-name MY_SUBNET subnet 192.168.200.0/24 start 192.168.200.100 stop 192.168.200.199
vyos@myhostname# set service dhcp-server shared-network-name MY_SUBNET subnet 192.168.200.0/24 default-router 192.168.200.1
vyos@myhostname# set service dhcp-server shared-network-name MY_SUBNET subnet 192.168.200.0/24 dns-server 192.168.200.1
vyos@myhostname# show service
+dhcp-server {
+    shared-network-name MY_SUBNET {
+        subnet 192.168.200.0/24 {
+            default-router 192.168.200.1
+            dns-server 192.168.200.1
+            start 192.168.200.100 {
+                stop 192.168.200.199
+            }
+        }
+    }
+}
vyos@myhostname# commit
vyos@myhostname# save

eth0 側の DHCP サーバとして機能しないことは以下のコマンドで確認できます。/var/log/messages から DHCP に関するログを切り出して確認できます。

vyos@myhostname:~$ show log dhcp
Jan 25 08:11:18 myhostname dhcpd: No subnet declaration for eth0 (10.0.2.15).
Jan 25 08:11:18 myhostname dhcpd: ** Ignoring requests on eth0.  If this is not what
Jan 25 08:11:18 myhostname dhcpd:    you want, please write a subnet declaration
Jan 25 08:11:18 myhostname dhcpd:    in your dhcpd.conf file for the network segment
Jan 25 08:11:18 myhostname dhcpd:    to which interface eth0 is attached. **

設定ファイルを直接確認してみます。確かに subnet 192.168.200.0 の設定しか存在しません。

vyos@myhostname:~$ cat /opt/vyatta/etc/dhcpd.conf 
# generated by /opt/vyatta/sbin/dhcpd-config.pl

ddns-update-style none;
shared-network MY_SUBNET {
        not authoritative;
        subnet 192.168.200.0 netmask 255.255.255.0 {
                option domain-name-servers 192.168.200.1;
                option routers 192.168.200.1;
                default-lease-time 86400;
                max-lease-time 86400;
                range 192.168.200.100 192.168.200.199;
        }
}

vyos-0002 の eth0 の DHCP 割り当て設定

vyos-0002 の eth0 を DHCP で IP 取得するように設定します。以下の実行例では 192.168.200.100 が割り当てられました。

vyos@vyos# set interfaces ethernet eth0 address dhcp
vyos@vyos# commit
vyos@vyos# run show interfaces ethernet eth0
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:a5:ab:38 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.100/24 brd 192.168.200.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fea5:ab38/64 scope link 
       valid_lft forever preferred_lft forever

    RX:  bytes    packets     errors    dropped    overrun      mcast
         34318        378          0          0          0          0
    TX:  bytes    packets     errors    dropped    carrier collisions
         32084        276          0          0          0          0

vyos@vyos# save

vyos-0001 から vyos-0002 へ SSH するための設定

vyos-0002 における SSH サービス設定を有効にします。

vyos@vyos# set service ssh
vyos@vyos# show service
+ssh {
+    port 22
+}
vyos@vyos# commit
vyos@vyos# save

vyos-0001 から SSH できることを確認します。

vyos@myhostname$ ssh 192.168.200.100
vyos@vyos:~$

vyos-0001 における IP 割り当て状況を確認

vyos-0001

vyos@myhostname:~$ show dhcp server leases 

IP address       Hardware address   Lease expiration     Pool                      Client Name
----------       ----------------   ----------------     ----                      -----------
192.168.200.100  08:00:27:a5:ab:38  2017/03/17 23:22:20  MY_SUBNET                 vyos

vyos@myhostname:~$ show dhcp server statistics 

Pool                      Pool size   # Leased    # Avail
----                      ---------   --------    -------
MY_SUBNET                 100         1           99

vyos-0002

vyos@vyos:~$ show dhcp client leases interface eth0 
interface  : eth0
ip address : 192.168.200.100    [Active]
subnet mask: 255.255.255.0
router     : 192.168.200.1
name server: 192.168.200.1
dhcp server: 192.168.200.1
lease time : 86400
last update: Thu Mar 16 23:22:15 UTC 2017
expiry     : Fri Mar 17 23:22:15 UTC 2017
reason     : RENEW

DHCP による IP の固定割り当て

vyos-0002 の MAC アドレスに対して固定 IP を DHCP で割り当てたい場合は以下のコマンドを実行します。

vyos-0001

vyos@myhostname# set service dhcp-server shared-network-name MY_SUBNET subnet 192.168.200.0/24 static-mapping vyos-0002 ip-address 192.168.200.200
vyos@myhostname# set service dhcp-server shared-network-name MY_SUBNET subnet 192.168.200.0/24 static-mapping vyos-0002 mac-address 08:00:27:a5:ab:38
vyos@myhostname# show service dhcp-server
 disabled false
 shared-network-name MY_SUBNET {
     authoritative disable
     subnet 192.168.200.0/24 {
         default-router 192.168.200.1
         dns-server 192.168.200.1
         lease 86400
         start 192.168.200.100 {
             stop 192.168.200.199
         }
+        static-mapping vyos-0002 {
+            ip-address 192.168.200.200
+            mac-address 08:00:27:a5:ab:38
+        }
     }
 }
vyos@myhostname# commit
vyos@myhostname# save

vyos-0002

vyos@vyos:~$ reboot
vyos@vyos:~$ show dhcp client leases interface eth0 
interface  : eth0
ip address : 192.168.200.200    [Active]
subnet mask: 255.255.255.0
router     : 192.168.200.1
name server: 192.168.200.1
dhcp server: 192.168.200.1
lease time : 86400
last update: Fri Mar 17 04:38:08 UTC 2017
expiry     : Sat Mar 18 04:38:08 UTC 2017
reason     : BOUND

DNS 設定

vyos-0001 を eth1 側の内部ネットワークにおける DNS サーバとして設定します。こちらのページにも記載のとおり DNS には二種類あり、ここでは Authoritative サーバではなく Recursive (Caching) サーバとして設定します。

vyos-0001

vyos@myhostname# set service dns forwarding listen-on eth1
vyos@myhostname# show service 
 dhcp-server {
     disabled false
     shared-network-name MY_SUBNET {
         authoritative disable
         subnet 192.168.200.0/24 {
             default-router 192.168.200.1
             dns-server 192.168.200.1
             lease 86400
             start 192.168.200.100 {
                 stop 192.168.200.199
             }
         }
     }
 }
+dns {
+    forwarding {
+        listen-on eth1
+    }
+}
 ssh {
     port 22
 }
vyos@myhostname# commit
vyos@myhostname# save

vyos-0002 で名前解決できることを確認します。

vyos@vyos:~$ host www.example.com
www.example.com has address 93.184.216.34
www.example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946

NAT 設定

vyos-0001 を NAT サーバとして設定します。複数の NAT rule が存在する場合、番号の小さい rule から順番に適用されます。また、後述の Firewall が原因で通信に失敗することがあるため注意します。

Source NAT (内部から外部へ)

内部から外部向けの通信を開始するために必要な、送信元 NAT (SNAT) の設定を行います。SNAT は IP マスカレードともよばれます。

vyos-0001

vyos@myhostname# set nat source rule 99 translation address masquerade
vyos@myhostname# set nat source rule 99 source address 192.168.200.0/24
vyos@myhostname# set nat source rule 99 outbound-interface eth0
vyos@myhostname# show nat
+source {
+    rule 99 {
+        outbound-interface eth0
+        source {
+            address 192.168.200.0/24
+        }
+        translation {
+            address masquerade
+        }
+    }
+}
vyos@myhostname# commit
vyos@myhostname# save

vyos-0002

vyos@vyos:~$ ping www.example.com
PING www.example.com (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34: icmp_req=1 ttl=61 time=356 ms
64 bytes from 93.184.216.34: icmp_req=2 ttl=61 time=272 ms
64 bytes from 93.184.216.34: icmp_req=3 ttl=61 time=272 ms
...

Destination NAT (外部から内部へ)

外部から内部向けの通信を開始するために必要な、送信先 NAT (DNAT) の設定を行います。今回は eth0 が VirtualBox の DHCP で自動割り当てされています。

vyos-0001

vyos@myhostname# run show interfaces 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             10.0.2.15/24                      u/u
eth1             192.168.200.1/24                  u/u
lo               127.0.0.1/8                       u/u
                 ::1/128

そのため、下記の ★ の設定は省略していますが、固定 IP の場合は設定します。

//vyos@myhostname# set nat destination rule 1 destination address 10.0.2.15 ★
vyos@myhostname# set nat destination rule 1 destination port 10022
vyos@myhostname# set nat destination rule 1 protocol tcp
vyos@myhostname# set nat destination rule 1 translation address 192.168.200.100
vyos@myhostname# set nat destination rule 1 translation port 22
vyos@myhostname# set nat destination rule 1 inbound-interface eth0
vyos@myhostname# show nat
+destination {
+    rule 1 {
+        destination {
+            port 10022
+        }
+        inbound-interface eth0
+        protocol tcp
+        translation {
+            address 192.168.200.100
+            port 22
+        }
+    }
+}
 source {
     rule 99 {
         outbound-interface eth0
         source {
             address 192.168.200.0/24
         }
         translation {
             address masquerade
         }
     }
 }
vyos@myhostname# commit
vyos@myhostname# save

VirtualBox の NAT におけるポートフォワーディングを設定します。


Uploaded ImageUploaded Image

VirtualBox のホスト OS が所属するネットワークから 3333 番で vyos-0002 に直接アクセスできることを確認します。

$ ssh vyos@localhost -p3333
vyos@vyos:~$ 

設定のデバッグ

上記 SNAT および DNAT の両方を設定した場合を特に双方向 NAT とよぶことがあります。複数の rule が存在して設定がうまくいかないときは、以下のコマンドで NAT セッションの情報を確認してデバッグします。

vyos@myhostname:~$ show nat source translations detail
Pre-NAT src          Pre-NAT dst        Post-NAT src         Post-NAT dst
192.168.200.100      93.184.216.34      10.0.2.15            93.184.216.34
  icmp: 192.168.200.100 ==> 10.0.2.15  timeout: 28 use: 1

vyos@myhostname:~$ show nat destination translations detail
Pre-NAT src          Pre-NAT dst        Post-NAT src         Post-NAT dst
10.0.2.2:53487       10.0.2.15:10022    10.0.2.2:53487       192.168.200.100:22
  tcp: 10.0.2.15:10022 ==> 192.168.200.100:22  timeout: 431774 use: 1

Firewall 設定

用語

  • Firewall ルールセットのイーサネットに対する適用方法
    • local 指定した eth から入り、別の eth から出ないパケット (VyOS を宛先とするパケット, iptables の INPUT チェーン)
    • in 指定した eth から入り、別の eth から出るパケット (NAT 変換時などに発生, iptables の FORWARD チェーン)
  • パケットの処理方法
    • accept パケットを受け取る
    • drop パケットを捨てる
    • reject TCP RST を返す

デバッグ方法

現在の設定を確認

vyos@myhostname:~# run show firewall

drop される様子を監視

vyos@myhostname:~# run clear firewall name OUTSIDE-LOCAL counters
vyos@myhostname:~# run clear firewall name OUTSIDE-IN counters
vyos@myhostname:~# run show firewall statistics

設定例

Quick Start Guide を参考にしつつ、ルールセット OUTSIDE-LOCAL および OUTSIDE-IN を vyos-0001 の eth0 に設定します。

local 設定

「ホスト OS が所属するネットワークから vyos-0001 への local 通信」を TCP 22 番のみ許可するようにします。「ホスト OS が所属するネットワークから vyos-0001 を経由する in 通信」の設定は別です。

vyos-0001

vyos@myhostname# set firewall name OUTSIDE-LOCAL default-action drop
vyos@myhostname# set firewall name OUTSIDE-LOCAL rule 10 action accept
vyos@myhostname# set firewall name OUTSIDE-LOCAL rule 10 state established enable
vyos@myhostname# set firewall name OUTSIDE-LOCAL rule 10 state related enable
vyos@myhostname# set firewall name OUTSIDE-LOCAL rule 20 action accept
vyos@myhostname# set firewall name OUTSIDE-LOCAL rule 20 protocol tcp
vyos@myhostname# set firewall name OUTSIDE-LOCAL rule 20 destination port 22
vyos@myhostname# show firewall name
+name OUTSIDE-LOCAL {
+    default-action drop
+    rule 10 {
+        action accept
+        state {
+            established enable
+            related enable
+        }
+    }
+    rule 20 {
+        action accept
+        destination {
+            port 22
+        }
+        protocol tcp
+    }
+}
vyos@myhostname# set interfaces ethernet eth0 firewall local name OUTSIDE-LOCAL
vyos@myhostname# show interfaces ethernet eth0 firewall
+local {
+    name OUTSIDE-LOCAL
+}
vyos@myhostname# commit
vyos@myhostname# save

in 設定

「ホスト OS が所属するネットワークから vyos-0001 を経由する in 通信」を TCP 22 番のみ許可するようにします。vyos-0002 に対する 10022 番の通信の宛先 NAT 変換後は 22 番です。

vyos@myhostname# set firewall name OUTSIDE-IN default-action drop
vyos@myhostname# set firewall name OUTSIDE-IN rule 10 action accept
vyos@myhostname# set firewall name OUTSIDE-IN rule 10 state established enable
vyos@myhostname# set firewall name OUTSIDE-IN rule 10 state related enable
vyos@myhostname# set firewall name OUTSIDE-IN rule 20 action accept
vyos@myhostname# set firewall name OUTSIDE-IN rule 20 protocol tcp
vyos@myhostname# set firewall name OUTSIDE-IN rule 20 destination port 22
vyos@myhostname# show firewall name
+name OUTSIDE-IN {
+    default-action drop
+    rule 10 {
+        action accept
+        state {
+            established enable
+            related enable
+        }
+    }
+    rule 20 {
+        action accept
+        destination {
+            port 22
+        }
+        protocol tcp
+    }
+}
 name OUTSIDE-LOCAL {
     default-action drop
     rule 10 {
         action accept
         state {
             established enable
             related enable
         }
     }
     rule 20 {
         action accept
         destination {
             port 22
         }
         protocol tcp
     }
 }
vyos@myhostname# set interfaces ethernet eth0 firewall in name OUTSIDE-IN
vyos@myhostname# show interfaces ethernet eth0 firewall
+in {
+    name OUTSIDE-IN
+}
 local {
     name OUTSIDE-LOCAL
 }
vyos@myhostname# commit
vyos@myhostname# save

その他の設定

時刻に関する設定

タイムゾーンの設定

既定値は UTC です。必要に応じて JST に変更します。

# show system time-zone
 time-zone UTC
# date
Thu Jan 26 08:05:06 UTC 2017
# set system time-zone Asia/Tokyo
# commit
# save
# show system time-zone
 time-zone Asia/Tokyo
# date
Thu Jan 26 17:07:10 JST 2017

参照する NTP サーバの設定

NTP サーバーの既定値が設定されています。Google Public NTP を追加するには以下のコマンドを実行します。

# set system ntp server time.google.com
# show system ntp
 server 0.pool.ntp.org {
 }
 server 1.pool.ntp.org {
 }
 server 2.pool.ntp.org {
 }
+server time.google.com {
+}
# commit
# save

時刻の同期状況を確認します。

# run show ntp
     remote           local      st poll reach  delay   offset    disp
=======================================================================
=198.60.22.240   10.0.2.15        1   64    1 0.23619  0.002607 0.43311
*121.111.253.121 10.0.2.15        5   64    1 0.12134  0.003877 0.43311
=216.239.35.12   10.0.2.15        2   64    1 0.14035  0.001886 0.43312
=117.102.176.202 10.0.2.15        3   64    1 0.11635  0.001031 0.66150

名前解決に関する設定

この続きが気になる方は

VyOS の基本設定 (DHCP/DNS/NAT/Firewall/その他)

残り文字数は全体の約 12 %
tybot
100 円
関連ページ
    概要 こちらのページで基本的なサービス DHCP/DNS/NAT/Firewall の設定方法を把握した VyOS について、VRRP (Virtual Router Redundancy Protocol) という仕組みを用いて可用性を高めるための設定方法をまとめます。 設定方法を検証するための構成 VirtualBox のゲスト OS として VyOS 用の VM を三つ用意します。手順
    概要 pcap (packet capture) というパケットキャプチャ用APIの実装には、UNIX系のlibpcapとWindowsのWinPcapがあります。これらのライブラリを利用したアプリケーションとしては、UNIX系のtcpdumpとWindowsのWiresharkが有名です。また、スクリプト言語にはlibpcap/WinPcapのラッパーが存在しており、パケットキャプチャアプリケ
    概要 電子工作や製品のプロトタイピング (例『地球規模で遠隔操作できるブルドーザー』) で利用される Raspberry Pi 3 について、こちらのページで構築した環境で Android Things アプリケーションを開発できます。 本ページでは、簡単な例として LED を点灯させるアプリケーションを扱います。より実用的なアプリケーションを開発する際には
    概要 こちらのページでは、特定の LAN に対して各種サービスを提供するための VyOS 設定を把握しました。本ページでは、複数の LAN をつなぐルータとしての設定方法をまとめます。具体的には、スタティックルーティングおよびダイナミックルーティング (RIP/OSPF/BGP) の設定方法を把握します。 設定方法を検証するための構成