以下が前提条件です

  • 買ったのは Cisco 891F (C891FJ-K9)
  • IPv6系
    • NTT東日本のNGNにつながっている
    • ひかり電話なしでPrefixはRAで降ってくる。ブリッジはせず、LAN側はIPv6使用不可
    • ACLはWAN側INに静的にかける。Reflexive ACLは使わない(発信元がルータ自身だと動かないっぽい)
    • ACLの宛先はanyにする。WAN側アドレスにすべきだが、変わる可能性があり面倒だった
    • DDNSはOPEN IPv6 ダイナミック DNS for フレッツ・光ネクストを使う
  • IPv4系
    • 普通にPPPoEでつなぐ
    • Transixでもつなぐ
    • デフォルトゲートウェイはTransixで、トンネルが切れた時はPPPoE
    • ACLはWAN側INに静的にかけてOUTにReflexive ACLを使う
    • プライベートIPアドレスは192.168.0.0/16を/24に切り分けながら使う
    • DHCP有効
  • WAN側ポートはFastEthernet0
    • 自宅がVDSLのため。普通はGigabitEthernet8を使うはず
  • 実際の通信はFastEthernet0をブリッジしてBVI1から行う
    • IPv6でサーバ立てるため、FE0と特定VLANをブリッジしておきたかった

IOSバックアップと初期化

  • まずはバックアップ。USBメモリが刺さるのでそこに取る
    • 多分FAT32でフォーマットしておけば認識される
# 特権
enable
# 中身確認しつつIOSバックアップ
dir flash:
dir usbflash:
copy flash:c800j-<IOSバージョンとか諸々>.bin usbflash0:
  • 色々初期化
# config削除
erase startup-config
# flashの中身を見ながらIOSの.bin以外を消していく
dir flash:
delete /force /recursive flash:managed # 一例
# 再起動
reload

Cisco共通設定

# 特権
enable
configure terminal
# ホスト名
hostname 891fj
# ログのコンソール出力を切る
no logging console
# enableパスワード設定
enable secret <Password>
# 日本時間にする
clock timezone JST 9
# ログの時刻を日本時間にして可能な限り詳細に出す
service timestamps debug datetime msec localtime show-timezone year
service timestamps log datetime msec localtime show-timezone year

LAN側設定

# 適当にVLAN作る
vlan 10
 name ClientSeg
exit
# 適当にIPアドレス割り当てる
interface Vlan 10
 ip address 192.168.10.1 255.255.255.0
exit
# 適当に物理インターフェースにVLANつける
interface GigabitEthernet 0
 switchport access vlan 10
 switchport mode access
exit
# デフォルトで作られているVLAN1はshutdownしておく
interface Vlan 1
 shutdown
exit
# DHCP作る
ip dhcp pool ClientDhcpPool
 network 192.168.10.0 255.255.255.0
 default-router 192.168.10.1
 dns-server 8.8.8.8 8.8.4.4
exit
# DHCPの固定割り当てを行う場合は別でプール作る
ip dhcp pool StaticAssign1
 host 192.168.10.200 255.255.255.0
 client-identifier <Macアドレスの先頭に01をつけて4桁ごとに.をいれたもの>
exit
  • client-identifierが分からない場合は以下の通り
    • LANケーブルを一度繋いでみて show ip dhcp binding するとClient-IDが表示される
    • ケーブルを抜いてから clear ip dhcp binding <割り当てられたIPアドレス>

WAN側ブリッジ

  • この時点ではWAN側ケーブルをつながない
# IRBブリッジ(ブリッジしつつBVIインターフェース使えるやつ)有効化
bridge irb
# ブリッジグループ1番でスパニングツリー有効化
bridge 1 protocol ieee
# ブリッジグループ1番でIPルーティング有効化(これがないとBVIがIPトラフィック受け取れない)
bridge 1 route ip

# FE0をブリッジグループ1番に加える
interface FastEthernet 0
 bridge-group 1
exit

# VLAN90のインターフェースをブリッジグループ1番に加える
vlan 90
 name WanSeg
exit
interface Vlan 90
 bridge-group 1
exit

NGN IPv6系

# IPv6 ルーティング
ipv6 unicast-routing
# IPv6 CiscoExpressForwarding
ipv6 cef

# WAN INにかけるACL(nd-nsとnd-naは暗黙的に許可されている)
ipv6 access-list v6WanIn
 permit icmp any any router-advertisement # Router Solicitationの応答
 permit icmp any any echo-reply # pingの戻り(疎通確認用)
 permit icmp any any destination-unreachable # 宛先不明
 permit icmp any any packet-too-big # 指定されたMTUを超えるパケットだった(path-mtu-discoveryで使うっぽい)
exit

# WAN INのIPv4拒否(たぶん必要ない)
ip access-list standard v4DenyAll
 deny any
exit

# WANポートの設定
interface BVI 1
# ACL適用
 ipv6 traffic-filter v6WanIn in
 ip access-group v4DenyAll in
# Router Solicitationに応答しない
 ipv6 nd ra suppress all
# Router Advertisementで降ってきたprefixとデフォルトゲートウェイを使う
 ipv6 address autoconfig default
exit

DDNS設定

  • 基本は公式サンプルの通りに書く
    • 対向先がOCI想定で固定IPアドレスなので、891fj側ではDNSを指定していない
    • そのためpingの宛先はドメインではなくIPv6アドレスを指定する
  • IOS標準で ip ddns update という機能もあるが、これはIPv4専用らしく使えなかった
event manager applet OPEN_DDNS_RENEW_SCRIPT
 # 1分刻みに実行。1時間刻みの場合は"0 * * * *"のはず
 event timer cron name OPEN_DDNS_RENEW_SCRIPT_1 cron-entry "* * * * *"
 # enableしてからpingを投げる。enableが必要な理由は分からないが、無いと動かなかった
 action 1.0 cli command "enable"
 action 1.0 cli command "ping <更新専用アドレス(IPv6アドレス)>"
exit

NTP設定

# ACLで123/udpを開ける
ipv6 access-list v6WanIn
 permit udp host 2001:3a0:0:2001::27:123 eq ntp any
 permit udp host 2001:3a0:0:2005::57:123 eq ntp any
 permit udp host 2001:3a0:0:2006::87:123 eq ntp any
exit

# NTPを指定する
ntp server 2001:3a0:0:2001::27:123
ntp server 2001:3a0:0:2005::57:123
ntp server 2001:3a0:0:2006::87:123
  • 疎通確認
ping 2001:3a0:0:2001::27:123
show ntp associations

IPv4 PPPoE系

# PPPoE outのACL(anyで通してReflexive ACLのタグつける)
ip access-list extended v4WanOut
 permit ip any any reflect IPREFLECT
exit
# PPPoE inのACL(Reflexive ACLの関連だけ許可)
ip access-list extended v4WanIn
 evaluate IPREFLECT
exit

# PPPoEのinterface作る
interface Dialer 1
# ACL適用
 ip access-group v4WanIn in
 ip access-group v4WanOut out
# IPアドレスは自動設定
 ip address negotiated
# フレッツのいつものMTU
 ip mtu 1454
# PPPを使う
 encapsulation ppp
# 物理interfaceに紐づけるときに使うプール番号
 dialer pool 1
# PPPoEで許可するプロトコルを決める時に使う番号
 dialer-group 1
# PPPoEの認証はクライアント側からの一方向のみ
 ppp authentication chap callin
# PPPoEの認証情報
 ppp chap hostname <ID>
 ppp chap password <Password>
exit

# WANポートにPPPoEを紐づける
interface BVI 1
# PPPoEを有効化
 pppoe enable
# dialer pool 1を接続に使う
 pppoe-client dial-pool-number 1
exit

# dialer-group 1でIPv4を有効化する
dialer-list 1 protocol ip permit
  • ルーティング
# IPv4のデフォルトゲートウェイをPPPoEにする(基本はTransixに向けたいのでメトリックのコストを上げておく)
ip route 0.0.0.0 0.0.0.0 Dialer 1 100
  • NAPT(Cisco的にはPAT)の作成
# NAPTする内側アドレスの範囲を定義して有効化する
access-list 10 permit 192.168.0.0 0.0.255.255
ip nat inside source list 10 interface Dialer 1 overload

# NAPT外側interfaceの設定
interface Dialer 1
 ip nat outside
exit

# NAPT内側interfaceの設定
interface Vlan 10
 ip nat inside
exit
  • このあたりでping疎通確認してみる
    • 891FJから投げるとReflexive ACLが動かないので適当なクライアントPCから投げる

Transix系

# NGN系で作ったACLでip-ipプロトコル(4番)を許可する
ipv6 access-list v6WanIn
 permit 4 2404:8E00::FEED:100/127 any
exit

# ip-ipトンネルを作る
interface Tunnel 1
# IPアドレスはRFC6333で192.0.0.2が予約されているらしい
 ip address 192.0.0.2 255.255.255.252
# PPPoEで作ったACLを使い回す
 ip access-group v4WanIn in
 ip access-group v4WanOut out
# 物理interfaceはBVI1を使う
 tunnel source BVI1
# IPv4 over IPv6トンネルを指定
 tunnel mode ipv6
# トンネルの対向先
 tunnel destination 2404:8E00::FEED:100
# 最適なMTU値を探索する(入力してもshow runに出ないのでデフォルトっぽい)
 tunnel path-mtu-discovery
exit

# IPv4のデフォルトゲートウェイをTransixにする
ip route 0.0.0.0 0.0.0.0 Tunnel 1

SSH

  • ACLが正しくかかっていて外からつつけない事を確認しておく
# 適当にドメイン名をつける(つけないと鍵生成できない)
ip domain-name myhome.test
# rsa鍵を2048bitで作る
crypto key generate rsa modulus 2048
# SSH version2を使う
ip ssh version 2
# デフォルトでvty 0 4が定義されていたのでそれを上書きしていく
line vty 0 4
# local認証を有効化する(これが無いと公開鍵認証が通らなかった)
 login local
# vtyをsshで使う
 transport input ssh
# 無操作で切断されるまでの時間を120分にする
 exec-timeout 120 0
exit

# 公開鍵登録
ip ssh pubkey-chain
 username <ID>
  key-string
   <公開鍵を適当に分割しながら貼り付ける>
   exit
  exit
 exit

コンソール接続

  • 必ずSSH接続できるようになってから行う
    • コンソール接続すら出来なくなるとconfig初期化になる
# 適当にユーザーを作る
username <ID> secret <Password>
# コンソール接続でローカル認証かける
line console 0
 login local
exit

その他

  • radikoはPPPoE経由に向ける
    • Transixだと聴取エリアがコロコロ変わってしまう
ip route 203.211.199.120 255.255.255.255 Dialer 1
  • 最後に忘れず保存する
copy running-config startup-config

入れようとして結局やめたconfigメモ

  • DHCPv6でDNS設定もらう
    • 結局DNS設定無しで全部IPアドレス直打ちした
# ACLでDHCPv6とDNSを開ける
ipv6 access-list v6WanIn
 permit udp any any eq 546 # DHCPv6
 permit udp any eq domain any # DNS(うっかり外向けにDNS公開すると死ぬ気がする)

interface FastEthernet 0
# DNSの設定をDHCPv6からもらう
 ipv6 nd other-config-flag