Raspberry PiでNordVPNルーターを作る【Nordlynx】

Raspberry Pi

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テストをしましょう

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

OpenVPNと違って基本漏れる事はないでしょう。

お疲れ様でした。

参考サイト

https://support.nordvpn.com/hc/en-us/articles/20196094470929-Installing-NordVPN-on-Linux-distributions
https://wiki.nftables.org

広告 オフィシャルサイト【NordVPN】

コメント

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