RaspberryPiを通過する全ての通信がNordVPNを経由にするルーターを作ります。
以前OpenVPNを用いてSurfsharkルータを作りましたが、応用すればNordVPNでも可能です。
しかしこの方法には致命的な欠陥があります。
NordVPNのopvnファイルはサーバー毎に存在していますが、頻繁に接続不能になる上自動で別サーバーへ再接続しない仕様です。余程当たりのサーバーを引かないと使い物になりません。
そこで今回は公式のNordVPN公式のクライアントソフトを使いルータを構築します。
hostapdで無線(wlan0)で接続を受け、パケットをNordVPNインターフェース(nordlynx)へ転送、有線(eth0)でインターネット側へ通信という流れです。
準備
- raspberry pi本体
- microSD 32GB (imagerでRaspiOS Buster or Bullseyeインストール済み)
- NordVPN契約アカウント
※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は任意。
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
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は省いています
NordVPN設定
ターミナルを開き、公式からインストールします。
sh <(curl -sSf https://downloads.nordcdn.com/apps/linux/install.sh)
or
sh <(wget -qO - https://downloads.nordcdn.com/apps/linux/install.sh)
その後許可設定
sudo usermod -aG nordvpn $ USER
そして再起動します。
その後ログイン設定
nordvpn login
ブラウザでログイン完了後
nordvpn connect
で接続できます。ちなみに国を選ぶ場合は
nordvpn countries
で一覧が出ます。
Albania Greece Portugal
Argentina Hong_Kong Romania
Australia Hungary Serbia
Austria Iceland Singapore
Belgium Indonesia Slovakia
Bosnia_And_Herzegovina Ireland Slovenia
Brazil Israel South_Africa
Bulgaria Italy South_Korea
Canada Japan Spain
Chile Latvia Sweden
Costa_Rica Lithuania Switzerland
Croatia Luxembourg Taiwan
Cyprus Malaysia Thailand
Czech_Republic Mexico Turkey
Denmark Moldova Ukraine
Estonia Netherlands United_Kingdom
Finland New_Zealand United_States
France North_Macedonia Vietnam
Georgia Norway
Germany Poland
お好きな国に接続してください。(例:モルドバ)
nordvpn connect Moldova
再起動しても自動接続されるように以下をonにします。
nordvpn set autoconnect on
【Buster】iptablesで全ての接続をnordlynx経由にする
Busterの場合はiptablesで転送ルールを設定します。
以下のパッケージをインストールします。
sudo apt install iptables-persistent
通過する通信全てをNordLynxのインターフェースのnordlynx経由にします。
sudo iptables -t nat -A POSTROUTING -o nordlynx -j MASQUERADE
sudo iptables -A FORWARD -i nordlynx -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o nordlynx -j ACCEPT
そして、ルールが永続的に有効になるように保存します。
sudo netfilter-persistent save
【Bullseye】nftablesで全ての接続をnordlynx経由にする
Bullseyeの場合はnftablesを使います。
好きな場所に好きな名前でルールファイルを作成します。
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 "nordlynx" masquerade
}
chain fward {
type filter hook forward priority filter; policy accept;
iifname "nordlynx" oifname "wlan0" ct state established,related accept
iifname "wlan0" oifname "nordlynx" 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" #ここに追加
#改行スペース
最後尾は改行すべし。
その後、有効化して完了です。
sudo systemctl enable nftables
NordVPNソフト側の設定でパケット転送を有効化する
ここからが重要ですが、現時点の最新バージョンでは素直にパケット転送が出来ません。
(3.18.0以前なら可能でした)
そこで以下のように設定を変えます。
nordvpn set lan-discovery on
nordvpn set firewall off
これで出来るようになる筈です。
実は上記変更がなくても起動後に下記コマンドでnftablesをリスタートさせれば
sudo systemctl restart nftables
ルールが上書き構築されるのでその時のみパケット転送が出来るようにはなります。
ならNordVPN起動後、nftablesをonbootsecなどで遅延させて起動させれば・・・と色々試行錯誤しましたが無駄でした。
公式もセキュリティ的な観点からパケット転送を推奨していない為、アプデで修正してくれるかも定かではありません。今は素直に設定を変えましょう。
構築後のテスト
では以下のサイトでDNSleakテストをしましょう
OpenVPNと違って基本漏れる事はないでしょう。
お疲れ様でした。
参考サイト
https://support.nordvpn.com/hc/en-us/articles/20196094470929-Installing-NordVPN-on-Linux-distributions
https://wiki.nftables.org
コメント