Raspberry PiでSurfshark VPNルーターを作る【Buster/Bullseye】

Raspberry Pi

Raspberry Piを通過する全ての通信がSurfsharkを経由するクライアントルーターを作ります。

Busterまでは転送ルールにiptablesが用いられていましたが、bullseyeからはnftablesが標準になったので設定方法が変わります。

本記事ではhostapdを使って無線(wlan0)で接続を受けて有線(eth0)でインターネット側へ通信する形にしました。


準備

  • raspberry pi 4 model B / 2GB (なんでもいい)
  • microSD 32GB (imagerでRaspiOS Buster or Bullseyeインストール済み)
  • Surfshark契約アカウント

※ルーター用途ではlite版をインストールする方が多いようですが私はデスクトップ版をお勧めします。ちなみにBookwormはNetworkManagerが標準になりましたが、ルーター用途には無理です。

一応ターミナルを開いて最新版にアップデートはしておきましょう。

sudo apt update
sudo apt upgrade

DHCPの設定をする

dhcpcdを使うので設定します。

sudo nano /etc/dhcpcd.conf

エディタで以下を追加しましょう。

interface wlan0
static ip_address=172.16.1.1/24
nohook wpa_supplicant

interface eth0
static domain_name_servers=1.1.1.1  #若しくは8.8.8.8

IPは適当なので任意で変更して下さい。

nohook wpa_supplicantは必ず記述しないとwlan0がアクセスポイントとして動作してくれません。

DNSに関してはeth0に変に9.9.9.9(Quad9)や208.67.222.222(OpenDNS)等にしてしまうとリークしますので必ず1.1.1.1(Cloudflare)か8.8.8.8(GoogleDNS)にしましょう。 

また空白にしても生IPがリークします。

そして再起動して設定を反映します。

sudo reboot

DNSmasqを設定

Dnsmasqをインストールし、構成ファイルを編集。

sudo apt install dnsmasq
sudo systemctl stop dnsmasq
sudo nano /etc/dnsmasq.conf


wlan0側のDHCP範囲を指定します。

interface=wlan0
dhcp-range=172.16.1.10,172.16.1.100,255.255.255.0,24h

ちなみにこちら側でDNS設定(server=1.1.1.1)する事も可能ですが、
結局/etc/dhcpcd.confに干渉するのでしなくていいです。


hostapdでアクセスポイントを構築

hostapdをインストールして設定ファイルを編集します。

sudo apt install hostapd
sudo systemctl stop hostapd

sudo nano /etc/hostapd/hostapd.conf



以下の記述を追加

interface=wlan0
driver=nl80211
ssid=RaspberryPiVPN
wpa_passphrase=raspberrypasswd
hw_mode=g
channel=6
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

SSIDとパスワードは任意です。

チャンネルも状況によって変更をお願いします。 

そしてBusterでは以下のファイルに設定ファイルを指定する記述が必要です。Bullseyeは不要です。

sudo nano /etc/default/hostapd


DAEMON_CONF="/etc/hostapd/hostapd.conf" 

その後有効化してアクセスポイントが出来ているか確認しましょう。

sudo systemctl unmask hostapd
sudo systemctl enable hostapd

ちなみに今の状態でアクセスポイントに接続してもルーティングが出来ていない為、ネットには繋がらないです。 

パケット転送を許可する

まずデフォルトではパケット転送自体が出来ないのでカーネルパラメータを編集します。

sudo nano /etc/sysctl.conf

以下の記述を探し

#net.ipv4.ip_forward=1

#を外す事でインターフェース間のパケット転送が可能になります。

net.ipv4.ip_forward=1

※ipv6は使いたくないので省いています

OpenVPNを構築

OpenVPNと解凍ソフトをインストール

sudo apt install openvpn unzip

OpenVPNフォルダに移動し、Surfsharkから構成ファイルのアーカイブをダウンロード

cd /etc/openvpn
sudo wget https://my.surfshark.com/vpn/api/v1/server/configurations



解凍後、アーカイブは邪魔なので削除

sudo unzip configurations
sudo rm configurations



リストコマンドを実行すると、各国別.ovpnファイルがある筈なので

好きなプロトコル(TCP/UDP)とサーバーを選びます。

今回はUDPでコロンビアのサーバーを選んでみます。

ls
sudo openvpn co-bog.prod.surfshark.com_udp.ovpn



念の為、VPNに繋がる事を確認しましょう。
手動接続用のユーザー名とパスワードはhttps://my.surfshark.com/vpn/manual-setup/routerから確認出来ます。

後で使うので取っておきましょう。

OpenVPNが自動実行するよう設定する

以下のファイルを編集し

sudo nano /etc/openvpn/auth.txt

Surfsharkの手動接続用ユーザー名とパスワードを記述し保存します。

Username
Password

以上の記述のみでOKです。

次は使用する構成ファイルをコピーして、そのコピーに別の名前と拡張子を付ける必要があります。 

今回はco-bog.prod.surfshark.com_udp.ovpnを使うので、

sudo cp /etc/openvpn/co-bog.prod.surfshark.com_udp.ovpn /etc/openvpn/co-bog.conf

とします。
.confにするのはOpenVPNソフトウェアの仕様です。

そしてコピーした構成ファイルを編集します。   

sudo nano /etc/openvpn/co-bog.conf

以下の記述を探して

auth-user-pass

先ほどのユーザー名とパスワードを記述したファイルをスペースして追加します

auth-user-pass auth.txt

次は以下のファイルを編集します。

sudo nano /etc/default/openvpn

以下の記述がある筈なので

#AUTOSTART="all"

先ほど名前を変えたファイル名を拡張子を除いて記述し、#を外す。

AUTOSTART="co-bog"



その後、OpenVPNを有効にする

sudo systemctl enable openvpn

再起動して自動実行できているか確認しましょう

sudo reboot

【Buster】iptablesで全ての接続をtun0経由にする

iptablesで転送ルールを設定します。

以下のパッケージをインストールします。

sudo apt install iptables-persistent

通過する通信全てをOpenVPNのインターフェースtun0経由にします。

sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
sudo iptables -A FORWARD -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o tun0 -j ACCEPT

そして、ルールが永続的に有効になるように保存します。

sudo netfilter-persistent save

【Bullseye】nftablesで全ての接続をtun0経由にする

好きな場所に好きな名前でルールファイルを作成します。

sudo mkdir /etc/nftables
sudo nano /etc/nftables/rule.nft

以下の記述をして保存します。

flush ruleset

table inet vpn {
chain routethrough {
type nat hook postrouting priority filter; policy accept;
oifname "tun0" masquerade
}

chain fward {
type filter hook forward priority filter; policy accept;
iifname "tun0" oifname "wlan0" ct state established,related accept
iifname "wlan0" oifname "tun0" accept
}
}

実行権限を付与します

sudo chmod +x /etc/nftables/rule.nft

その後以下を編集します。

sudo nano /etc/nftables.conf

includeでルールを呼び出すように記述します。

#!/usr/sbin/nft -f
flush ruleset
table inet filter {

chain input {

type filter hook input priority 0;

}

chain forward {

type filter hook forward priority 0;

}

chain output {

type filter hook output priority 0;

}

}

include "/etc/nftables/rule.nft" #ここに追加
#改行スペース

注意点はincludeを最後尾にするのではなく、改行して下に無の行を作るのを忘れないようにしましょう。

最後尾が改行されていないと動作しない仕様がある為、デフォルトでも”}”の下は改行スペースがあります。

その後、有効化して完了です。

sudo systemctl enable nftables

構築後のテスト

以上で完成です。再起動してアクセスポイントに接続し全てがVPN経由になっているか確認します。

以下のサイト等でリークテストしましょう。

DNS leak test - Surfshark
DNS leaks pose a great danger to your digital privacy and security. Check your VPN’s integrity here and stay protected o...

※↑公式ですがSurfsharkVPNのDNSさえ含まれていれば、他に未経由のDNSがあってもOK判定を出すガバガバ仕様なので注意

DNS leak test
DNSleaktest.com offers a simple test to determine if you DNS requests are being leaked which may represent a critical pr...

ここが一番です。時間はかかりますがExtended testをしましょう。

DNSがVPN一つだけになっていたらOKです。

他プロバイダー、生IPが出たらアウトです。

ちなみにOpenVPNは別件でDNSリーク不具合が存在しているので、苦悩する人々のやり取りが検索結果に溢れています。

しかしアップデートでとうに修正されていたりWindowsのみの問題だったりするので、上記テストでリークを発見してもOpenVPN構成ファイルに何らかの記述を追加して防ごうとする試みは全く無駄なので止めましょう。

script-security 2
up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-conf

↑この手の奴です。

確実にdhcpcdやdnsmasqの設定の不備なのでそっちを見直しましょう。

参考サイト

https://support.surfshark.com/hc/en-us/articles/360013425373-How-to-set-up-Surfshark-VPN-on-Raspberry-Pi-
https://pimylifeup.com/raspberry-pi-surfshark/
https://thepi.io/how-to-use-your-raspberry-pi-as-a-vpn-router/
https://wiki.nftables.org

広告 ISP追跡を回避する【SurfShark】

コメント

タイトルとURLをコピーしました