Raspberry Piを通過する全ての通信がSurfshark(OpenVPN)を経由するクライアントルーターを作ります。
今回は無線(wlan0)で接続を受けて有線(eth0)でインターネット側へ通信するアクセスポイント型にしました。
※OSはbuster(Debian10)でのみ動作します。
bullseyeではiptables周りの変更があったので後述のやり方では通信出来ないです。
OpenVPNをインストール
ターミナルを開き、最新版にアップデートしておきましょう。
sudo apt update sudo apt upgrade
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が自動実行するよう設定する
nanoエディタで以下のファイルを編集し
sudo nano /etc/openvpn/auth.txt
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"
先ほど名前を変えたファイル名を拡張子を除いて記述し、#を外す。
その後、OpenVPNを有効にする
AUTOSTART="co-bog"
その後、OpenVPNを有効にする
sudo systemctl enable openvpn
再起動して自動実行できているか確認しましょう
まず先にDHCPを設定します。
sudo reboot
DHCPの設定をする
まず先にDHCPを設定します。sudo nano /etc/dhcpcd.conf
以下を追加しましょう。
nohook wpa_supplicantは必ず記述しないとwlan0がアクセスポイントとして動作してくれません。
DNSに関しては変に9.9.9.9(Quad9)や208.67.222.222(OpenDNS)等にしてしまうとリークしますので
必ず1.1.1.1(Cloudflare)か8.8.8.8(GoogleDNS)にしましょう。
そして再起動して設定を反映します。
念の為、ブラウザを開いて以下のサイト等でリークテストしましょう。
https://surfshark.com/dns-leak-test
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.8IPは適当なので任意で変更して下さい。
nohook wpa_supplicantは必ず記述しないとwlan0がアクセスポイントとして動作してくれません。
DNSに関しては変に9.9.9.9(Quad9)や208.67.222.222(OpenDNS)等にしてしまうとリークしますので
必ず1.1.1.1(Cloudflare)か8.8.8.8(GoogleDNS)にしましょう。
そして再起動して設定を反映します。
sudo reboot
念の為、ブラウザを開いて以下のサイト等でリークテストしましょう。
https://surfshark.com/dns-leak-test
※↑公式ですがDNSにSurfsharkVPNのIPさえ含まれていれば、他のDNSが生IPもろ出しでもOK判定を出すガバガバ仕様なので注意
https://www.dnsleaktest.com/
次はDnsmasqをインストールしてwlan0側のDHCP範囲を設定していきます。
https://www.dnsleaktest.com/
次はDnsmasqをインストールしてwlan0側のDHCP範囲を設定していきます。
sudo apt install dnsmasq sudo nano /etc/dnsmasq.conf
以下の記述を追加します。
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 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=CCMPSSIDとパスワードは任意です。
チャンネルも状況によって変更をお願いします。
その後以下のファイルを編集
以下の記述を探す
#を外して、先ほどの設定ファイルを指定して保存。
再起動してアクセスポイントが出来ているか確認しましょう。
ちなみに今の状態でアクセスポイントに接続してもネットには繋がらない筈です。
まずデフォルトではパケット転送自体が出来ないのでカーネルパラメータを編集します。
sudo nano /etc/default/hostapd
#DAEMON_CONF=""
DAEMON_CONF="/etc/hostapd/hostapd.conf"
再起動してアクセスポイントが出来ているか確認しましょう。
ちなみに今の状態でアクセスポイントに接続してもネットには繋がらない筈です。
iptablesで全ての通信をOpenVPN経由にする
まずデフォルトではパケット転送自体が出来ないのでカーネルパラメータを編集します。sudo nano /etc/sysctl.conf
以下の記述を探し
#net.ipv4.ip_forward=1
#を外す事でインターフェース間のパケット転送が可能になります。
net.ipv4.ip_forward=1
次にiptablesで転送ルールを設定します。
以下のパッケージをインストールします。
sudo apt install iptables-persistent
通過する通信全てをiptablesで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
そして、ルールが永続的に有効になるように保存します。
再起動してアクセスポイントに接続しましょう。
全てがVPN経由になっている筈です。
お疲れさまでした。
sudo netfilter-persistent save
再起動してアクセスポイントに接続しましょう。
全てがVPN経由になっている筈です。
お疲れさまでした。