Linux MintにてTailscaleと同時にMullvadを使う

LinuxにおいてTailscaleを使うと、それがVPNを専有してしまうようで、Mullvadのアプリを入れても使えなくなる。これが何とかならないかと調べてみると、Mullvad with Tailscale / Zerotierというものがあった。

ここでは、Linux Mint 21.1を対象としている。これは、Ubuntu 22.04.2をベースにしている。

概要

これは、mnfというBashスクリプトになる。前提条件としては、

  • Mullvadがインストールされており、mullvadのコマンドラインが使えること。
  • nftablesパッケージをインストールする(現在の環境には既にインストール済)
  • tailscaleがインストールされており、適切に設定されていること。

試行した際の実際の動作環境

  • tailscaleは以前から使用しており、ずっと動かしたまま。
  • mullvadはインストール済だが、tailscaleとは同時に使えないので、契約切れのまま放置状態。つまり、動作していない。
  • 今回、これを試してみるためにmullvadを再度一ヶ月契約した。

動作させる手順

設定の前に簡単に動作手順を見ていく。

mullvadには、もともとGUIが備わっており、そこでVPNのON/OFFができるのだが、これを使ってしまうと、tailscaleの方が動作しなくなってしまう。そうではなく、このスクリプトのmnfを使用してONする。

mnf up

これで、tailscaleの動作を損なわずにmullvadが起動できる。mullvadのGUIの方を見てみると、勝手に次の状態になっている。つまり、非接続状態だったのが、上記のコマンドを投入すると、勝手に接続状態になる。

では、「ONの時にVPNの出口はどう決めるんだ?」と言うと、設定に従って適当に決められてしまう。しかし、ONにした後は、GUIが自由に使えるので、これでシンガポールでもデンマークでも好きなVPN出口を指定することができる。

mullvadをOFFにするときは、

mnf down

を行う。

セットアップ

スクリプトをダウンロードする

git clone https://github.com/r3nor/mullvad-tailscale
cd mullvad-tailscale
chmod +x mnf

設定

mnfスクリプトファイルを編集する。必要なのは、最初の数行のみ。

  • RULES_DIRがmullvad.rulesのあるフォルダを指すようにする。これはmnfと同じフォルダに
    あるのだが、絶対パスにするようだ。デフォルトでは、$HOME/Software/mullvad-tailscaleになっている。
  • EXCLUDE_COUNTRY_CODESから、VPNで接続したくない国を2文字で指定する。少々意味がわからない。
  • INCLUDE_COUNTRY_CODESには、接続を強制したい国を2文字で指定する。これもまた少々意味がわからない。

RULES_DIRを適切に設定し、EXCLUDE_COUNTY_CODESは削除。INCLUDE_COUNTRY_CODESをjpとした。知らないうちに海外出口になっていると、国内のウェブに接続する場合に問題があるため。

RULES_DIR="$HOME/programs//mullvad-tailscale/" # Path to the dir in which mullvad.rules fi
le is located.
#EXCLUDE_COUNTRY_CODES=(us ca jp au hk gb) # Country codes to avoid. Set to '' to allow al
l.
INCLUDE_COUNTRY_CODES=(jp) # Country codes to connect to. Uncomment to use. Overridden by 
-c option. Overrides EXCLUDE_COUNTRY_CODES.

mullvad.rulesファイルを編集する。

  • EXCLUDED_IPSに、TailscaleのIPアドレス範囲を設定する。うちの場合は、「100.64.0.0/24」。
  • EXCLUDED_IPV6が必要なければ、コメント化
  • RESOLVER_ADDRSにTailscaleのDNSリゾルバを書くが、はじめから100.100.100.100になっている。

以下のようにした。

define RESOLVER_ADDRS = {
    100.100.100.100
}

define EXCLUDED_IPS = {
    100.64.0.0/24
}

# Comment the following block if you do not want IPv6 support.
#define EXCLUDED_IPV6 = {
#    exam:ple:change:exam:ple:add:ress:bf04,
#    exam:ple:change:exam:ple:add:ress:6951
#}

table inet mullvad-ts {
  chain excludeOutgoing {
    type route hook output priority 0; policy accept;
    ip daddr $EXCLUDED_IPS ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
    # Comment the following line if you do not want IPv6 support.
    #ip6 daddr $EXCLUDED_IPV6 ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
  }

  chain allow-incoming {
    type filter hook input priority -100; policy accept;
    iifname "tailscale0" ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
  }

  chain excludeDns {
    type filter hook output priority -10; policy accept;
    ip daddr $RESOLVER_ADDRS udp dport 53 ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
    ip daddr $RESOLVER_ADDRS tcp dport 53 ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
  }
}

Mullvadにログインする。

mullvad account login 123412341234123

動作しない場合

最初は、mullvad.rulesが間違っており、以下のエラーになった(先にあげたのは修正済のもの)。

$ ./mnf up
[INFO] Checking nftables rules validity...
[sudo] **** のパスワード:         
[NFT] /home//mullvad-tailscale//mullvad.rules:20:16-28: Error: unknown identifier 'EXCLUDED_IPV6'; did you mean identifier ‘EXCLUDED_IPS’?
[NFT] ip6 daddr $EXCLUDED_IPV6 ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
[NFT] ^^^^^^^^^^^^^
[ERROR] nftables rules are not valid. Fix them before running the script. Exiting.

上のエラーは、mullvad.rulesの間違いによるものだったが、他のエラーも発生する場合があるかもしれない。

その他

mnfには、様々なオプションがあるようだが、ON/OFFだけで事足りると思うので、試していない。

未分類

Posted by ysugimura