radikoだけPPPoEを通して地元のラジオを聞きたい


要約

IPv4 over IPv6環境でのradikoの地域判定問題を回避するために、

  • radiko.jp へのパケットをPPPoEセッションに流す
  • 宛先FQDN指定で静的ルーティングできない端末(Google Home)は、DHCPの配布アドレスを固定して発信元IPアドレスで静的ルーティング

をやりましたという話です。対象はYAMAHAルータ。

背景

IPv4 over IPv6が流行ってますね。DS-LiteとかMAP-Eとか。
しかし、IPアドレスで地域を判定するradikoは東京/大阪扱いになってしまい、地方民には都会のラジオが聴けて便利地元局が聴けなくて不便です。
DS-LiteとPPPoEのマルチホームできればいいのだけど、手持ちの家庭用ルータでは不可能だったので、スマホのradikoアプリを使ったりしてました。

そこにYAMAHAルータを入れたので静的ルーティングを設定してみたという次第。

環境

  • IIJmioひかり+IPoEオプション (DS-LiteとIPv4 PPPoEの同時利用が可能)
  • YAMAHA RTX810

静的ルーティング設定

pp 1にPPPoEセッション、tunnel 1にDS-Liteトンネルの設定がされているものとします。


# IPフィルタ9000番にマッチしたパケットは pp 1 へ流す。その他は tunnel 1 へ。
ip route default gateway pp 1 filter 9000 gateway tunnel 1
# radiko.jp へのアクセスを捕捉する
ip filter 9000 pass * radiko.jp * * *

音声ストリームは別ドメインから来るようですが、地域判定自体はradiko.jpにアクセスした時点で決まるので、これで大丈夫そうです。

インターフェース切り替えを楽にする

試行錯誤するときには片方のインターフェースの有効/無効を切り替えたくなるので、実際には'ip route'コマンドを以下のようにしています。

ip route default gateway pp 1 filter 9000 hide gateway tunnel 1 weight 0 hide gateway pp 1 hide

こうしておくと、tunnel disable 1とするだけで全部のIPv4パケットがpp 1へ流れるようになります。逆にpp disable 1としてPPPoEを切断すれば、tunnel 1が使われます。
hideはインターフェースが無効の時に無視させる指定、weight 0は両方のインターフェースが有効な時に片方を優先させるための指定です。weight 0を外すと両方のインターフェースにパケットが分散されます。
DNSはNGNのIPv6 DNSを使っていれば何もしなくて大丈夫。

FQDN指定の罠

FQDNでのマッチングでは、ルータが実際のIPアドレスを知るためにDNSクエリをルータに処理させる必要があります。わざとルータのDNSキャッシュサーバ機能をスルーするような設定をしない限りは普通に動きます。

だがしかし、DHCPで配布されるDNSサーバアドレスを無視するGoogle Home miniってのがありまして。
こいつはGoogle Public DNS(8.8.8.8)に直接DNSクエリを投げてます。YAMAHAルータであればshow ip connectionとかshow nat descriptor address detailで確認できます。1

> show ip connection
(中略)
  58784    4300       domain  U 192.168.0.xxx:38782   > 8.8.8.8:53

ルータのDNSサーバ機能をスルーされるので、静的ルーティングのFQDN指定がマッチしなくなり、Google Homeに

(ラジオ局名)はお住まいの地域では利用できません

と言われてしまいます。

他の端末でradikoにアクセスしてからGoogle Homeに話しかければ回避できるけど面倒です。2
DNSサーバを変更する設定はなさそうなので、DHCPサーバから配布するIPv4アドレスを固定して、送信元IPアドレスを条件に静的ルーティングします。
対象のMACアドレスはGoogle Homeアプリか、show status dhcp summaryで調べましょう。

設定はこんな感じ。

# 追加するフィルタ番号を入れておく
ip route default gateway pp 1 filter 9000 9001 hide gateway tunnel 1 weight 0 hide gateway pp 1 hide
# ここは変わらず
ip filter 9000 pass * radiko.jp * * *
# 固定したIPアドレスを条件とするフィルタ
ip filter 9001 pass 192.168.0.199 * * * *
# DHCPのスコープ内からIPアドレスを選んで設定
dhcp scope bind 1 192.168.0.199 11:22:33:44:55:66

これでGoogle Homeに怒られずに済みます。
めでたしめでたし。

マニュアル等


  1. あと、63秒ごとに8.8.8.8にpingを打ってる。nat descriptor timer <descpriper_id> protocol=icmp 60ってやっておくとNATテーブルをちょっと節約できます。 

  2. 一旦回避できても、ストリーミングが途中で止まることもある。