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だけで事足りると思うので、試していない。