nuroでciscoルータを使った(memo)

:::note info
2021/10/07現在、CiscoルータはただのVPNゲートウェイとしか機能しない設定にしました。
:::

https://qiita.com/dj5fs/items/988a571e306e646d750e


# はじめに
御存知の通り、nuroでONUを提供してもらうためには、法人契約しかなく。。。

- WLAN無効
- DMZ設定
- DHCPv4無効

などなどしてなんとか使うのが一般的です。どうにかしてAliexpressとかからいいのを探してきても、なかなか1GE+4FEとか、IPv6未対応とか、設定いじってもbridgeできなかったり、もう諦めてHG8045Qを使ってもいい感じにできないか、と自分なりに煮詰めた設定をメモしておきます。

# 環境

- nuroマンション+4
- HG8045Q
- Cisco 2911(Service Module: SM-ES3G-16-P@Cisco c3560e)

# 構成
```
                   +-----------------------------------------------+
                   | Cisco 2911                                    |
                   |        g0/0: IPv4 StaticADDR, NAPT outside    |
+-------+ (VLAN10) |    brigde 1: g0/1(IPv6 traffic only), vlan10  |
|clinets|----------| bridge BVI1: IPv4 NAPT inside                 |
+-------+          |              IPv6 DHCPv6-PD client            |
IPv4:              |              IPv6 unicastADDR (use PD prefix) |
 DHCP from C2911   +-----------------------------------------------+
IPv6:                       g0/0                     g0/1
 configure from               |                        |  PathThrough(nd, ra)
  HG8045Qs RA       IPv4 DMZ  |                        |  DHCPv6(DNS)
                              |                        |  DHCPv6-PD(/64 prefix)
                             LAN1                     LAN2
                           +-------------------------------+
                           | HG8045Q                       |
                           |  IPv4: DHCP disabled          |
                           |        DMZ = C2911 g0/0 ADDR  |
                           |  IPv6: ??????                 |
                           |  WLAN: OFF                    |
                           +-------------------------------+
                                           |
                                           | G-PON
                                           |
                                        +------+
                                        | nuro |
                                        +------+

```

# 苦労したところ
IPv4はだましだましなんとかできるのですが、IPv6がクセモノです。

## HG8045Q側設定
`IPv6 > LANアドレス設定`
>- [x] ルータ広告を有効にする
- [x] DHCPv6サーバを有効にする
- リソース割り当てモード: 手動
- アドレス/プレフィックスの割り当て方法:　SLAAC
- その他の情報の割り当て方法:　DHCPv6
- ULAモード:　無効

**リソース割り当てモード**は自動にするとどうなるか検証してませんが、なんとなく雰囲気で**DHCPv6でアドレス配布されるの嫌なので手動**に
ULAモードについては、自動でも手動でも使い物になりませんでしたので、無効にしています。

## Cisco側設定
孤高なるCisco様に倣って、書いていきます。

```
version 15.7
service timestamps debug datetime msec
service timestamps log datetime msec
service password-encryption
!
hostname c2911
!
boot-start-marker
boot-end-marker
!
no aaa new-model
!
no ip dhcp conflict logging
ip dhcp excluded-address 192.168.0.251 192.168.0.254
!
ip dhcp pool LAN
 network 192.168.0.0 255.255.255.0
 default-router 192.168.0.254
 dns-server 192.168.0.254
!
ip dhcp pool raspi4
 host 192.168.0.250 255.255.255.0
 client-identifier 01dc.a632.cc14.2d
 bootfile ""
 next-server 192.168.0.253
 default-router 192.168.0.254
 dns-server 192.168.0.254
 option 43 ascii "Raspberry Pi Boot"
!
no ip domain lookup
ip domain name hogehoge.com
ip inspect name SPI icmp
ip inspect name SPI tcp
ip inspect name SPI udp
ip cef
ipv6 unicast-routing
ipv6 inspect name SPI icmp
ipv6 inspect name SPI tcp
ipv6 inspect name SPI udp
ipv6 cef
!
multilink bundle-name authenticated
!
license udi pid CISCO2911/K9 sn XXXXXXXXXXX
hw-module sm 1
!
vtp version 2
!
redundancy
bridge-domain 1
!
bridge irb
!
interface Embedded-Service-Engine0/0
 no ip address
 shutdown
!
interface GigabitEthernet0/0
 ip address 192.168.200.2 255.255.255.0
 ip nat outside
 ip inspect SPI out
 ip virtual-reassembly in
 duplex auto
 speed auto
!
interface GigabitEthernet0/1
 no ip address
 duplex auto
 speed auto
 bridge-group 1
 bridge-group 1 input-type-list 200
 bridge-group 1 output-type-list 200
!
interface GigabitEthernet0/2
 no ip address
 shutdown
 duplex auto
 speed auto
!
interface GigabitEthernet1/0
 ip address 192.168.201.1 255.255.255.0
!
interface GigabitEthernet1/1
 switchport mode trunk
 no ip address
!
interface Vlan1
 no ip address
!
interface Vlan10
 no ip address
 bridge-group 1
!
interface BVI1
 ip address 192.168.0.254 255.255.255.0
 ip nat inside
 ip virtual-reassembly in
 ipv6 address nuroPrefix ::DEAD:BEEF:F000:8AAA/64
 ipv6 nd autoconfig default-route
 ipv6 dhcp client pd nuroPrefix rapid-commit
 ipv6 inspect SPI in
!
ip forward-protocol nd
!
no ip http server
no ip http secure-server
!
ip dns view default
 dns forwarding
 dns forwarder 192.168.200.1
 dns forwarder 8.8.8.8
ip dns view-list dns-view
 view default 10
  restrict source access-group 1
ip dns server view-group dns-view
ip dns server
ip nat inside source list 1 interface GigabitEthernet0/0 overload
ip route 0.0.0.0 0.0.0.0 GigabitEthernet0/0 192.168.200.1
ip ssh version 2
!
access-list 1 permit 192.168.0.0 0.0.0.255
access-list 200 permit 0x86DD 0x0000
!
control-plane
!
bridge 1 protocol ieee
bridge 1 route ip
!
line con 0
line aux 0
line 2
 no activation-character
 no exec
 transport preferred none
 transport output pad telnet rlogin lapb-ta mop udptn v120 ssh
 stopbits 1
line 67
 no activation-character
 no exec
 transport preferred none
 transport input all
 transport output pad telnet rlogin lapb-ta mop udptn v120 ssh
 stopbits 1
 flowcontrol software
line vty 0 4
 login local
 transport input ssh
 transport output all
!
scheduler allocate 20000 1000
!
end
```

| ipv6 unicast-routing |
|:-|
| IPv6ルーティングをするためのおまじない。 |

| ipv6 inspect name SPI xxx |
|:-|
| IPv6のいわゆるステートフルパケットインスペクション(SPI)の対象について宣言。 |

| ipv6 cef |
|:-|
| IPv6を早くするおまじない。 |

| bridge irb |
|:-|
| ONUからのDHCPv6-PDによるPrefixDelegationが効かないので、もう最終手段としてIPv6パケットをブリッジするブリッジタイプを宣言します。irb以外にもある。 |

| bridge-group 1 |
|:-|
| このインターフェースをBridge1のグループにする。パケットはBVIというインターフェースに流れる。ちなみにこれを入れるとインターフェースにアドレス等設定しても意味がなくなる。 |


| bridge-group 1 [input,output]-type-list 200 |
|:-|
| 特定のパケットのみBridgeに流すように設定する。 |

| interface BVI1 |
|:-|
| bridge groupの番号に応じたパケットが集まってくるところ |

| ipv6 address nuroPrefix ::DEAD:BEEF:F000:8AAA/64 |
|:-|
| このインターフェースのIPv6アドレスを、DHCPv6-PDで降ってくるPrefixと、インターフェースIDで設定する。ちなみにここを ```nuroPrefix ::1:dead:beef:f000:8aaa/64```にしても全く無視して、自身が持っているサブネットはこれしかないとばかりonuは言ってくる。**あなたはPDで/56持ってきました！っていってるんですけどねぇ！** |

| ipv6 nd autoconfig default-route |
|:-|
| お近くのルータさんを見かけたら、そいつをデフォルトゲートウェイとしてくれる。 |

| ipv6 dhcp client pd nuroPrefix rapid-commit |
|:-|
| 使えないonuに対して、DHCPv6-PDでPrefixをよこしてくださいと言う。しかも急かす。 |

| ipv6 inspect SPI in |
|:-|
| これを入れておくと、ルータを経由するパケット全てに対してSPIで防御してくれる。 |

| access-list 200 permit 0x86DD 0x0000 |
|:-|
| 先述のbridgeに入ってくるパケットの種別を指定する。 0x86DDがIPv6。 |

| bridge 1 protocol ieee |
|:-|
| bridgeのおまじない |

| bridge 1 route ip |
|:-|
| bridgeをipルーティングするためのおまじない |

# この設定に落ち着いた経緯
ルータはIPsecの拠点間VPNセンターとして機能させる上で、IPv6を使ったIPv4トンネルを掘りたいので、IPv6アドレスを持ちつつ、クライアントも問題なくv4v6のデュアルスタックで問題なく通信させるには、この設定しか思いつかず。。

Cisco歴が3年ほどで、特に資格や勉強をしているわけではないので、Google先生の知識に付け焼刃的設定になっているかもしれませんが、実際に不自由ないので、こんな感じです。

あと、IPv4とIPv6で一本ずつケーブルを引くことで、各バージョンごとで1Gbpsのスループットを期待できます。現在の混在環境では1Gbps以上のスループットが出ることがあり（[fast.com](https://fast.com/ja/)で1Gbpsでた）、なにげにbondingみたいになったことでスループットが上がりました。嬉しい誤算。

# せめてもBridgeモードの解放を望みます
いろいろ試そうとすると、ベンダ設定が邪魔をしてくるのが不満です。
ONU単体とか、SFP+のスイッチも持っているので、XG-PON SFP+ ONUの提供も期待してたりします。
だめですか？？

# 問題発生(2021/10/02追記)
- Windowsで、brideされたONUのRAによるデフォルトゲートウェイ、Ciscoからのデフォルトゲートウェイと２つ配られて不安定になる模様。
- Androidも同じような挙動担っている感じがする
- MacはCiscoのデフォルトゲートウェイしか見ていない

## 解決法
1. ONUのRAを止める
1. 一応、ONUのULAモードを自動にしておく
1. ```Cisco# sh ipv6 dhcp int```で、Reachable via addressがONUのULAなので、メモしておく。
1. ```Cisco(config)# int bvi1 ```で、```no ipv6 nd autoconfig default-route```する。ONUからRAが来ないので意味無し。
1. ```Cisco(config)# ipv6 route ::/0 bvi1 ONU_ULA```

すると、みんなルータを向いてくれる。

# 結局意味がなかった。無駄記事かも。
まあ、Prefixに応じた固定IPv6アドレスが設定できる分いいか。
<details><summary>config</summary><div>

```
no ip domain lookup
ip cef
ipv6 unicast-routing
!
ipv6 cef
!
bridge-domain 1
!
bridge irb
!
interface GigabitEthernet0/1
 no ip address
 duplex auto
 speed auto
 bridge-group 1
 bridge-group 1 input-type-list 200
 bridge-group 1 output-type-list 200
!
interface Vlan10
 no ip address
 bridge-group 1
!
interface BVI1
 ip address 192.168.0.254 255.255.255.0
 ip nat inside
 ip virtual-reassembly in
 ipv6 address nuroPrefix ::DEAD:BEEF:15:F00D/64
 ipv6 nd autoconfig default-route
 ipv6 nd ra suppress all
 ipv6 dhcp client pd nuroPrefix
!
access-list 200 permit 0x86DD 0x0000
!
bridge 1 protocol ieee
bridge 1 route ip
!
end
```
</div></details>