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経由になっているか確認します。
以下のサイト等でリークテストしましょう。
※↑公式ですがSurfsharkVPNのDNSさえ含まれていれば、他に未経由のDNSがあってもOK判定を出すガバガバ仕様なので注意
ここが一番です。時間はかかりますが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
コメント