DigiLoog

PC関係の事なら何でもいけるそんな処

Squid 5.xでIPv4/IPv6の優先設定が無くなった

2023年01月08日(日) - 21:50 | カテゴリ: 雑談

Squid 4.x以下は通信時にIPv4/IPv6の何れかを優先する”dns_v4_first”設定があったが、
Squid 5.x以上ではOSのHappy Eyeballs (RFC8305)に従い通信する様になったので、
優先を変更する設定が削除されてしまった。

OS実装に従い通信するのはアプリケーションからしたら全うな実装方法だし、
自分がプログラムを書く時も同様の実装をする事が多い。
その上で、Happy Eyeballsは発展途上な所もまだまだ多く、
基本はIPv4を選んでくれるけれど条件次第でIPv6に切り替わってしまう場合が多々発生する。

通常のアプリケーションではコレでも問題になる事はあまり無いが、
IPv6での通信を優先させつつIPv6で通信出来ない時のみIPv4で通信させたい時には問題になる。
筆者がSquidを利用する目的がまさにコレなので問題になった (´・ω・`)

Squid MLや海外の技術フォーラムを回って回避方法が無いか探したり、
ソースを読みながら試行錯誤もしたのだが、最終的にコレを解決する事は出来なかった。

Squid公式wikiにも記載されている”tcp_outgoing_address”を使う方法が良く出てくるのだが、
コレはSquid 5.xでは動作しない地雷設定となる。
Magic ACLとして宛先FQDNのDNS名前解決をして動かす意図の様だが、
前提となる”tcp_outgoing_address”を動作するす条件に合致しないのでトラフィック分散が機能しない。

squid.conf.documentにも書いてある通り、
“tcp_outgoing_address”は送信元アドレスかユーザ認証Proxy時のユーザ名でのみ動作する。
その為、wikiに書いてある様な宛先FQDNのAAAAレコード有無で通信先を切り替える事が出来ない。

DNSキャッシュサーバでDNS応答レコードを細工してAAAAレコードとDNS64に変換する手法もあるが、
サーバ用途でDNS応答を改ざんすると他サーバの挙動にも影響が出そうなのでやらない方が良い。
DNS64はNAT64も必要なのでハードルが高い上、
IPv6からIPv4へ通信する時にアドレス変換を挟むので通信自体への影響が大きい。

それなら、Happy Eyeballsの挙動をLinux Kernelでチューニングする方法も考えたのだが、
該当しそうなパラメータがLinux Kernelに見当たらなかったのであきらめた。
最新のソースコードを読めば追加オプションが出てきそうだが、
筆者環境のサーバでKernelビルドは開発環境以外はやらない様にしたので結果として使えない。

他にもPACファイルを使ってDNS名前解決を応用しつつ振り分ける手法も検証してみたが、
どれも上手くいかず没になった。

WindowsにNICを追加してIPv4とIPv6でそれぞれ通信出来る様にもしてみたが、
何故かIPv4を優先して通信してしまいやりたい事が出来なかった。
NICを1本にしてデュアルスタックにする事も手だったのだが、
匿名IPv6の扱いとかも設計する必要が出てきたので同様に没に。
そもそも、サーバと端末のNW設計を変更する必要が出てくるので簡単に出来るレベルではなかった。

普通の用途ならHappy Eyeballsに従う実装で問題無いが、
筆者環境ではIPv6を優先する動きに固定したかった為、諦めてSquid 4.xへダウングレードする事にした。
いつかはアップグレードをする必要はあるが、ちゃんと設計してからの方が良さそうなので、
バックボーンを大幅アップグレードする時の課題にしようと思う。





  • 応援中

    はじめるセカイの理想論 -goodbye world index-