Open5

Linuxでtailscale VPNとllmnr/mdnsが干渉する問題の回避策

tbt_rpngtbt_rpng

概要

tailscaledを起動したホストに対してllmnr/mdnsで名前解決しようとすると応答がなくなる.

環境

  • Archlinux
  • systemd-networkdを用いてネットワーク設定
  • systemd-resolvedでllmnrを使用
  • tailscale

症状と状況

  • tailscaledを起動して(後述の条件を満たして)いれば,login・upしていなくても発動.
  • Archlinux公式パッケージの場合インストールだけでは発動しない.
  • tailscaledを起動しているホストに対するllmnr/mdnsの応答が帰ってこない
  • tailscaledを起動しているホストからのllmnr/mdnsは使用できる
  • systemd-resolvedを再起動すると復帰,systemd-networkdを再起動すると再発する.
    • 連続かつ高速で再起動した場合は(おそらくレースコンディションで)こうならないこともある.
  • 一度(systemd-resolved再起動で)復帰させても時間経過で再び壊れる.

対処法(失敗)

  1. 起動順序の設定
    tailscaledの疎通確認後(tailscale上のDNSにpingが通ったあと)systemd-resolvedが再起動するよう設定.
    -> 最初は良くても時間経過で壊れる
  2. ファイアウォールの設定変更
    該当ポート(5355・5355,TCPとUDP双方)を明示的に許可
    -> 動作変わらず
tbt_rpngtbt_rpng

とりあえずの回避策

  • コンテナに隔離
  • 少なくともsystemd-nspawn内だといい感じに権限が剥奪されるのか,llmnrとtailscaleが両立できた
    • ある意味解決かも
    • 別のタイミングでは再発した
tbt_rpngtbt_rpng

原因判明

systemd-networkdの再起動等でtailscaledの再設定(具体的なものはわからない)が走ると,ネットワークインターフェイスのマルチキャスト設定が消失するっぽい.
ip l set wlan0 multicast off ip l set wlan0 multicast on(wlan0はそれぞれ具体的なインターフェイス名に置き換え)を実行してリセットすることで解決!!(systemd-resolvedの再起動でもOK)
ip maddress show dev wlan0を実行することで現在所属しているマルチキャストグループが確認できる.

tbt_rpngtbt_rpng

うまく自動化したい.systemdのtimerで上手いことできると思う.あるいはip monitor