BGPで中国国内・国外IPの振り分けをより正確にする

BGPで中国国内・国外IPの振り分けをより正確にする

BGPをもとに中国国内・国外のIPを振り分けることで、透過プロキシの効率と精度を高めます。国外の宛先をFakeIPで識別すれば、メインルーターでより適切に通信を振り分けられます。sing-boxのDNS設定も見直し、DNSクエリを柔軟かつ効率的に処理して、ネットワーク全体の使い勝手を改善します。

これまでDebianをサイドルーターにするFakeIPを使った透過プロキシの振り分けの2回にわたって試し、自宅の透過プロキシはひとまず使える状態になりました。FakeIP方式では、国外のIPをFakeIPで識別し、メインルーターでそれを判別して振り分けます。sing-boxのDNSモジュールの設定は次のとおりです。

このDNS振り分けはルールセットに基づいています。まず、ドメインがgeosite-geolocation-!cnに含まれないことが条件です。そのうえで、ドメインがgeosite-cnまたはgeosite-category-companies@cnに含まれるか、名前解決後のIPがgeoip-cnに含まれていれば、中国国内向けと判断してRealIPを返します。それ以外はFakeIPを返します。

この判定はかなり大ざっぱです。ドメインのルールセットがよく使われるドメインしか網羅していないことに加え、IPルールセットのgeoip-cnはMaxMindのGeoLite2、元をたどればWHOISのデータに基づいています。多くの場合、わかるのはどの組織がIPを登録したかだけで、実際にどこで使われているかはわかりません。特にCN-IPの精度はかなり怪しいです。

ちょうど最近BGPを知ったので、解説を少し拝借します。

Border Gateway Protocol(BGP)は、ルーティングドメイン間でNetwork Layer Reachability Information(NLRI、ネットワーク層到達可能性情報)を交換するルーティングプロトコルです。各ドメインは異なる組織が管理するため、一般にAutonomous System(AS、自律システム)と呼ばれます。現在のインターネットは複数のASを相互接続した巨大なネットワークであり、BGPはインターネットの外部ルーティングプロトコルの事実上の標準として、ISP(インターネットサービスプロバイダー)間で広く使われています。

BGPでは、中国へ向かう通信の経路は中国国内のASが広報します。国内のすべてのASが広報するIPリストを集めれば、より正確なCN-IPリストになるはずです。

中国のネットワーク事情とWikipediaの情報によれば、グローバルインターネットと直接BGPセッションを確立できるのは、三大通信事業者、教育ネットワーク、科学技術ネットワークのみです。

自分でASを運用して完全なBGPテーブルを取得する解説はたくさんあります。ただ、面倒くさがりで他人の成果をありがたく使いたい私は、GitHubにBGPベースのCN-IPリストがすでにいくつもあるのを見つけました。今回はこのプロジェクトを使います:https://github.com/gaoyifan/china-operator-ip/blob/ip-lists/china.txt

リストが手に入ったので、ここからはコードの時間です!

コードに詳しくコメントを書いてあるので、細かな説明は省きます。

ルーターがOpenWrtなら、bash、ipset、iptablesなどを追加でインストールしてください。OpenWrtの標準シェルはashなので、このスクリプトは実行できません。

bash
opkg update
opkg install bash
opkg install curl
opkg install ipset
opkg install iptables

このCN-IPリストは1日1回更新されます。スクリプトを毎日実行する定期タスクを設定し、起動時にも実行するようにしておくとよいです。