自宅のネットワーク構成

RTX830 を買ってからだいぶ時間が経ってしまったんですが、最近やっと前に使っていたルーターと入れ替えて常時稼働させました。

入れ替えるまでにやってみたことの一部は記事にまとめています。

locaq.hatenablog.com

locaq.hatenablog.com

記事に書いたこと以外にも色々 RTX830 の機能を試しながら家のネットワーク構成をどうしようか考えてたんですが、一旦決まったので記事にまとめてみます。

構成

家の回線は「フレッツ光ネクスト マンションタイプ」、プロバイダは @nifty で v6 プラスを使っていますが、ネットワークはこんな構成にしました。

f:id:LocaQ:20201207213720p:plain:w800
自宅ネットワーク構成

ルーターは RTX830、L2 スイッチは SWX2210-8G、Wi-Fi AP は 2 台とも BUFFALO の無線 LAN ルーターをアクセスポイントモードで使っています。

そしてマルチプル VLAN で 3 つのネットワークを作っています。

  1. 家用ネットワーク
  2. 仕事用ネットワーク
  3. IoT 用ネットワーク

最初は IoT 用ネットワークは作らないつもりだったんですが、仕事用ネットワークに使おうとした Wi-Fi AP が IPv6 に対応していない?のか IPv6 で通信ができなかったので有線でつなぐことにしました。それで 1 台余ったので、せっかくなので IoT 用のネットワークを作って活用することにしました。

この構成にしたのは他にも次のようなことをしたかったからです。

  1. 家用と仕事用でネットワークを分離する
  2. 家用と仕事用の両方のネットワークの端末で IPv6 通信ができる
  3. IPv4(PPPoE)が必要なときにすぐに使える

家用と仕事用のネットワークを分離する

個人用の PC は寝ているとき以外はほぼ常時起動してますが、物を買うときはある程度調べてから決めますし、プログラミングをするので結構ググります。また、フリーソフトを探して使ったりもします。そうするとたまに怪しい広告(PC が危険な状態ですといってソフトをインストールさせようとするものなど)が表示されるサイトを開いてしまうことがあります。PC にはセキュリティソフトとしてノートンを入れていますが、それでも 100% 安全ということはありません。

そしてコロナの影響で家でリモートワークしてますが、社内ネットワークにアクセスするために VPN でつないで作業することがあります。同じネットワークだと、個人用 PC がウイルスに感染 → 仕事用 PC に感染 → 社内に広がってしまう、という可能性があります。

なのでその可能性を低くするためにネットワークを分離して互いにアクセスできないようにしました。

分離する方法としてはルーターのポートベース VLAN やタグ VLAN を使い、フィルタで互いのアクセスを遮断する方法がありますが、今回は L2 スイッチのマルチプル VLAN 機能を使いました。理由は、

  1. LAN マップを使いたい
  2. ポートベース VLAN / タグ VLAN だと 1 つのネットワークでしか IPv6 通信ができない

という感じです。LAN マップは使えなくても困らないけどせっかくなので使いたい、くらいの理由です。

2 は次の話になります。

家用と仕事用の両方のネットワークの端末で IPv6 通信ができる

最初は家用と仕事用のネットワークをポートベース VLAN で分けていたんですが、仕事用ノート PC の通信が全て IPv4 になっているのに気付きました。

理由を調べると、どうも自分の環境だと IPv6 を 2 つ以上のネットワークで使えないようでした。フレッツの契約でひかり電話ありの場合は IPv6 プレフィックスが /56 なのに対し、光電話なしの場合は /64 になるようなのですが、自分はひかり電話なしの契約なのでプレフィックスは /64、つまりネットワークが 1 つしか割り当てられてませんでした。

なので家用のネットワークにしか IPv6 アドレスが割り当てられておらず、仕事用ネットワークには IPv4 アドレスのみが割り当てられた状態になっていました。

ただ、せっかく IPv6 使える回線なので仕事用ネットワークでも使いたいと思って調べると、マルチプル VLAN ならルーターからすると 1 つのネットワークになり、かつスイッチでポート間の通信を制限できると分かったので、L2 スイッチを買って構成しました。

余談1

ひかり電話ありなら複数 IPv6 ネットワークを RTX830 で作れるのかというと制限があるようです。

RTX810 で VLAN と IPv6 を両立させる方法 | RANDOM.SOFT

コメントでポートベース VLAN ならできたという報告がありますが、タグ VLAN ではそもそも IPv6 が使えないらしいです。

余談2

v6 プラスでは IPv4 で通信するときに MAP-E という技術が使われますが、使えるポート数が通常より限られており、自分の場合は 240 個でした。

単純に考えると全てのネットワークで合計で 240 個の NAT セッションしか作れないことになりますが、RTX830 にはポートセービング IP マスカレードという機能があり、実際には 240 個以上の NAT セッションを作れるようです。

IPv4(PPPoE)が必要なときにすぐに使える

v6 プラスでは IPv4 で使えるポートが制限されているのでオンラインゲームなどによってはうまく通信できないことがあります。私の場合は PS4ボイスチャットが利用できませんでした。

今はオンラインゲームをやってないのでもうあまり重要ではないんですが、必要になったときに調べて設定しても間に合わないかもしれないのですぐに利用できるように設定だけしています。

PS4 に固定 IP アドレスを割り当てるときに、IPv4 over IPv6 でよいときと IPv4(PPPoE)が必要なときで DHCP で割り当てる IP アドレスを変え、その IP アドレスでどちらを使うかを決めるようにしています。(記事の最後のコンフィグのコメントを参照)

ルーターに設定した機能

ルーターには基本的な機能に加えて以下の機能を設定しています。

全部なくても困りはしないのですがせっかくなので設定しています。

QoS は lan2 には Dynamic Traffic Control を設定して動画などで使われる UDP パケットの帯域を多く取りました。

また、lan1 では優先制御で UDP パケットを優先しています。QoS は帯域が広い側から狭い側へパケットを送信するとき効果的なようですがダウンロード時にも設定しています。回線速度測定を実行しながら YouTube で 4K/60FPS の動画を再生しているときに再生が止まりにくくなった気がしたので一応効果あるのか?と思って設定しています。

最後に

業務用ルーターを買って勉強していたら最後には L2 スイッチも買ってしまいましたが、ある程度満足できるネットワーク構成になりました。本当は Wi-Fi AP も 1 つにまとめられるといいんですが、RTX830 がタグ VLAN で IPv6 を使えるようにならないと(そしてひかり電話を契約してタグ VLAN 使える業務用 AP を買わないと)できなさそうなので今はこれでよいかなと思ってます。

また、今回コンフィグを作るために色々ネットワークのことを調べたおかげでネットワークへの苦手意識が結構無くなりました。とくにフィルタの設定を適当にせずできるだけ理解するようにしたおかげか、Linux のファイアーウォールの設定に面倒くささを感じにくくなった気がします。

お金は少しかかりましたが仕事にも役立つ分野なのでいい投資になったと思ってます。

コンフィグ

RTX830 と SWX2210-8G のコンフィグです。

RTX830

# RTX830 Rev.15.02.17 (Fri Jul 10 09:59:21 2020)

#
# ユーザー
#
login password encrypted {{LOGIN_PASSWORD_ANONYMOUS_ENCRYPTED}}
administrator password encrypted {{ADMIN_PASSWORD_ENCRYPTED}}
user attribute connection=serial,telnet,remote,ssh,sftp,http gui-page=dashboard,lan-map,config login-timer=3600

#
# ゲートウェイ
#

# IPv4 パケットは基本 tunnel 1 に、VPN および 特定の端末のみ pp 1 にルーティングする
ip route default gateway tunnel 1 gateway pp 1 filter 401002 401003 401004 401005 401080

#
# WAN
#
description lan2 IPv6
# ひかり電話を利用しないためルーター広告によるプレフィックスを使用する
ipv6 prefix 1 ra-prefix@lan2::/64
ipv6 lan2 secure filter in 601000 601001 601002 600099
ipv6 lan2 secure filter out 601099 dynamic 611000 611001 611002 611003 611004 611005 611006
ipv6 lan2 dhcp service client ir=on

# 侵入検知
ip lan2 intrusion detection in on
ip lan2 intrusion detection in ip on reject=on
ip lan2 intrusion detection in ip-option on reject=on
ip lan2 intrusion detection in fragment on reject=on
ip lan2 intrusion detection in icmp on reject=on
ip lan2 intrusion detection in udp on reject=on
ip lan2 intrusion detection in tcp on reject=on
ip lan2 intrusion detection in ftp on reject=on
ip lan2 intrusion detection in winny on reject=on
ip lan2 intrusion detection in share on reject=on
ip lan2 intrusion detection in default off
ip lan2 intrusion detection out on
ip lan2 intrusion detection out ftp on reject=on
ip lan2 intrusion detection out winny on reject=on
ip lan2 intrusion detection out share on reject=on
ip lan2 intrusion detection out default off

# QoS(Dynamic Traffic Control)
# 動画や音声で使われる UDP の帯域を確保する。
speed lan2 100m
queue lan2 type shaping
queue lan2 default class 2
queue lan2 class property 4 bandwidth=50m,100m
queue lan2 class property 2 bandwidth=1m,100m
queue lan2 class filter list 10 11
# アップロード時にデフォルトの 200 では足りないので増やす
queue lan2 length 2000

#
# IPv4(PPPoE)
#
pp select 1
 description pp IPv4(PPPoE)
 # キープアライブ設定
 pp keepalive interval 30 retry-interval=30 count=12
 # 常時接続するかどうか
 pp always-on on
 # PPPoE を使う LAN インターフェース
 pppoe use lan2
 # PPPoE セッションを自動切断しない
 pppoe auto disconnect off
 # 受け入れる認証方式
 pp auth accept pap chap
 # 送信する認証情報
 pp auth myname {{PP_AUTH_MYNAME}} {{PP_AUTH_PASSWORD}}
 # MRU設定
 # 指定値はルーターが生成した値
 ppp lcp mru on 1454
 # IPアドレスのネゴシエーションをする
 ppp ipcp ipaddress on
 # IPCPのMS拡張オプションを使う
 # dns server のために必要
 ppp ipcp msext on
 # パケットを圧縮しない
 ppp ccp type none

 # 受信方向フィルタの 400000-400003 は後ろの許可するパケットの送信元がプライベートアドレスのパケットを破棄するために必要
 ip pp secure filter in 400000 400001 400002 400003 401000 401001 401002 401003
 ip pp secure filter out 400004 400005 400006 400007 400008 400009 400010 400011 400012 400013 402000 402001 401099 dynamic 411000 411001 411002 411003 411004 411005 411006 411007

 # 侵入検知
 ip pp intrusion detection in on
 ip pp intrusion detection in ip on reject=on
 ip pp intrusion detection in ip-option on reject=on
 ip pp intrusion detection in fragment on reject=on
 ip pp intrusion detection in icmp on reject=on
 ip pp intrusion detection in udp on reject=on
 ip pp intrusion detection in tcp on reject=on
 ip pp intrusion detection in ftp on reject=on
 ip pp intrusion detection in winny on reject=on
 ip pp intrusion detection in share on reject=on
 ip pp intrusion detection in default off
 ip pp intrusion detection out on
 ip pp intrusion detection out ftp on reject=on
 ip pp intrusion detection out winny on reject=on
 ip pp intrusion detection out share on reject=on
 ip pp intrusion detection out default off

 # QoS(Dynamic Traffic Control)
 # 動画や音声で使われる UDP の帯域を確保する。
 queue pp default class 2
 queue pp class filter list 11
 queue pp length 2000

 # ネットボランチ
 netvolante-dns hostname host pp server=1 {{NET_VOLANTE_HOST}}

 # NAT変換の適用設定
 ip pp nat descriptor 2000
 # 相手先を有効にする
 pp enable 1

#
# VPN
#
pp select anonymous
 description pp VPN
 pp bind tunnel2
 pp auth request chap-pap
 pp auth username {{VPN_USER}} {{VPN_PASSWORD}}
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ip pp remote address pool dhcp
 ip pp mtu 1258
 pp enable anonymous

#
# v6 プラス(IPv4 over IPv6)用トンネル
#
tunnel select 1
 description tunnel IPv4(v6プラス)
 # v6プラスでの IPv4 over IPv6 トンネルでは MAP-E を使う
 tunnel encapsulation map-e
 # MTU 設定
 # IPv6 のデフォルトの MTU が 1500, IPv6 ヘッダーが 40 オクテットのため
 ip tunnel mtu 1460

 # 受信方向フィルタの 400000-400003 は後ろの許可するパケットの送信元がプライベートアドレスのパケットを破棄するために必要
 ip tunnel secure filter in 400000 400001 400002 400003 401000 401001
 ip tunnel secure filter out 400004 400005 400006 400007 400008 400009 400010 400011 400012 400013 402000 402001 401099 dynamic 411000 411001 411002 411003 411004 411005 411006 411007

 # 侵入検知
 ip tunnel intrusion detection in on
 ip tunnel intrusion detection in ip on reject=on
 ip tunnel intrusion detection in ip-option on reject=on
 ip tunnel intrusion detection in fragment on reject=on
 ip tunnel intrusion detection in icmp on reject=on
 ip tunnel intrusion detection in udp on reject=on
 ip tunnel intrusion detection in tcp on reject=on
 ip tunnel intrusion detection in ftp on reject=on
 ip tunnel intrusion detection in winny on reject=on
 ip tunnel intrusion detection in share on reject=on
 ip tunnel intrusion detection in default off
 ip tunnel intrusion detection out on
 ip tunnel intrusion detection out ftp on reject=on
 ip tunnel intrusion detection out winny on reject=on
 ip tunnel intrusion detection out share on reject=on
 ip tunnel intrusion detection out default off

 # QoS
 queue tunnel class filter list 11

 # NAT 変換の適用設定
 ip tunnel nat descriptor 1000
 # トンネルを有効にする
 tunnel enable 1

#
# VPN 用トンネル
#
tunnel select 2
 description tunnel VPN
 tunnel encapsulation l2tp
 ipsec tunnel 102
 ipsec sa policy 102 1 esp aes-cbc sha-hmac
 ipsec ike keepalive use 1 off
 ipsec ike local address 1 192.168.3.1
 ipsec ike nat-traversal 1 on
 ipsec ike pre-shared-key 1 text {{VPN_PRE_SHARED_KEY}}
 ipsec ike remote address 1 any
 l2tp tunnel disconnect time off
 # Pixel3 は L2TP キープアライブに対応していないらしいので無効にする
 l2tp keepalive use off
 l2tp keepalive log on
 l2tp syslog on
 ip tunnel tcp mss limit auto
 tunnel enable 2

#
# LAN
#
ip lan1 address 192.168.3.1/24

# LAN1 の IP アドレス
# LAN2 のプレフィックスに ::1 を付け足した IP アドレスとする
ipv6 lan1 address ra-prefix@lan2::1/64

# LAN1 にルーター広告を送信する
# オプション情報をホストに自動的に取得させる
ipv6 lan1 rtadv send 1 o_flag=on

ipv6 lan1 dhcp service server

# L2SW でマルチプル VLAN を構成してネットワークを分割するため不要なポートは無効化する
lan shutdown lan1 2 3 4

#
# LAN 側 QoS(優先制御)
# 動画や音声で使われる UDP を最優先する。
#
speed lan1 1000m
queue lan1 type priority
queue lan1 default class 2
queue lan1 class filter list 10 11

#
# フィルターの設定
# UDP, FTP, DNSなどは静的フィルタではなく動的フィルタを用いる
#
# [フィルタ番号体系]
# 各桁の意味は以下の通り
#
#   4xxxxx: IPv4
#   6xxxxx: IPv6
#   x0xxxx: static
#   x1xxxx: dynamic
#   xx00xx: reject
#   xx10xx: pass
#   xx20xx: restrict

# IPスプーフィング/LAND/Smurf攻撃への対策
# WAN側から入ってくるパケットの送信元がプライベートアドレスのものを破棄する
# 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16はプライベートネットワークアドレス
ip filter 400000 reject 10.0.0.0/8 * * * *
ip filter 400001 reject 172.16.0.0/12 * * * *
ip filter 400002 reject 192.168.0.0/16 * * * *
ip filter 400003 reject 192.168.3.0/24 * * * *
# WAN側に出ていくパケットの送信先がプライベートアドレスのものを破棄する
ip filter 400004 reject * 10.0.0.0/8 * * *
ip filter 400005 reject * 172.16.0.0/12 * * *
ip filter 400006 reject * 192.168.0.0/16 * * *
ip filter 400007 reject * 192.168.3.0/24 * * *

# RPCで使われるポートを拒否
# WAN側からのアクセス/WAN側へのアクセスは不要
ip filter 400008 reject * * udp,tcp 135 *
ip filter 400009 reject * * udp,tcp * 135

# Windowsのファイル共有で使われるNetBIOS関連を拒否
# WAN側からのアクセス/WAN側へのアクセスは不要
ip filter 400010 reject * * udp,tcp netbios_ns-netbios_ssn *
ip filter 400011 reject * * udp,tcp * netbios_ns-netbios_ssn

# Windowsのダイレクト・ホスティングSMBサービス関連を拒否
# WAN側からのアクセス/WAN側へのアクセスは不要
ip filter 400012 reject * * udp,tcp 445 *
ip filter 400013 reject * * udp,tcp * 445

ip filter 400099 reject * * * * *

# ICMPパケットを通す
# LANからWANへ送信したICMPパケットの応答を通すために必要
ip filter 401000 pass * 192.168.3.0/24 icmp * *

# メールサーバーからの認証パケットを許可する
ip filter 401001 pass * 192.168.3.0/24 tcp * ident

# VPN 用パケットを通す
ip filter 401002 pass * 192.168.3.1 esp * *
ip filter 401003 pass * 192.168.3.1 udp * 500,4500,1701
ip filter 401004 pass 192.168.3.1 * esp * *
ip filter 401005 pass 192.168.3.1 * udp 500,4500,1701 *

# ゲートウェイ用
ip filter 401080 pass 192.168.3.182 * * * *

ip filter 401099 pass * * * * *

# 特定のパケットは回線がアップ状態のときのみ通す
# 回線が切断されているときにこのパケットを送信すると回線が接続されてしまうが、
# 通信の終了を表すものなので接続する必要がない。
ip filter 402000 restrict * * tcpfin * www,21,nntp
ip filter 402001 restrict * * tcprst * www,21,nntp

# 全て許可(回線接続時)
ip filter 402099 restrict * * * * *

# 各種プロトコルのLAN->WANをトリガーとした通信を動的に許可
ip filter dynamic 411000 * * ftp
ip filter dynamic 411001 * * domain
ip filter dynamic 411002 * * www
ip filter dynamic 411003 * * smtp
ip filter dynamic 411004 * * pop3
ip filter dynamic 411005 * * submission
ip filter dynamic 411006 * * tcp
ip filter dynamic 411007 * * udp

ipv6 filter 600099 reject * * * * *

# ICMPv6 のパケットを許可する
# IPv6 では ICMP を使ってエラー通知やアドレス解決(近隣探索)などを行うため許可する必要がある
ipv6 filter 601000 pass * * icmp6 * *
# IP プロトコル番号 4 は IP in IP を表し、IPv4 over IPv6 のために必要
ipv6 filter 601001 pass * * 4
# UDP の 546 ポートは DHCP クライアントが使用するポート
ipv6 filter 601002 pass * * udp * 546
ipv6 filter 601099 pass * * * * *

ipv6 filter dynamic 611000 * * ftp
ipv6 filter dynamic 611001 * * domain
ipv6 filter dynamic 611002 * * www
ipv6 filter dynamic 611003 * * smtp
ipv6 filter dynamic 611004 * * pop3
ipv6 filter dynamic 611005 * * tcp
ipv6 filter dynamic 611006 * * udp

#
# QoS
#
queue class filter 10 4 ipv6 * * udp * *
queue class filter 11 4 ip * * udp * *

#
# IPSec
#
ipsec transport 1 102 udp 1701
ipsec auto refresh on
l2tp service on

#
# DNSサーバー設定
#

# DNSサーバーへのアクセスを許可するホスト
dns host lan1

# 名前解決時に IPv6 を優先する
dns service fallback on

# LAN2 の DHCP サーバーから取得した DNS サーバーに対して問い合わせをする
dns server dhcp lan2

# DNS問い合わせ先サーバーとそのサーバーを選択する条件
#   pp 1: pp 1 から通知されたサーバーを問い合わせ先とする
#   any .: 全てのタイプ、全てのドメインに対する問い合わせ
#   restrict pp 1: pp 1 がアップしていることも条件に追加する
dns server select 402099 pp 1 any . restrict pp 1

# プライベートアドレスに対する問い合わせを上位サーバーに転送しない
dns private address spoof on

#
# NATの設定
#

nat descriptor type 1000 masquerade
nat descriptor address outer 1000 map-e

# 静的NAT変換/IPマスカレード変換を行うNATディスクリプタ
# PPPoEではWAN側に1つIPアドレスが割り振られるが、複数の端末が接続するため
# IPマスカレード変換が必要
nat descriptor type 2000 masquerade
nat descriptor address outer 2000 ipcp
nat descriptor address inner 2000 auto
nat descriptor masquerade static 2000 1 192.168.3.1 esp
nat descriptor masquerade static 2000 2 192.168.3.1 udp 500
nat descriptor masquerade static 2000 3 192.168.3.1 udp 4500
nat descriptor masquerade static 2000 4 192.168.3.1 udp 1701

#
# DHCPサーバー設定
#

# DHCPサーバーとして動作する
dhcp service server

# DHCPサーバーが応答を返さない場合でも一部のPCが正しく動作するようにする
dhcp server rfc2131 compliant except remain-silent

# LAN1に対してDHCPサーバーが割り当てるIPアドレスの範囲
dhcp scope 1 192.168.3.2-192.168.3.254/24 gateway 192.168.3.1
dhcp scope option 1 router=192.168.3.1 dns=192.168.3.1 ntp_server=192.168.3.1
# IPv4(PPPoE) に接続する端末の IP アドレスを固定する
# 普段は pp 1 を使わず、使うときのに以下のコマンドを実行して 192.168.3.182 を割り当てる
# (02:FF:FF:FF:FF:FF はローカルアドレス)
#
#   no dhcp scope bind 1 192.168.3.181 ethernet F8:46:1C:53:EA:05
#   no dhcp scope bind 1 192.168.3.182 ethernet 02:FF:FF:FF:FF:FF
#   dhcp scope bind 1 192.168.3.181 ethernet 02:FF:FF:FF:FF:FF
#   dhcp scope bind 1 192.168.3.182 ethernet F8:46:1C:53:EA:05
#
# 戻すときは以下のコマンドを実行する
#
#   no dhcp scope bind 1 192.168.3.181 ethernet 02:FF:FF:FF:FF:FF
#   no dhcp scope bind 1 192.168.3.182 ethernet F8:46:1C:53:EA:05
#   dhcp scope bind 1 192.168.3.181 ethernet F8:46:1C:53:EA:05
#   dhcp scope bind 1 192.168.3.182 ethernet 02:FF:FF:FF:FF:FF
dhcp scope bind 1 192.168.3.181 ethernet F8:46:1C:53:EA:05
dhcp scope bind 1 192.168.3.182 ethernet 02:FF:FF:FF:FF:FF

# 無線LANアクセスポイントに固定IPアドレス割り当て
# 管理画面にアクセスするために必要
dhcp scope bind 1 192.168.3.191 ethernet 34:3D:C4:B4:B5:3E
dhcp scope bind 1 192.168.3.192 ethernet CC:E1:D5:C8:26:38
# L2SWに固定IPアドレス割り当て
# 管理画面にアクセスするために必要
# L2SWがClient-Identifierを発行しないため"ethernet"はつけない
dhcp scope bind 1 192.168.3.201 AC:44:F2:87:72:53

#
# NTP
#
sntpd service on
sntpd host lan1
schedule at 1 */* 05:00 * ntpdate ntp.nict.jp syslog
# 起動すると2秒ほどずれているので起動時に同期する
schedule at 2 startup * ntpdate ntp.nict.jp syslog

#
# その他サーバー
#

# TELNETサーバーへアクセスできるホストの設定
telnetd host lan1

# TFTPサーバーへアクセスできるホストの設定
tftp host lan1

#
# Switch
#

# L2MS を使う
switch control use lan1 on terminal=on

#
# 本体
#

# ログインタイマー
login timer 1800
# 起動時にアラームを鳴らす
alarm startup on
# トラフィック量の統計機能をON
statistics cpu on
statistics memory on
statistics traffic on
statistics flow on
statistics nat on
statistics route on
statistics filter on
statistics application on
# コンソールの文字コード
console character ja.utf8
# コンソールの表示行数
console lines infinity

SWX2210-8G

!
password-encryption enable
!
enable password {{ADMIN_PASSWORD}}
password {{LOGIN_PASSWORD_ANONYMOUS}}
!
dns-client enable
!
loop-detect enable
!
flowcontrol enable
!
interface port1.1
 eee enable
 switchport mode access
 switchport multiple-vlan group 1
 no shutdown
!
interface port1.2
 eee enable
 switchport mode access
 switchport multiple-vlan group 1
 switchport multiple-vlan group 2
 switchport multiple-vlan group 3
 switchport multiple-vlan group 4
 no shutdown
!
interface port1.3
 eee enable
 switchport mode access
 switchport multiple-vlan group 1
 no shutdown
!
interface port1.4
 eee enable
 switchport mode access
 switchport multiple-vlan group 2
 no shutdown
!
interface port1.5
 eee enable
 switchport mode access
 switchport multiple-vlan group 1
 no shutdown
!
interface port1.6
 eee enable
 switchport mode access
 switchport multiple-vlan group 3
 no shutdown
!
interface port1.7
 eee enable
 switchport mode access
 switchport multiple-vlan group 1
 no shutdown
!
interface port1.8
 eee enable
 switchport mode access
 switchport multiple-vlan group 4
 no shutdown
!
interface vlan1
 ip address dhcp
!
clock timezone JST
!
ntpdate server name ntp.nict.jp
ntpdate interval 24
!
http-server enable
http-server secure enable
http-server login-timeout 30
!
telnet-server enable
!
tftp-server enable 69
!
end

RTX830でv6プラス + IPv4(PPPoE)を構成する

前回の記事から少し経ってしまいましたが、今度は v6 プラスでも接続できるようにしました。

locaq.hatenablog.com

構成

v6 プラスでの接続に加えて IPv4(PPPoE)での接続も作成します。 また、ポートベース VLAN を作成して接続するポートによって使い分けます。

  • VLAN1(ポート:1~3)
  • VLAN2(ポート:4)

基本的に IPv6, IPv4 over IPv6 を使います。

PPPoE の方は普段は使わず、PS4ボイスチャットするときにすぐに使えるように用意しておきます。 (なので PS4 も普段は VLAN1 側のポートに接続しています。)

参考情報

設定する前に以下の書籍で v6 プラスについて勉強しました。1,000 円ですが、リンク先に無料版への案内もあります。

徹底解説 v6プラス(電子書籍のみ)– 技術書出版と販売のラムダノート

また、Kindle 版もあります。私はこちらを買いました。

徹底解説v6プラス | 日本ネットワークイネイブラー株式会社 監修, 小川晃通, 久保田聡 | 工学 | Kindleストア | Amazon

まったく分からない状態よりも少しでも理解していた方が設定もやりやすいのでおすすめです。

コマンド

前回と同様に、v6 プラスのために必要なコマンドの意味を分かる範囲で載せていきます。 また、記事の最後にコンフィグ全体を載せています。

できるだけ正確に書くようにしてますが、ネットワークには疎いので間違ってる可能性もあるのでそこはご了承ください。

WAN 側の設定

ipv6 prefix 1 ra-prefix@lan2::/64

v6 プラスでは IPv6 アドレスの割り当て方法がフレッツとの契約の種類によって 2 種類あるようです。

  1. RA(Router Advertisement, ルータ広告)
  2. DHCPv6-PD(DHCPv6-Prefix Delegation)

私はひかり電話契約をしていないので 1 の方法を使います。

このコマンドで、lan2 ではルータ広告を使った方法でアドレスを割り当てる、と定義します。

ipv6 lan2 secure filter in 100030 100031 100038 100039
ipv6 lan2 secure filter out 100099 dynamic 100080 100081 100082 100083 100084 100098 100099

WAN 側のフィルタ設定です。各 ID のフィルタは後述します。

ipv6 lan2 dhcp service client ir=on

WAN 側の DHCPv6 の動作の設定です。クライアントとして動作するようにします。 また ir=on を指定して Inform-Request を送信するように設定する必要があるようです。

トンネル(IPv4 over IPv6)の設定

v6 プラスで IPv4 通信を行うときは IPv6 パケットのペイロードIPv4 パケットを載せて行うのでトンネルを作成します。

tunnel select 1

使うトンネルの番号の指定。以降の設定はこの 1 番のトンネルに対して行われます。

tunnel encapsulation map-e

トンネルのインターフェースの種類の指定。v6 プラスは MAP-E を使うので map-e を指定します。

ip tunnel mtu 1460

トンネルの MTU の値。Web GUI で設定したらこの値になったのでなぜこの値なのか分かってませんが。

追記ツイッターで教えてもらって分かりました。

まず ipv6 interface mtu コマンドのリファレンスを見ると MTU の初期値が 1500 です。コンフィグでとくに指定していないのでこの値が IPv6 通信で使われます。 そして IPv6 パケットのヘッダー長は固定で 40 オクテットなので、カプセル化された IPv4 通信の MTU には 1500 - 40 = 1460 オクテットを指定する、ということでした。

ip tunnel secure filter in 200000 200001 200002 300003 200020 200021 200022 200023 200024 200025 300030 300032
ip tunnel secure filter out 200010 200011 200012 300013 200020 200021 200022 200023 200024 200025 200026 200027 200099 dynamic 200080 200081 200082 200083 200084 200085 200098 200099

トンネルのフィルタ設定。IPv4(PPPoE)と共通ですがネットワークが異なるので、ネットワークだけ変えたフィルタを作成して指定しています。(3000xx)

 ip tunnel nat descriptor 1000

このトンネルで使う NAT ディスクリプタの指定。

 tunnel enable 1

トンネルの有効化。

LAN 側の設定

lan type lan1 port-based-option=divide-network
vlan port mapping lan1.1 vlan1
vlan port mapping lan1.2 vlan1
vlan port mapping lan1.3 vlan1
vlan port mapping lan1.4 vlan2

ポートベース VLAN の構成。ポート 1 ~ 3 を vlan1 、4 を vlan2 にしています。vlan2 が IPv4(PPPoE)用です。

ip route default gateway tunnel 1 gateway pp 1 filter 1
ip filter 1 pass 192.168.0.0/24 * * * *

IPv4 パケットをトンネル経由にするか PPPoE 経由にするかの設定。後で出てきますが、192.168.0.0/24 は vlan2 のネットワークです。

ip vlan1 address 192.168.3.1/24
ipv6 vlan1 address ra-prefix@lan2::1/64

vlan1 の設定。IPv4 アドレスは 192.168.3.1/24 、IPv6 アドレスは lan2 に割り当てられたプレフィックスに ::1 を付けたものを指定します。

ipv6 vlan1 rtadv send 1 o_flag=on

vlan1 に対するルータ広告の送信制御の設定。o_flag=on を指定する必要があるようです。

ip vlan2 address 192.168.0.1/24

vlan2 の設定。vlan2 の設定はインターフェース名と IP アドレスが変わっただけで前回の記事の設定と同様です。

フィルタ

IPv4 関連のフィルタは前回記事と同様なので、IPv6 関連のみ載せます。

ipv6 filter 100030 pass * * icmp6 * *
ipv6 filter 100031 pass * * 4
ipv6 filter 100038 pass * * udp * 546
ipv6 filter 100039 reject * *
ipv6 filter 100099 pass * * * * *
ipv6 filter dynamic 100080 * * ftp
ipv6 filter dynamic 100081 * * domain
ipv6 filter dynamic 100082 * * www
ipv6 filter dynamic 100083 * * smtp
ipv6 filter dynamic 100084 * * pop3
ipv6 filter dynamic 100098 * * tcp
ipv6 filter dynamic 100099 * * udp

IPv6用のフィルタ。このフィルタについてはルータが生成したものをそのまま使ってます。

100030 の icmp6 は ICMPv6 のパケットを通すものです。ICMPv6 は IPv6 通信で重要な役割を担っているらしいです。 また、UDP の 546 番ポートは DHCPv6 クライアントが使うポートのようです。

100031 は調べてみましたがよく分かりませんでした。 mnemonic Table を見ると ICMP 関係のようなので、ICMPv6 関係と予想しましたが、100030 と別に必要な理由が不明です。 追記:こちらもツイッターで教えてもらって分かりました。 4 はIP のプロトコル番号の 4 番のことで、IPv4 over IPv6 を使うのでそれの受信を許可するフィルタでした。

また、動的フィルタについては IPv4 と同様です。

その他

dns service fallback on

DNS の問い合わせで IPv6 を優先させる設定。off だと機能毎に IPv4/IPv6 のどちらを優先するのかがバラバラのようなので統一させます。

dns server dhcp lan2

DNS サーバーのアドレスをどのインターフェースを使って取得するかの設定。DNS サーバーはサービス側が用意しているものを使うので、DHCP を使って取得します。

nat descriptor type 1000 masquerade
nat descriptor address outer 1000 map-e

トンネル(IPv4 over IPv6)のトンネル用の NAT の設定。外側の IP アドレスはサービス側から MAP-E で指定されるので、それ用の設定をします。

# VLAN1に対してDHCPサーバーが割り当てるIPアドレスの範囲
dhcp scope 1 192.168.3.2-192.168.3.191/24 gateway 192.168.3.1
dhcp scope option 1 router=192.168.3.1 dns=192.168.3.1
dhcp scope bind 1 192.168.3.191 ethernet 34:3D:C4:B4:B5:3E
ipv6 vlan1 dhcp service server

vlan1 の DHCP サーバーの設定。 割り当てに使える IP アドレスの範囲指定と、ルータ、DNS サーバーのアドレスを vlan1 の IP アドレスの指定をします。 また、無線 LAN アクセスポイント(AP)の管理画面に入れるように、AP の MAC アドレスに対して固定で IP アドレスを割り当てています。

まとめ

v6 プラスと IPv4(PPPoE)を併用し、ポートベース VLAN で使い分けて使えるようになりました。

IPv6 や v6 プラスについてまだ理解できてないことが多いのでよく分からず設定してるところも多いですが、それでも設定を始める前よりは知識が増えて勉強になりました。

コンフィグ

最終的なコンフィグを載せます。

#
# ユーザー
#
login password encrypted {{LOGIN_PASSWORD_ANONYMOUS_ENCRYPTED}}
administrator password encrypted {{ADMIN_PASSWORD_ENCRYPTED}}
user attribute connection=serial,telnet,remote,ssh,sftp,http gui-page=dashboard,lan-map,config login-timer=3600

#
# ゲートウェイの設定
#
ip route default gateway tunnel 1 gateway pp 1 filter 1
ip filter 1 pass 192.168.0.0/24 * * * *

#
# WAN
#
description lan2 IPv6
ipv6 lan2 secure filter in 100030 100031 100038 100039
ipv6 lan2 secure filter out 100099 dynamic 100080 100081 100082 100083 100084 100098 100099

#
# v6プラス
#
tunnel select 1
 description tunnel IPv4(v6プラス)
 tunnel encapsulation map-e
 ip tunnel mtu 1460

 # 受信パケットのフィルタ
 ip tunnel secure filter in 200000 200001 200002 300003 200020 200021 200022 200023 200024 200025 300030 300032
 # 送信パケットのフィルタ
 ip tunnel secure filter out 200010 200011 200012 300013 200020 200021 200022 200023 200024 200025 200026 200027 200099 dynamic 200080 200081 200082 200083 200084 200085 200098 200099

 ip tunnel nat descriptor 1000
 tunnel enable 1

#
# ポートベースVLAN
#
lan type lan1 port-based-option=divide-network
description vlan1 "LAN(v6プラス)"
description vlan2 "LAN(IPv4 PPPoE)"
vlan port mapping lan1.1 vlan1
vlan port mapping lan1.2 vlan1
vlan port mapping lan1.3 vlan1
vlan port mapping lan1.4 vlan2

#
# VLAN1
#
ip vlan1 address 192.168.3.1/24
ipv6 prefix 1 ra-prefix@lan2::/64
ipv6 vlan1 address ra-prefix@lan2::1/64
ipv6 vlan1 rtadv send 1 o_flag=on

#
# VLAN2
#
ip vlan2 address 192.168.0.1/24

#
# IPv4(PPPoE)
#
pp select 1
 description pp IPv4(PPPoE)
 # キープアライブ設定
 pp keepalive interval 30 retry-interval=30 count=12
 # 常時接続するかどうか
 pp always-on on
 # PPPoE を使う LAN インターフェース
 pppoe use lan2
 # PPPoE セッションを自動切断しない
 pppoe auto disconnect off
 # 受け入れる認証方式
 pp auth accept pap chap
 # 送信する認証情報
 pp auth myname {{PP_AUTH_MYNAME}} {{PP_AUTH_PASSWORD}}
 # MRU設定
 # 指定値はルーターが生成した値
 ppp lcp mru on 1454
 # IPアドレスのネゴシエーションをする
 ppp ipcp ipaddress on
 # IPCPのMS拡張オプションを使う
 # dns server のために必要
 ppp ipcp msext on
 # パケットを圧縮しない
 ppp ccp type none

 # 受信パケットのフィルタ
 ip pp secure filter in 200000 200001 200002 200003 200020 200021 200022 200023 200024 200025 200030 200032
 # 送信パケットのフィルタ
 ip pp secure filter out 200010 200011 200012 200013 200020 200021 200022 200023 200024 200025 200026 200027 200099 dynamic 200080 200081 200082 200083 200084 200085 200098 200099

 # NAT変換の適用設定
 ip pp nat descriptor 2000
 # 相手先を有効にする
 pp enable 1

#
# フィルターの設定
# UDP, FTP, DNSなどは静的フィルタではなく動的フィルタを用いる
#

ipv6 filter 100030 pass * * icmp6 * *
ipv6 filter 100031 pass * * 4
ipv6 filter 100038 pass * * udp * 546
ipv6 filter 100039 reject * *
ipv6 filter 100099 pass * * * * *
ipv6 filter dynamic 100080 * * ftp
ipv6 filter dynamic 100081 * * domain
ipv6 filter dynamic 100082 * * www
ipv6 filter dynamic 100083 * * smtp
ipv6 filter dynamic 100084 * * pop3
ipv6 filter dynamic 100098 * * tcp
ipv6 filter dynamic 100099 * * udp

# IPスプーフィング/LAND/Smurf攻撃への対策
# WAN側から入ってくるパケットの送信元がプライベートアドレスのものを破棄する
# 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16はプライベートネットワークアドレス
ip filter 200000 reject 10.0.0.0/8 * * * *
ip filter 200001 reject 172.16.0.0/12 * * * *
ip filter 200002 reject 192.168.0.0/16 * * * *
ip filter 200003 reject 192.168.0.0/24 * * * *
ip filter 300003 reject 192.168.3.0/24 * * * *
# WAN側に出ていくパケットの送信先がプライベートアドレスのものを破棄する
ip filter 200010 reject * 10.0.0.0/8 * * *
ip filter 200011 reject * 172.16.0.0/12 * * *
ip filter 200012 reject * 192.168.0.0/16 * * *
ip filter 200013 reject * 192.168.0.0/24 * * *
ip filter 300013 reject * 192.168.3.0/24 * * *

# RPCで使われるポートを拒否
# WAN側からのアクセス/WAN側へのアクセスは不要
ip filter 200020 reject * * udp,tcp 135 *
ip filter 200021 reject * * udp,tcp * 135

# Windowsのファイル共有で使われるNetBIOS関連を拒否
# WAN側からのアクセス/WAN側へのアクセスは不要
ip filter 200022 reject * * udp,tcp netbios_ns-netbios_ssn *
ip filter 200023 reject * * udp,tcp * netbios_ns-netbios_ssn

# Windowsのダイレクト・ホスティングSMBサービス関連を拒否
# WAN側からのアクセス/WAN側へのアクセスは不要
ip filter 200024 reject * * udp,tcp 445 *
ip filter 200025 reject * * udp,tcp * 445

# 特定のパケットは回線がアップ状態のときのみ通す
# 回線が切断されているときにこのパケットを送信すると回線が接続されてしまうが、
# 通信の終了を表すものなので接続する必要がない。
ip filter 200026 restrict * * tcpfin * www,21,nntp
ip filter 200027 restrict * * tcprst * www,21,nntp

# ICMPパケットを通す
# LANからWANへ送信したICMPパケットの応答を通すために必要
ip filter 200030 pass * 192.168.0.0/24 icmp * *
ip filter 300030 pass * 192.168.3.0/24 icmp * *

# メールサーバーからの認証パケットを許可する
ip filter 200032 pass * 192.168.0.0/24 tcp * ident
ip filter 300032 pass * 192.168.3.0/24 tcp * ident

# 全て許可
ip filter 200099 pass * * * * *

# 全て許可(回線接続時)
ip filter 500000 restrict * * * * *

# 各種プロトコルのLAN->WANをトリガーとした通信を動的に許可
ip filter dynamic 200080 * * ftp
ip filter dynamic 200081 * * domain
ip filter dynamic 200082 * * www
ip filter dynamic 200083 * * smtp
ip filter dynamic 200084 * * pop3
ip filter dynamic 200085 * * submission
ip filter dynamic 200098 * * tcp
ip filter dynamic 200099 * * udp

#
# DNSサーバー設定
#

# DNSサーバーへのアクセスを許可するホスト
dns host lan1

dns service fallback on
dns server dhcp lan2

# DNS問い合わせ先サーバーとそのサーバーを選択する条件
#   pp 1: pp 1 から通知されたサーバーを問い合わせ先とする
#   any .: 全てのタイプ、全てのドメインに対する問い合わせ
#   restrict pp 1: pp 1 がアップしていることも条件に追加する
dns server select 500001 pp 1 any . restrict pp 1

# プライベートアドレスに対する問い合わせを上位サーバーに転送しない
dns private address spoof on

#
# NATの設定
#

nat descriptor type 1000 masquerade
nat descriptor address outer 1000 map-e

# 静的NAT変換/IPマスカレード変換を行うNATディスクリプタ
# PPPoEではWAN側に1つIPアドレスが割り振られるが、複数の端末が接続するため
# IPマスカレード変換が必要
nat descriptor type 2000 masquerade

#
# DHCPサーバー設定
#

# DHCPサーバーとして動作する
dhcp service server

# DHCPサーバーが応答を返さない場合でも一部のPCが正しく動作するようにする
dhcp server rfc2131 compliant except remain-silent

ipv6 lan2 dhcp service client ir=on

# VLAN1に対してDHCPサーバーが割り当てるIPアドレスの範囲
dhcp scope 1 192.168.3.2-192.168.3.191/24 gateway 192.168.3.1
dhcp scope option 1 router=192.168.3.1 dns=192.168.3.1
# 無線LANアクセスポイントに固定IPアドレス割り当て
# 管理画面にアクセスするために必要
dhcp scope bind 1 192.168.3.191 ethernet 34:3D:C4:B4:B5:3E
ipv6 vlan1 dhcp service server

# VLAN2に対してDHCPサーバーが割り当てるIPアドレスの範囲
dhcp scope 2 192.168.0.2-192.168.0.191/24 gateway 192.168.0.1
dhcp scope option 2 router=192.168.0.1 dns=192.168.0.1
ip vlan2 dhcp service server

#
# NTP
#
schedule at 1 */* 05:00 * ntpdate ntp.nict.jp syslog

#
# その他サーバー
#

# TELNETサーバーへアクセスできるホストの設定
telnetd host lan

#
# 本体
#

# ログインタイマー
login timer 1800
# 起動時にアラームを鳴らす
alarm startup on
# トラフィック量の統計機能をON
statistics cpu on
statistics memory on
statistics traffic on
statistics flow on
statistics nat on
statistics route on
statistics filter on
statistics application on
# コンソールの文字コード
console character ja.utf8
# コンソールの表示行数
console lines infinity

ヤマハ RTX830を購入

f:id:LocaQ:20200823192906j:plain
RTX830
安定動作とネットワークの勉強を兼ねて初めて業務用ルーターを買ってみました。 まずは勉強ということでコマンドの勉強をしながら設定をしてみています。

今回は初期セットアップと Web GUI を使って IPv4(PPPoE) の設定をしてできた設定ファイルをベースに、1つ1つコマンドの意味を調べつつ変更してみたので、それの意味をわかった範囲で載せてみます。

できるだけ正確に書くようにしてますが、ネットワークには疎いので間違ってる可能性もあるのでそこはご了承ください。

起動後にやったこと

  • 管理パスワードの設定
  • LAN設定
  • IPv4(PPPoE)接続
    • ここで推奨のIPフィルターを設定するを選んで設定

これだけでインターネットに繋がりました。

コマンド

上の設定をして設定をダウンロードして、それをベースにコマンドの意味を調べつつ必要に応じて追加・変更・削除しました。 こだわるとキリがないので大体のところで区切りをつけ、使うことにしたコマンドの意味を載せていきます。

ユーザー設定

login password *
administrator password encrypted *

ユーザー名なしのパスワードの設定と管理パスワード(暗号化)の設定。 この記事を書いてるときにlogin password encryptedがあるのを知ったのでそちらの方がよいかも。

user attribute connection=serial,telnet,remote,ssh,sftp,http gui-page=dashboard,lan-map,config login-timer=3600

無名ユーザーに対する属性を設定する。attribute の後の設定値は以下の通り。

属性値 説明
connection=serial,telnet,remote,ssh,sftp,http ルーターへのアクセス方法を示す属性。許可している接続先は以下の通り。
serial: シリアルコンソール
telnet: telnet
remote: リモートセットアップ
ssh: SSH
sftp: SFTP
http: GUI設定画面
gui-page=dashboard,lan-map,config ログインユーザーに対して閲覧を許可するGUI画面の種別。値は以下の通り。
dashboard: ダッシュボード
lan-map: LANマップ
config: かんたん設定画面、詳細設定画面、管理画面、CONFIG画面、TECHINFO画面
login-timer=3600 キー入力がない場合に自動的にログアウトするまでの秒数。

コマンドリファレンスに「無名ユーザーに対してはSSH、SFTPによる接続を許可することができない。」とあるので、connection で指定はしてますが接続はできない状態っぽいです。

LAN 側設定

ip route default gateway pp 1

デフォルトのルーティング先を pp 1 にする。pp 1 はインターネット側(後で設定します)。 次のコマンドで LAN 側のネットワークを定義するので、LAN側以外のパケットを pp 1 にルーティングする、という設定になるんだと思います。

ip lan1 address 192.168.3.2/24

lan1 (LANポート1-4) の側の IP アドレスを 192.168.3.2 にする。192.168.3.1 は今使ってるルーターなので一時的に 2 にしてます。入れ替えるときに 1 に変更する予定。

IPv4 接続設定

pp select 1

pp 1 という相手先を選択する。 Point to Point Protocol (PPP) のことを pp と呼んでいる?でも ppp コマンドがあるので違うかも。 IPv4の接続は PPPoE を使う。PPPoE は Point to Point Protocol over Ethernet のことなので、IPv4の設定をするときは pp を使うらしい。(※1) select の後の番号(peer_num)の値は何でもよいので 1 にしてます。これに対して以降で IPv4 の設定をします。

※1:pp は「接続相手情報」という意味のようです。

description pp IPv4

pp 1 に対する説明。動作には影響しないようなので任意で設定します。

pp keepalive interval 30 retry-interval=30 count=12

キープアライブ設定。interval は回線に接続されているときのキープアライブパケット送信間隔、retry-interval は回線が切断されているときのキープアライブパケット送信間隔。 count はキープアライブパケットに対する返信が返ってこないときに回線断と判断する回数。

pp always-on on

常時接続する。

pppoe use lan2

PPPoE で相手先が接続されているインターフェースを指定する。今は pp 1 が選択されているので、 pp 1 が lan2 に接続されていることを指定してます。lan2 は RTX830 だと WAN ポートらしいです。

pppoe auto disconnect off

PPPoE セッションを自動切断しない。 pppoe auto connect コマンド(自動接続するかどうか)もありどちらもデフォルトで自動で行うので、自動切断だけオフにします。

pp auth accept pap chap

受け入れる PPP 認証要求の設定。2つまで設定できます。 pap がパスワードを平文でやりとりするのに対し、chap は平文では流れないので chap の方が安全らしいです。

pp auth myname {{PP_AUTH_MYNAME}} {{PP_AUTH_PASSWORD}}

PPP 認証要求が来た時に送信するユーザー名とパスワード。プロバイダから指定されているものを設定します。

ppp lcp mru on 1454

MRU という値の設定。1度に受信できる最大のデータサイズのようです。回線業者によって特定の値を指定する必要があるらしいので生成された値をそのまま使ってます。

ppp ipcp ipaddress on

PP 側 IP アドレスのネゴシエーションをする。off にすると相手から IP アドレスを割り振られないようになるので固定 IP のときは off にするのかもしれません。

ppp ipcp msext on

IPCPのMS拡張オプションを使う。dns server pp 1 のためにこの設定が必要です。

ppp ccp type none

パケットの圧縮をしない。RTX830 のデフォルトは stac で ISDN などが採用しているようですが、ブロードバンドは none を指定するようです。

ip pp secure filter in 200003 200020 200021 200022 200023 200024 200025 200030 200032
ip pp secure filter out 200013 200020 200021 200022 200023 200024 200025 200026 200027 200099 dynamic 200080 200081 200082 200083 200084 200085 200098 200099

pp の受信/送信に対して適用するフィルタを指定する。

ip pp nat descriptor 1000

pp を通るパケットに適用する NAT 変換を指定する。

pp enable 1

指定の pp を有効にして使える状態にする。

IPv4 フィルタ設定

# 受信用
ip filter 200000 reject 10.0.0.0/8 * * * *
ip filter 200001 reject 172.16.0.0/12 * * * *
ip filter 200002 reject 192.168.0.0/16 * * * *
ip filter 200003 reject 192.168.3.0/24 * * * *

# 送信用
ip filter 200010 reject * 10.0.0.0/8 * * *
ip filter 200011 reject * 172.16.0.0/12 * * *
ip filter 200012 reject * 192.168.0.0/16 * * *
ip filter 200013 reject * 192.168.3.0/24 * * *

受信用のフィルタでは pp (WAN) の受信パケットの送信元アドレスがプライベートアドレスのパケットは破棄する。10.0.0.0/8, 172.168.0.0/12, 192.168.0.0/16 は RFC 1918 という規格でプライベートネットワークとして予約されているらしい。また、192.168.3.0/24 は LAN 側のネットワーク。 このようなパケットを明示的に破棄するフィルタを作るのは、IPスプーフィング攻撃, LAND攻撃, Smurf攻撃への対策のためらしい。

最初にこのフィルタを見た時は「外からこんなパケット来るのか?消していいかな?」と思ったけど、ちゃんと調べたら意味があったので適当に消さなくてよかった。

送信側も必要な理由はよく分かっていないが、上記のリンク先に書いてあるのできっと意味があるんだろうと思う。

1つ気になるのは、200000-200002, 200010-200012 が ip pp secure filter で使われていないこと。そのネットワークは使わないから不要ってことだろうか? 追加しておくと攻撃が来た時に検知とかできたりするかもしれないので、後で追加してみたら面白いかもしれない。

ip filter 200020 reject * * udp,tcp 135 *
ip filter 200021 reject * * udp,tcp * 135

135 ポートは RPC で使われるポートで攻撃に使われるみたいなので破棄するとよいらしい。

ip filter 200022 reject * * udp,tcp netbios_ns-netbios_ssn *
ip filter 200023 reject * * udp,tcp * netbios_ns-netbios_ssn

NetBIOS は Windows のファイル共有で使われる規格のこと。インターネットを経由して使わないので破棄した方がよいみたいだし、プライベートネットワークで使う分には破棄して問題ない。

あと、netbios_ns などはニーモニックだけど、以下のサイトに載っている。

445 ポートは Windows のダイレクト・ホスティング SMB サービスというものが使うポート。NetBIOS と同様に破棄した方がよい。

ip filter 200026 restrict * * tcpfin * www,21,nntp
ip filter 200027 restrict * * tcprst * www,21,nntp

www (80), 21 (FTP), nntp (119) のパケットは TCP ヘッダーの FIN, RST フラグが立っていて回線が接続されている場合のみ通す、という設定。 このパケットは通信の終了を表すが、回線が切断されているときにこのようなパケットを送信すると回線が自動接続されてしまう。わざわざ接続する必要がないので破棄するらしい。

これはたぶん ISDN みたいに接続時間によって料金が変わるタイプの回線だと意味があるけど、ブロードバンドで常時接続の場合はどうなんだろう?企業で運用するときはメンテナンスとか何かで自動接続されない方がよい状況があるかもしれないが、家なのでこのフィルタはあってもなくてもよいかもしれない。

ip filter 200030 pass * 192.168.3.0/24 icmp * *

WAN からの ICMP パケットを通すフィルタ。 インターネット側からの ICMP パケットは遮断する方がセキュリティ上よいと聞いたことがあるので、通すのはなぜなのか気になったので調べてみました。

質問者がYAMAHAのサポートに問い合わせたところ、「内部ネットワークからインターネットへpingなどのICMP通信を行った際、戻りの通信を通すために必要なフィルター」という返信があったと書かれているので、そのために通しているようです。たまにインターネットが繋がってるか確認するのに Google とかに ping を飛ばしたりするのであってよさそうですが、ICMP を使った攻撃もあるようなので後々もっといい方法を調べてみるといいかもしれないです。

ip filter 200031 pass * 192.168.3.0/24 established * *

WAN→LANの接続は拒否するがLAN→WANの接続は許可する設定。

ip filter 200032 pass * 192.168.3.0/24 tcp * ident

ident はメールを送信するときにメールサーバーから認証のために使われるプロトコルらしい。破棄してもメール送信はできるが送信に時間がかかるようになるらしい。ほとんどメールは送らないのでなくてもよいかもしれない。

ip filter 200033 pass * 192.168.3.0/24 tcp ftpdata *

FTP のデータ送信を許可する。 後の動的フィルタの設定で FTP を許可するのにここで静的フィルタを作っている理由はよく分からない。

ip filter 200034 pass * 192.168.3.0/24 tcp,udp * domain
ip filter 200035 pass * 192.168.3.0/24 udp domain *

DNS パケットを通す。

ip filter 200036 pass * 192.168.3.0/24 udp * ntp
ip filter 200037 pass * 192.168.3.0/24 udp ntp *

NTP パケットを通す。

ip filter 200099 pass * * * * *
ip filter 500000 restrict * * * * *

全て通すフィルタと回線が接続されているときのみ全て通すフィルタ。 ただ、500000 は使われていないので不思議。

ip filter dynamic 200080 * * ftp
ip filter dynamic 200081 * * domain
ip filter dynamic 200082 * * www
ip filter dynamic 200083 * * smtp
ip filter dynamic 200084 * * pop3
ip filter dynamic 200085 * * submission
ip filter dynamic 200098 * * tcp
ip filter dynamic 200099 * * udp

動的フィルタ。一般的に使うアプリケーションのパケットを通す。 動的フィルタは通信が始まった時にフィルタが追加され、通信が終了するとフィルタが削除される、というような動作をするフィルタらしい。

今回は LAN から WAN へ送信されるときにこのフィルタを適用するので、これらのアプリケーションで自分からインターネットに対して通信を開始できるが、インターネットから自分のネットワークに対して通信を開始することはできない、という設定になる。

その他ネットワーク設定

nat descriptor type 1000 masquerade

静的 NAT 変換と IP マスカレード変換を行う NAT ディスクリプタ。上の方であったip pp nat descriptor 1000で指定している。 フレッツの PPPoE は IP アドレスが1つ割り当てられるが、PC以外にもスマホなど複数の端末を接続するので IP マスカレード変換が必要なのでこのような NAT ディスクリプタを作っているのだと思う。

TELNET サーバー設定

telnetd host lan

TELNET サーバーへアクセスできるホストの設定。LAN 側からアクセスできるようにしてます。

DHCP サーバー設定

dhcp service server

ルーターDHCP の動作を DHCP サーバーにする。

dhcp server rfc2131 compliant except remain-silent

DHCP サーバーの動作を、DHCPサーバーが応答を返さない場合でも一部のPCが正しく動作するようにする。

dhcp scope 1 192.168.3.2-192.168.3.191/24

DHCP サーバーがクライアントに割り当てる IP アドレスの範囲を指定する。

DNS サーバー設定

dns host lan1

DNS サーバーへのアクセスを許可するホストの指定。lan1 は LAN 側です。

dns server pp 1

名前解決時の問い合わせ先 DNS サーバーの通知を受ける相手先の指定。pp 1 を指定しているので、プロバイダから通知される DNS サーバーに問い合わせる、という設定にしてます。 ppp ipcp msext onの指定が必要です。

dns server select 500001 pp 1 any . restrict pp 1

DNS問い合わせ先サーバーとそのサーバーを選択する条件。

  • pp 1: pp 1 から通知されたサーバーを問い合わせ先とする
  • any .: 全てのタイプ、全てのドメインに対する問い合わせ
  • restrict pp 1: pp 1 がアップしていることも条件に追加する

    dns private address spoof on

プライベートアドレスに対する問い合わせを上位サーバーに転送しない。

本体設定

statistics cpu on
statistics memory on
statistics traffic on
statistics flow on
statistics nat on
statistics route on
statistics filter on
statistics application on

ルータートラフィックの統計機能を on にする。

alarm startup on

起動時にアラームを鳴らす。

まとめ

まだ理解しきれてない部分もありますが、やはり1つ1つ調べたことでかなり勉強になりました。

次は v6 プラスで接続できるように設定していきます。

ゴルーチン内の乱数生成を高速に行う

TL;DR

  • math/rand パッケージのトップレベル関数(rand.Float64 関数など)では内部でロックを取得するので、複数のゴルーチンで乱数を生成するとパフォーマンスがでない
  • 複数のゴルーチンで乱数を生成するときは、Rand 構造体のインスタンスを使って乱数を生成するとよい

経緯

Goの勉強のためにGoRayTracerというレイトレーサーを作っています。こんな画像を生成するプログラムです。

f:id:LocaQ:20190321172935p:plain

一通り動くところまでできましたが、この画像(640 x 480)を生成するのに1163秒(約20分)かかります。

同じ画像を生成できるFRayTracerを前に作っていたのですが、それと比べて2倍以上の時間がかかっていました。 特別な最適化をしていない.NETのプログラムより遅いのはおかしいと思い、プロファイラーを使って原因を調べてみました。

プロファイリング&分析

プロファイリングにはpkg/profileというライブラリを使いました。

main関数の先頭に以下のようなコードを追加すると、関数ごとのCPU使用時間を取得できます。

func main() {
    defer profile.Start(profile.ProfilePath(".")).Stop()

     ...
}

ビルドし、プログラムを起動して実行が終わると cpu.pprof というファイルができるので、Goの pprof というツールを使って結果を分析します。

>go tool pprof .go\bin\go_raytracer.exe cpu.pprof
File: go_raytracer.exe
Type: cpu
Time: Mar 10, 2019 at 8:49pm (JST)
Duration: 4.63mins, Total samples = 29.65mins (640.59%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)

top -cumと入力して時間のかかる関数を表示します。 -cumは「対象の関数だけではなく、その関数の呼び出し先まで含めた実行時間を表す"cumulative weight"の値でソートする」オプションのようです。 (flat は「対象の関数の実行時間から、呼び出し先の関数の実行時間を引いた時間」を表すようです。)

(pprof) top -cum
Showing nodes accounting for 14.34mins, 48.37% of 29.65mins total
Dropped 352 nodes (cum <= 0.15mins)
Showing top 10 nodes out of 73
      flat  flat%   sum%        cum   cum%
         0     0%     0%  26.07mins 87.93%  github.com/locatw/go-ray-tracer/rendering.(*RayTracer).renderPixelRoutine
  0.06mins  0.21%  0.21%  26.07mins 87.93%  github.com/locatw/go-ray-tracer/rendering.(*RayTracer).renderPixel
  0.36mins  1.21%  1.42%  25.22mins 85.08%  github.com/locatw/go-ray-tracer/rendering.(*RayTracer).traceRay
  0.04mins  0.13%  1.55%  15.99mins 53.94%  math/rand.Float64
  0.05mins  0.16%  1.70%  15.95mins 53.82%  math/rand.(*Rand).Float64
  0.03mins 0.087%  1.79%  15.91mins 53.66%  math/rand.(*Rand).Int63
  0.65mins  2.21%  3.99%  15.88mins 53.57%  math/rand.(*lockedSource).Int63
  0.30mins  1.01%  5.01%  15.77mins 53.20%  github.com/locatw/go-ray-tracer/element.CreateDiffuseRay
  2.29mins  7.73% 12.74%  13.09mins 44.17%  sync.(*Mutex).Lock
 10.56mins 35.63% 48.37%  10.56mins 35.63%  runtime.procyield
(pprof)

最初の3つはアプリのメソッドですが、その次に math/rand の関数とメソッドが4つ並んでいます。また、9番目に sync.(*Mutex).Lock があります。 この内、アプリで直接使っているのは math/rand.Float64 だけです。この乱数生成だけで実行時間の50%以上を使っていることが読み取れます。

また、sync.(*Mutex).Lock と math/rand.(*lockedSource).Int63 があるので、「math/rand.Float64 の内部でロックを取得していてそれに時間がかかっている」と予想して調べたところ、以下の記事を見つけました。

golangのrandパッケージのlockについて - DevDevデブ!!

この記事(とさらに参照先の記事)を読むと、やはり math/rand.Float64 などのトップレベル関数は内部でロックを取っているようです。 ロックを取っているのでパフォーマンスが出ない代わりに、ゴルーチンセーフになっているとのこと。 また、ゴルーチン毎に Rand 構造体のインスタンスを作成し、それを使って乱数を生成するとパフォーマンスがよくなると書かれています。

Rand 構造体を使って乱数を生成する

GoRayTracerではCPUコア数と同じだけのゴルーチンを生成し、内部で rand.Float64 関数を使っています。 なのでゴルーチンで実行する処理の内部で Rand 構造体のインスタンスを生成し、それを使って乱数を生成するようにしてみました。

optimize performance · locatw/GoRayTracer@c67a081

// ゴルーチン毎に生成
random := rand.New(rand.NewSource(time.Now().UnixNano()))

// ゴルーチンで実行される関数のなかで、Rand構造体のメソッドを使って乱数を生成する。
value := random.Float64()

変更前と変更後でベンチマークを取った結果が以下です。

コード 実行時間(秒)
改善前 1163
改善後 283

(CPU:Intel Core i7-8700, 画像の解像度:640 x 480)

変更前と比べて約4倍速くなりました。

プロファイリングでは乱数生成に全体の50%を使っていたので速くなるのは高々2倍くらいかと思いましたが、予想以上に速くなりました。 おそらく、プロファイラーは全ての処理の実行時間を計測しているわけではなくサンプリングしているため、実際の割合と差があり、結果予想以上に速くなったのだと思います。

Goの math/rand パッケージのソースコードを確認する

速くなって目的は達成しましたが、最後にGoのソースコードを確認してみます。 確認するコードはGo1.12の math/rand パッケージです。

go/rand.go at release-branch.go1.12 · golang/go

以下、ここからコードを引用します。全てのコードは引用しませんので詳しくは直接コードを見てください。

Float64、globalRand、lockedSource

まずは今回使っている、トップレベルの Float64 関数のコードを見てみます。

var globalRand = New(&lockedSource{src: NewSource(1).(Source64)})

// Float64 returns, as a float64, a pseudo-random number in [0.0,1.0)
// from the default Source.
func Float64() float64 { return globalRand.Float64() }

トップレベルの Float64 関数は globalRand の Float64 メソッドを呼び出す実装になっています。 また、globalRand はパッケージプライベートな *Rand 型の変数です。

NewSource 関数は Source 型のオブジェクトを生成する関数、New 関数は新しい Rand 構造体のオブジェクトを生成する関数でした。

次にここまで出てきた Source 、Rand、lockedSource、Source と関連する Source64 の定義を見てみます。

// A Source represents a source of uniformly-distributed
// pseudo-random int64 values in the range [0, 1<<63).
type Source interface {
    Int63() int64
    Seed(seed int64)
}

// A Source64 is a Source that can also generate
// uniformly-distributed pseudo-random uint64 values in
// the range [0, 1<<64) directly.
// If a Rand r's underlying Source s implements Source64,
// then r.Uint64 returns the result of one call to s.Uint64
// instead of making two calls to s.Int63.
type Source64 interface {
    Source
    Uint64() uint64
}

// A Rand is a source of random numbers.
type Rand struct {
    src Source
    s64 Source64 // non-nil if src is source64

    // readVal contains remainder of 63-bit integer used for bytes
    // generation during most recent Read call.
    // It is saved so next Read call can start where the previous
    // one finished.
    readVal int64
    // readPos indicates the number of low-order bytes of readVal
    // that are still valid.
    readPos int8
}

type lockedSource struct {
    lk  sync.Mutex
    src Source64
}

Source は乱数生成源を表すインターフェースのようで、このインターフェースに定義されている Int63 メソッドで実際に乱数を生成するようです。 また、Source64 は Source に Uint64 メソッドを追加したインターフェースのようです。

Rand 構造体は Source、Source64 型のインスタンスを保持する構造体、lockedSource はミューテックスと Source64 型のオブジェクトを持つ構造体です。 また、ここには載せていませんが、Rand 構造体と lockedSource 構造体は Source、Source64 インターフェースに定義されているメソッドを定義していますので、Source、Source64 インターフェースを実装した構造体になっています。

lockedSource を使った乱数生成

globalRand を生成するコードと、アプリでゴルーチン毎に生成した Rand 構造体のインスタンスを生成するコードを比べてみます。

globalRand を生成するコード

var globalRand = New(&lockedSource{src: NewSource(1).(Source64)})

GoRayTracerでゴルーチン毎に生成するコード

random := rand.New(rand.NewSource(time.Now().UnixNano()))

違いは New 関数に渡す引数で、globalRand は lockedSource を渡していますが、アプリでは通常の NewSource 関数で生成した乱数生成源を渡しています。

さて、トップレベルの Float64 関数

func Float64() float64 { return globalRand.Float64() }

ですが、globalRand の Float64 メソッドを呼び出しています。

これは内部を辿っていくと Rand 構造体が持つ乱数生成源 src の Int63 メソッドを呼び出すのですが、globalRand の場合は lockedSource の Int63 メソッドになります。 そのコードは以下のようになっています。

func (r *lockedSource) Int63() (n int64) {
    r.lk.Lock()
    n = r.src.Int63()
    r.lk.Unlock()
    return
}

確かに乱数生成時にロックを使っていました。

コンセントのない玄関にGoogle Home Miniを設置する

経緯

年末にGoogle Home Miniが半額になっていたので玄関に置こうと思って買ったんですが、いざ設置しようとしたらコンセントがないことに気付いてちょっと困りました。

ただ、せっかく買ったのに使わないのはもったいないので、とりあえず洗面台のコンセントを使って動かしてました。

f:id:LocaQ:20190120232305j:plain:w800

f:id:LocaQ:20190120232344j:plain:w400

でも色々問題がありました。

  • ドライヤーを使う時にいちいち挿し変えないといけなくて面倒
  • ドライヤーのワット数が1200W、洗面台のコンセントの最大ワット数も1200Wなので、電源タップを使えない
  • 洗面所のドアを閉められない
  • 洗面所に出入りすると、ドアがコードに当たって転がってひっくり返った状態になったりする
  • 電源コードの長さがギリギリで、そのうち断線しかねない

どうにかして電源を確保できないかネットで調べていたら、電球のソケットを使ってコンセントを増やすアダプターを見つけました。

f:id:LocaQ:20190120232521j:plain:w400 f:id:LocaQ:20190120232553j:plain:w400

しかし、もう1つ問題ができました。玄関の天井のソケットが斜めになっていて、このままではアダプターを挿せません。

f:id:LocaQ:20190120232649j:plain:w400

こちらは向きを変えられるアダプターがあったのでそれを使います。

使ったもの

以下のものを用意しました。

  • Google Home Mini
  • 可変式ソケット(E17口金→E26口金)
  • コンセント付きの電球アダプター(E26口金用)
  • LED電球(E26口金)
  • 電源タップ

store.google.com

注意として、コンセント付き電球アダプターがE26用のものしかありませんでしたが天井のソケットがE17でした。なので可変式ソケットはE17→E26へ変換するものを買いました。電球もそれに合わせてE26口金のものを買いました。

また、可変式ソケットがLED専用だったため、電球もLED電球にしています。ついでに人感センサー付きのものにしました。

設置

アダプターなどを接続するとこんな風になります。

f:id:LocaQ:20190120233353j:plain:w400

これを天井のソケットに挿します。

f:id:LocaQ:20190120233421j:plain:w400

可変式ソケットの傾きが足らなくて少し斜めになっていますが、他に合う可変式ソケットが見つからなかったのでこのままです。

次にアダプターのコンセントに電源タップを挿して、電源タップをシューズボックスに置きます。

f:id:LocaQ:20190120233452j:plain:w400 f:id:LocaQ:20190120233508j:plain:w400

上のシューズボックスの扉の背と壁の間が広すぎず狭すぎず、ちょうどコードを挟めるくらいの間隔だったのでコードを固定できました。

見た目はあまりよくないですが、壁から垂れ下がっているコードは玄関側からは見えないですし、天井のコードはLED電球が結構眩しくてあまり見られないのでこのままにしています。

Google Home Miniをシューズボックスの上に置きます。

f:id:LocaQ:20190120233520j:plain:w800

これでドライヤーを使うたびにコンセントを抜き差しする必要もなくなり、洗面所のドアも閉められるようになりました。