こちらのページで 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
vyos-0002
vyos-0001 を eth1 側の内部ネットワークにおける DHCP サーバとして設定します。
ネットワークアダプタ 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 サービスを開始します。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 で 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-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
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
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
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
vyos-0001 を NAT サーバとして設定します。複数の NAT rule が存在する場合、番号の小さい rule から順番に適用されます。また、後述の Firewall が原因で通信に失敗することがあるため注意します。
内部から外部向けの通信を開始するために必要な、送信元 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
...
外部から内部向けの通信を開始するために必要な、送信先 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 におけるポートフォワーディングを設定します。
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
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 サーバーの既定値が設定されています。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