RFC 6092を読んでヤマハルータのIPv6/v4フィルタ設定

RTX810のGUIから生成されるIPoEのフィルタが非常に簡潔で疑問を感じたので、RFC 6092を参考にして設定を作ります。

- [RFC 6092 Recommended Simple Security Capabilities in Customer Premises Equipment (CPE) for Providing Residential IPv6 Internet Service](https://tools.ietf.org/html/rfc6092)
- [RFC 6092の機械翻訳](https://tex2e.github.io/rfc-translater/html/rfc6092.html) (by [RFC Trans](https://tex2e.github.io/rfc-translater/html/index.html))

RFC 6092ではIPv6しか言及していませんが、IPv4についてもIPv6に準じた設定をしていきます。

# 前提条件

- YAMAHA RTX810
- 回線: IIJmioひかり + IPoEオプション (PPPoEとDS-Liteの併用が可能)
- ひかり電話なし・ひかりTVなし
- 家庭用ブロードバンドルータとしての用途を想定
- サーバ設置、VPN等は考慮しない


# RFC 6092のRecommendations
RFC 6092には50個のRecommendationがありますが、ヤマハルータの設定で対応できるものだけを拾っていきます。

今回設定する内容を大まかにまとめると以下になります。

- 送信元・送信先IPアドレスが明らかに偽装されている or 異常なパケットをブロック (Ingress filtering)
- WAN側からの通信はブロック (IPv6のEcho requestを除く)
- LAN側から開始される通信は動的フィルタ(SPI)で通す
- 動的フィルタのタイムアウトを適切に設定する

## 設定対象とするRecommendation

| # | 概要 |
|:-:|:--|
| REC-1 | 送信元がマルチキャストアドレスのパケットは転送しない  |
| REC-2 |ルータの設定より狭いスコープのマルチキャストパケットは転送しない |
| REC-3 |インターネット上に流してはいけないIPアドレスを送信元/送信先とするパケットは転送しない  |
| REC-4 |非推奨の拡張ヘッダを持つパケットは転送しない  |
| REC-5 |外向きのパケットの送信元IPアドレスは到達可能なPrefixを持つこと |
| REC-6 |自ネットワークに割り当てられているPrefixを送信元アドレスに持つパケットは転送しない  |
| REC-7 |送信元または送信先IPアドレスがユニークローカルアドレス(ULA)のパケットは転送しない  |
| REC-8 |WAN側からのDNSクエリには応答しない  |
| REC-9 |WAN側からのDHCPv6 discoveryには応答しない  |
| [RFC 4890](https://tools.ietf.org/html/rfc4890) |ICMP Message Type 1～4 (各種error)と、128,129(ping)は通す |
| REC-14 |UDPポート1024番以上のアイドルタイムアウトは2分以上にする。デフォルトは5分  |
| REC-15 |UDPポート1023番以下のアイドルタイムアウトは2分未満にしても良い  |
| REC-31 |外向きのTCP接続を通す  |
| REC-35 |TCP接続のアイドルタイムアウト。establishedは2時間4分以上、接続前後の一時的な状態では4分以上にする  |
| REC-50 |管理インターフェースを外部に提供しない |

- REC-4の拡張ヘッダを調べるフィルタは書けませんが、`ipv6 rh0 discard`コマンドにより、デフォルトでType 0のルーティングヘッダを持つパケットは破棄されるようになっています。


# 静的フィルタ

静的フィルタでは、Ingress filtering ( [RFC 2827](https://datatracker.ietf.org/doc/html/rfc2827) \[[IPAによる日本語訳](https://www.ipa.go.jp/security/rfc/RFC2827JA.html)\])の作成が主になります。(REC-1,2,3,5,7)

## IPv6 静的フィルタ
RFC 6092の内容をそのままRA環境(=ひかり電話なし)で適用すると、IPv6の近隣探索とDHCPv6が通らなくなるので明示的に通すようにします。
また、RA環境ではNTT側の対向ルータが自ネットワークのPrefixのIPv6アドレスを持っているので、ここにも注意します。

```shell
# IPv6 in (61xxx)
ipv6 filter 61000 pass 2404:8e00::feed:100/126 ra-prefix@lan2::1111:2222:3333:4444/128 4 # DS-Lite
# 近隣探索とDHCPv6を明示的に通す
ipv6 filter 61100 pass ra-prefix@lan2::/64,::,fe80::/64 ra-prefix@lan2::/64,fe80::/64,ff02::/16 icmp6 134-136 # RA, NS, NA
ipv6 filter 61110 pass fe80::/64 fe80::/64 udp 547 546 # Stateless DHCPv6
# REC-1,3,7: WAN側から来ることがない送信元IPアドレスならReject
ipv6 filter 61200 reject ::/96,::ffff:0:0/96,64:ff9b:1::/48,100::/64,2001:2::/48,2001:db8::/32,fc00::/7,fec0::/10,ff00::/8 *
# RFC 4890: ICMPv6 Error messageとEcho RequestをPass
#           Echo Replyは動的フィルタで通すのでここには含まない。
ipv6 filter 61300 pass * * icmp6 1-4,128 # 外部からのPingをRejectする場合は128を削除
# REC-6: 送信元IPアドレスが自ネットワークのPrefixならReject
ipv6 filter 61400 reject ra-prefix@lan2::/64 *
# 解放したいアドレス・ポートがあれば61400以降に入れる
ipv6 filter 69999 reject * *

# IPv6 out (62xxx)
# NTPとDS-Liteのパケットを優先的に通す
ipv6 filter 62000 pass ra-prefix@lan2::/64 2404:1a8:1102::8/125 udp * 123 # NTT東日本 NGN NTP
ipv6 filter 62010 pass ra-prefix@lan2::1111:2222:3333:4444/128 2404:8e00::feed:100/126 4 # DS-Lite
# 近隣探索とDHCPv6を明示的に通す
ipv6 filter 62100 pass ra-prefix@lan2::/64,::,fe80::/64 ra-prefix@lan2::/64,fe80::/64,ff02::/16 icmp6 133,135,136 # RS, NS, NA
ipv6 filter 62110 pass fe80::/64 ff02::1:2 udp 546 547  # Stateless DHCPv6 
# REC-3: インターネットに流してはいけない送信先IPアドレスならReject
ipv6 filter 62200 reject * ::/96,::ffff:0:0/96,64:ff9b:1::/48,100::/64,2001:2::/48,2001:db8::/32,fc00::/7,fec0::/10,ff00::/8
# Windowsのファイル共有をReject。IPv6では135,137-139は使われないが念のため。
ipv6 filter 62210 reject * * udp,tcp 135,137-139,445 *
ipv6 filter 62220 reject * * udp,tcp * 135,137-139,445
# RFC 4890: ICMPv6 Error messageとEcho RequestをPass
#           Echo Replyは動的フィルタで通すのでここには含まない。
ipv6 filter 62300 pass ra-prefix@lan2::/64 * icmp6 1-4,128
ipv6 filter 62310 reject * * icmp6 # 他のICMPv6は通さない
# REC-5 : 外向きパケットの送信元IPアドレスは到達可能なPrefixを持つこと
# REC-31: 外向きのTCP接続を通す
ipv6 filter 62900 pass ra-prefix@lan2::/64 *
ipv6 filter 69999 reject * * # in側と兼用。実際には1行のみ。
```

- RFC 4890がICMPv6 Echo Requestを"Must Not Be Dropped"としているので、in側でも通していますが、必要なければRejectしても良いと思います。
- リンクローカルアドレスの予約範囲は `fe80::/10` ですが、passさせる箇所では実際に使われるPrefixの `fe80::/64` としています。
- in側のREC-6(61400番)がREC-1,3,7(61200番)と別れているのは、NTT側の対向ルータからICMPv6 Error messageが返ってくる可能性があるためです。実際にはtracerouteコマンドくらいしか関係しないはずなので、これを無視する場合、もしくはDHCPv6-PD環境(=ひかり電話あり)であれば、61200番に統合してもいいかもしれません。
- ファストパスが有効な場合は、DS-Liteトンネルの受信パケットにはフィルタが効かないはずですが、ログを取っているとノーマルパスに落ちてきてRejectされるパケットが観測されるので、最初に明示的に通しています(61000番)。

### RejectするIPv6アドレス

61200番と62200番でRejectしているIPアドレスは、主にRFC 6092のREC-3で示されるものです。

> REC-3: Packets bearing source and/or destination addresses forbidden to appear in the outer headers of packets transmitted over the public Internet MUST NOT be forwarded. In particular, site-local addresses are deprecated by [RFC3879], and [RFC5156] explicitly forbids the use of address blocks of types IPv4-Mapped Addresses, IPv4-Compatible Addresses, Documentation Prefix, and Overlay Routable Cryptographic Hash IDentifiers (ORCHID).


[RFC 5156](https://tools.ietf.org/html/rfc5156)は、[RFC 6890](https://tools.ietf.org/html/rfc6890)で置き換えられています。更に[RFC 8190](https://tools.ietf.org/html/rfc8190)による追加があってややこしい。
これらの情報は、[IANA IPv6 Special-Purpose Address Registry](https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml)で一覧になっています。ここから `Globally Reachable` が `False` なAddress blockを拾っています。
IPv4 互換アドレス、サイトローカルアドレス、マルチキャストアドレスは、[Internet Protocol Version 6 Address Space](https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml)に記載されています。

ひかりTV無しの環境なので、マルチキャストアドレスも全てReject対象としています。ただし、近隣探索とDHCPv6に必要なパケットは通します。

|Address block|説明|
|:---|:---|:---|
|::/128|未定義アドレス|
|::1/128|ループバック|
|::/96|IPv4 互換アドレス(廃止済)|
|::ffff:0:0/96|IPv4 射影アドレス|
|64:ff9b:1::/48|IPv4-IPv6 変換用|
|100::/64|トラフィック破棄用|
|2001:2::/48|ベンチマーク用|
|2001:db8::/32|ドキュメント用 |
|fc00::/7|ユニークローカルアドレス(REC-7にも出ている)|
|fec0::/10|サイトローカルアドレス (廃止済)|
|ff00::/8|マルチキャストアドレス|

- `::/128`と`::1/128`は`::/96`に含まれるので、実際のフィルタでは省略しています。
- 上記のAddress Registryにある`2001::/23` のIETF Protocol Assignmentsは、真面目に対応するとフィルタが複雑になるので無視しています。
- REC-3の文中で触れられているORCHIDは、RFC 6092発行後に廃止されました。[JANOG Comment](https://www.janog.gr.jp/doc/janog-comment/)の[JC1006](https://www.janog.gr.jp/doc/janog-comment/jc1006.txt)では、ORCHIDの廃止を受けてReject対象から外しているので、これに倣います。

## IPv4 静的フィルタ

IPv6と同様のフィルタですが、近隣探索とDHCPの対応が不要なのでシンプルになります。

```shell
# IPv4 in (41xxx)
ip filter 41200 reject 0.0.0.0/8,10.0.0.0/8,100.64.0.0/10,127.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.0.2.0/24,192.168.0.0/16,198.18.0.0/15,198.51.100.0/24,203.0.113.0/24,224.0.0.0/3 * # 224.0.0.0/3 is aggrication of 224.0.0.0/4, 240.0.0.0/4, 255.255.255.255
ip filter 41300 pass * * icmp 3,11,12 # 3:Destination Unreachable, 11:Time Exceeded, 12:Parameter Problem
ip filter 49999 reject * *

# IPv4 out (42xxx)
ip filter 42200 reject * 0.0.0.0/8,10.0.0.0/8,100.64.0.0/10,127.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.0.2.0/24,192.168.0.0/16,198.18.0.0/15,198.51.100.0/24,203.0.113.0/24,224.0.0.0/3 # 224.0.0.0/3 includes 255.255.255.255
ip filter 42210 reject * * udp,tcp 135,137-139,445 *
ip filter 42220 reject * * udp,tcp * 135,137-139,445
ip filter 42300 pass 192.168.0.1-192.168.0.254 * icmp 3,8,11,12 # 3:Destination Unreachable, 8:Echo, 11:Time Exceeded, 12:Parameter Problem
ip filter 42310 reject * * icmp
ip filter 42900 pass 192.168.0.1-192.168.0.254 *
ip filter 49999 reject * * # in側と兼用
``` 

### RejectするIPv4アドレス

IPv4でもIPv6と同様の[IANA IPv4 Special-Purpose Address Registry](https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml)と[IANA IPv4 Address Space Registry](https://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xhtml#note13)があるので、ここからReject対象を拾っています。

|Address block|説明|
|:---|:---|:---|
|0.0.0.0/8|自ネットワーク|
|10.0.0.0/8|プライベートアドレス|
|100.64.0.0/10|共有アドレス|
|127.0.0.0/8|ループバック|
|169.254.0.0/16|リンクローカル|
|172.16.0.0/12|プライベートアドレス|
|192.0.2.0/24|ドキュメント用|
|192.168.0.0/16|プライベートアドレス|
|198.18.0.0/15|ベンチマーク用|
|198.51.100.0/24|ドキュメント用|
|203.0.113.0/24|ドキュメント用|
|224.0.0.0/4|マルチキャストアドレス|
|240.0.0.0/4|予約|
|255.255.255.255/32|ブロードキャスト|

- 実際のフィルタでは、`224.0.0.0/4`, `240.0.0.0/4`, `255.255.255.255` を統合して`224.0.0.0/3`としています。
- `192.0.0.0/24`のIETF Protocol AssignmentsはIPv6と同様に無視。
- ISPから共有アドレス `100.64.0.0/10` やプライベートアドレスが配布される環境では、当該アドレスブロックを通す必要があるかもしれません。


# 動的フィルタ

動的フィルタでは一般的なTCP/UDP通信の設定の他に、ICMP/ICMPv6 Echo Replayを通すための設定と、コネクションのタイムアウトを設定しています(REC-14,15,35)。
IPv4 NATとファストパスのフローテーブルのタイムアウトもこれに合わせています。

```shell
# IPv4 (43xxx)
ip filter 80000 pass * * udp * 443
ip filter dynamic 43000 * * ntp timeout=2
ip filter dynamic 43010 * * domain
ip filter dynamic 43100 * * filter 80000 timeout=120 # HTTP/3 (443/udp)
ip filter dynamic 43110 * * www timeout=7440 # 80/tcp+443/tcp. 無くてもいいが show ip connectoinを見やすくするため
ip filter dynamic 43900 * * tcp timeout=7440 # ftp/pop3/smtp/submisson は使わないか暗号化するかなのでtcpに集約
ip filter dynamic 43910 * * udp timeout=300
ip filter dynamic 43920 * * ping timeout=60
ip filter dynamic timer tcp-syn-timeout=240 tcp-fin-timeout=240 tcp-idle-time=7440 udp-idle-time=300 # dynamic timerはIPv6と兼用される

# IPv4 NAT
nat descriptor type 10 masquerade
nat descriptor timer 10 tcpfin 240
nat descriptor timer 10 protocol=udp port=123 30 # コマンドの仕様により30秒未満にできない
nat descriptor timer 10 protocol=udp port=443 120 # HTTP/3
nat descriptor timer 10 protocol=udp 300 # "port="指定有りの行より後ろに置く。本文も参照。
nat descriptor timer 10 protocol=tcp 7440
nat descriptor timer 10 protocol=icmp 60
# 初期値ではTCP 0-1023宛パケットに対してRSTを返す(Reject)のを、破棄さぜるようにする
nat descriptor masquerade incoming 10 discard

# Flow Timer
ip flow timer tcp 7440
ip flow timer udp 300
ip flow timer icmp 60
ip flow timer slow 240

# IPv6 (63xxx)
ipv6 filter 80000 pass * * udp * 443
ipv6 filter dynamic 63000 * * ntp timeout=2
ipv6 filter dynamic 63010 * * domain
ipv6 filter dynamic 63100 * * filter 80000 syslog=off timeout=120 # HTTP/3 (443/udp)
ipv6 filter dynamic 63110 * * www timeout=7440 # 80/tcp+443/tcp. 無くてもいいが show ipv6 connectoinを見やすくするため
ipv6 filter dynamic 63900 * * tcp timeout=7440
ipv6 filter dynamic 63910 * * udp timeout=300
# ping6はin側/out側両方に設定
ipv6 filter dynamic 63920 * * ping6 timeout=60
```

## タイムアウト設定

REC-14,15,35は、IPv4 NATのタイムアウト推奨値をIPv6の動的フィルタにも適用するものです。

- [RFC 4787 Network Address Translation (NAT) Behavioral Requirements for Unicast UDP](https://datatracker.ietf.org/doc/html/rfc4787) (REC-14, 15)
- [RFC 5382 NAT Behavioral Requirements for TCP](https://datatracker.ietf.org/doc/html/rfc5382) (REC-35)

| Protcol | timeout |REC#|
|:-:|:-:|:-:|
| TCP (ESTABLISHED) | 2時間4分|REC-35|
| TCP (ESTABLISHED以外) | 4分|REC-35|
| UDP (DNS Query) | (defaultのまま) |REC-15|
| UDP (NTP) | 2秒 |REC-15|
| UDP (HTTP/3) | 2分 |REC-14, RFC9000|
| UDP (上記以外) | 5分  |REC-14|
| ICMP/ICMPv6 | 1分 |RFC5508|

TCPのタイムアウトがデフォルトよりも長くなるので、環境によってはセッション数が不足するかもしれません。
REC-15は、UDPの特定のプロトコルではタイムアウト時間を縮めてもよい、というものなので自分で決めた時間を設定しています。ただし、YAMAHAルータではIPv4 NATのタイムアウト最小値が30秒なので、IPv4 NATのNTPについては最小値の30秒としています。

### HTTP/3 (QUIC) のタイムアウト

最近、HTTP/3 (HTTP over QUIC) が使われ始めています。QUICは[RFC 9000  QUIC: A UDP-Based Multiplexed and Secure Transport](https://datatracker.ietf.org/doc/html/rfc9000)で標準化されました。
ルータから見るとUDP 443番宛の通信となり、TCPのようにセッション終了を検出できないので、わずかの通信でも動的フィルタやNATのエントリを占有してしまいます。
タイムアウトを短くしたくなりますが、RFC 9000では以下のように書かれています。

> However, state in middleboxes might time out earlier than that. Though REQ-5 in [RFC4787] recommends a 2-minute timeout interval, experience shows that sending packets every 30 seconds is necessary to prevent the majority of middleboxes from losing state for UDP flows [GATEWAY].

QUICプロトコルとしてはRFC 4787に合わせてほしいようですが、現実問題としてUDPは短時間でタイムアウトされてしまうので、30秒毎にパケットを送ることが必要だ、としています。
もっと短時間でkeepaliveを送る実装が見られますが、今後変化していくかも知れません。動的フィルタやNATのセッション数不足に直面しない限りは、[Manageability of the QUIC Transport Protocol (Internet Draft)](https://quicwg.org/ops-drafts/draft-ietf-quic-manageability.html)でも書かれているように、HTTP/3のタイムアウトを2分以上にしておくのが良さそうです。

参考: JANOG 48 meeting - [QUICとNATと](https://www.janog.gr.jp/meeting/janog48/lt4/)


### ICMP/ICMPv6のタイムアウト

ICMP/ICMPv6のタイムアウトはRFC 6092では言及がありませんが、REC-14,15,35が参照しているRFCと同様の[RFC 5508 NAT Behavioral Requirements for ICMP](https://tools.ietf.org/html/rfc5508)があります。この中では

> An ICMP Query session timer MUST NOT expire in less than 60 seconds.

とあるので、ICMPのタイムアウトは1分にしています。
しかし、RTX810の実際の動作を見ているとICMPの動的フィルタコネクションは15秒くらいで消えてしまうようです。

### nat descriptor timerの注意点

`nat descriptor timer (nat_descriptor) protcol=(protcol)`の内容は、`show config`での表示順で評価されます。そのため、`nat descriptor timer 10 protocol=udp 300` の行は、portを明示している行より後ろに書く必要があります。
`show config`で表示させて順序が違っていたら、`no nat descriptor timer 10 protocol=udp`で一度削除してから、`nat descriptor timer 10 protocol=udp 300` を入れなおす必要があります。


# 内蔵サービスのアクセス制限

in側フィルタでREC-8,9,50を満たせますが、念のために内蔵サービスは明示的にLAN側からのみアクセス可能にする設定もします。

```shell
# sshd,sftpd,tftpd,snmpも必要に応じて指定する
telnetd host lan1
dns host lan1
httpd host lan1
sntpd host lan1 # 使わなければ sntpd service off
```

# 設定まとめ

実configではIPv4のDS-LiteとPPPoEを使い分けるフィルタルーティングがありますが、そこは割愛します。

```shell

#
# IP configuration
#

ip route default gateway tunnel 1 weight 0 hide gateway pp 1 hide # tunnel 1のdisable/enableだけでDS-LiteとPPPoEを切り替えられるように
ip stealth lan2 pp1 tunnel1

#
# IPv6 configuration
#

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

#
# LAN configuration
#

ip lan1 address 192.168.0.1/24
ipv6 lan1 address ra-prefix@lan2::1111:2222:3333:4444/64 # 下位64bitは適当な乱数にしています
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 secure filter in 61000 61100 61110 61200 61300 61400 69999 dynamic 63920 # 外部からのPingを許可しない場合は dynamic 63920 は不要
ipv6 lan2 secure filter out 62000 62010 62100 62110 62200 62210 62220 62300 62310 62900 69999 dynamic 63000 63010 63100 63110 63900 63910 63920
ipv6 lan2 dhcp service client ir=on

#
# PP configuration
#

pp disable all

### PP 1 ###

pp select 1
 pp name "PRV/1/1/5/0/0/0:IIJmio PPPoE"
 pp keepalive interval 30 retry-interval=30 count=12
 pp always-on on
 pppoe use lan2
 pppoe auto disconnect off
 pp auth accept pap chap
 pp auth myname ID password
 ppp lcp mru on 1454
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ppp ccp type none
 ip pp secure filter in 41200 41300 49999
 ip pp secure filter out 42200 42210 42220 42300 42310 42900 49999 dynamic 43000 43010 43100 43110 43900 43910 43920
 ip pp intrusion detection in on reject=on
 ip pp intrusion detection in icmp on reject=off
 ip pp intrusion detection in winny off
 ip pp intrusion detection in share off
 ip pp nat descriptor 10
 pp enable 1
 
#
# TUNNEL configuration
#

no tunnel enable all

### TUNNEL 1 ###

tunnel select 1
 tunnel name "transix DS-Lite"
 tunnel encapsulation ipip
 tunnel endpoint address 2404:8e00::feed:101
 ip tunnel mtu 1460
 ip tunnel secure filter in 41200 41300 49999
 ip tunnel secure filter out 42200 42210 42220 42300 42310 42900 49999 dynamic 43000 43010 43100 43110 43900 43910 43920
 ip tunnel intrusion detection in on reject=on
 ip tunnel intrusion detection in icmp on reject=off
 ip tunnel intrusion detection in winny off
 ip tunnel intrusion detection in share off
 ip tunnel tcp mss limit auto
 tunnel enable 1

#
# IP filter configuration
#

ip filter 41200 reject 0.0.0.0/8,10.0.0.0/8,100.64.0.0/10,127.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.0.2.0/24,192.168.0.0/16,198.18.0.0/15,198.51.100.0/24,203.0.113.0/24,224.0.0.0/3 * # 224.0.0.0/3 is aggrication of 224.0.0.0/4, 240.0.0.0/4, 255.255.255.255
ip filter 41300 pass * * icmp 3,11,12 # 3:Destination Unreachable, 11:Time Exceeded, 12:Parameter Problem

ip filter 42200 reject * 0.0.0.0/8,10.0.0.0/8,100.64.0.0/10,127.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.0.2.0/24,192.168.0.0/16,198.18.0.0/15,198.51.100.0/24,203.0.113.0/24,224.0.0.0/3 # 224.0.0.0/3 includes 255.255.255.255
ip filter 42210 reject * * udp,tcp 135,137-139,445 *
ip filter 42220 reject * * udp,tcp * 135,137-139,445
ip filter 42300 pass 192.168.0.1-192.168.0.254 * icmp 3,8,11,12 # 3:Destination Unreachable, 8:Echo, 11:Time Exceeded, 12:Parameter Problem
ip filter 42310 reject * * icmp
ip filter 42900 pass 192.168.0.1-192.168.0.254 *

ip filter 49999 reject * *

ip filter 80000 pass * * udp * 443

#
# IP dynamic filter configuration
#

ip filter dynamic 43000 * * ntp timeout=2
ip filter dynamic 43010 * * domain
ip filter dynamic 43100 * * filter 80000 timeout=120
ip filter dynamic 43110 * * www timeout=7440
ip filter dynamic 43900 * * tcp timeout=7440
ip filter dynamic 43910 * * udp timeout=300
ip filter dynamic 43920 * * ping timeout=60
ip filter dynamic timer tcp-syn-timeout=240 tcp-fin-timeout=240 tcp-idle-time=7440 udp-idle-time=300

#
# NAT Descriptor configuration
#

nat descriptor type 10 masquerade
nat descriptor timer 10 tcpfin 240
nat descriptor timer 10 protocol=udp port=123 30
nat descriptor timer 10 protocol=udp port=443 120
nat descriptor timer 10 protocol=udp 300
nat descriptor timer 10 protocol=tcp 7440
nat descriptor timer 10 protocol=icmp 60
nat descriptor masquerade incoming 10 discard

#
# IP flow timer configuration
#

ip flow timer tcp 7440
ip flow timer udp 300
ip flow timer icmp 60
ip flow timer slow 240

#
# IPv6 filter configuration
#

ipv6 filter 61000 pass 2404:8e00::feed:100/126 ra-prefix@lan2::1111:2222:3333:4444/128 4 # DS-Lite
ipv6 filter 61100 pass ra-prefix@lan2::/64,::,fe80::/64 ra-prefix@lan2::/64,fe80::/64,ff02::/16 icmp6 134-136 # RA, NS, NA
ipv6 filter 61110 pass fe80::/64 fe80::/64 udp 547 546 # Stateless DHCPv6
ipv6 filter 61200 reject ::/96,::ffff:0:0/96,64:ff9b:1::/48,100::/64,2001:2::/48,2001:db8::/32,fc00::/7,fec0::/10,ff00::/8 *
ipv6 filter 61300 pass * * icmp6 1-4,128 # ICMPv6 Error, Echo request
ipv6 filter 61400 reject ra-prefix@lan2::/64 *

ipv6 filter 62000 pass ra-prefix@lan2::/64 2404:1a8:1102::8/125 udp * 123 # NTT東日本 NGN NTP
ipv6 filter 62010 pass ra-prefix@lan2::1111:2222:3333:4444/128 2404:8e00::feed:100/126 4 # DS-Lite
ipv6 filter 62100 pass ra-prefix@lan2::/64,::,fe80::/64 ra-prefix@lan2::/64,fe80::/64,ff02::/16 icmp6 133,135,136 # RS, NS, NA
ipv6 filter 62110 pass fe80::/64 ff02::1:2 udp 546 547  # Stateless DHCPv6 
ipv6 filter 62200 reject * ::/96,::ffff:0:0/96,64:ff9b:1::/48,100::/64,2001:2::/48,2001:db8::/32,fc00::/7,fec0::/10,ff00::/8
ipv6 filter 62210 reject * * udp,tcp 135,137-139,445 *
ipv6 filter 62220 reject * * udp,tcp * 135,137-139,445
ipv6 filter 62300 pass ra-prefix@lan2::/64 * icmp6 1-4,128
ipv6 filter 62310 reject * * icmp6
ipv6 filter 62900 pass ra-prefix@lan2::/64 *

ipv6 filter 69999 reject * *

ipv6 filter 80000 pass * * udp * 443

#
# IPv6 dynamic filter configuration
#

ipv6 filter dynamic 63000 * * ntp timeout=2
ipv6 filter dynamic 63010 * * domain
ipv6 filter dynamic 63100 * * filter 80000 syslog=off timeout=120
ipv6 filter dynamic 63110 * * www timeout=7440
ipv6 filter dynamic 63900 * * tcp timeout=7440
ipv6 filter dynamic 63910 * * udp timeout=300
ipv6 filter dynamic 63920 * * ping6 timeout=60

#
# TELNETD configuration
#

telnetd host lan1

#
# DHCP configuration
#

dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.0.100-192.168.0.199/24

#
# DNS configuration
#

dns host lan1
dns service fallback on
dns server dhcp lan2
dns server select 500000 dhcp lan2 any .
dns server select 500001 pp 1 any . restrict pp 1
dns domain .
dns private address spoof on

#
# HTTPD configuration
#

httpd host lan1

#
# SNTPD configuration
#

sntpd host lan1 # 使わなければ sntpd service off

```


# 参考

- [Yamaha ルーターシリーズコマンドリファレンス](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/index.html)
- [ヤマハネットワーク機器の技術資料](http://www.rtpro.yamaha.co.jp/RT/docs/)
- [プロフェッショナルIPv6](https://www.geekpage.jp/blog/?id=2018-7-4-1)
- [IPv6家庭用ルータガイドライン（2.0版 2010年7月29日発行）](https://www.v6pc.jp/jp/entry/wg/2010/08/ipv620_2010729.phtml)
- [JANOG Comment](https://www.janog.gr.jp/doc/janog-comment/)
    - [JC1003 xSP のルータにおいて設定を推奨するフィルタの項目について 〜 顧客接続部分編 〜](https://www.janog.gr.jp/doc/janog-comment/jc1003.txt)
    - [JC1006 xSP のルータにおいて設定を推奨するフィルタの項目について (IPv6版)](https://www.janog.gr.jp/doc/janog-comment/jc1006.txt)
- [ルーターconfigの最適化と高速化](https://www.marbacka.net/blog/router_config_optimization/)
- [buiの雑記帳:buimemo](http://bui.asablo.jp/blog/)
    - [Yamahaルーターのドキュメント化されていない情報 ](http://bui.asablo.jp/blog/2017/10/05/8695045)
    - [Yamahaルーターのドキュメント化されていない情報(2)](http://bui.asablo.jp/blog/2020/07/29/9273113)
- JANOG 48 meeting - [QUICとNATと](https://www.janog.gr.jp/meeting/janog48/lt4/)

# 変更履歴

2020/10/4: PMTUD Blackholeの防止のため、`ip (interface) intrusion detection in icmp on reject=off`を追加。誤字修正。
2020/11/10: `gw.transix.jp`のIPアドレスが追加されたため、IPv6フィルタのプレフックス長を`/127`から`/126`に変更
2021/7/30: HTTP/3のタイムアウト変更を追加。NTPのタイムアウト短縮をIPv4にも適用。他、一部の説明を加筆