🔖

NordvpnをDocker上で動かしてproxyにする

2024/09/21に公開

背景

スクレイピングをする際にnordvpnのWindowsソフトを使用してPCをVPNを繋いでいた

この方法だとスクレイピングではない通信もVPN経由となる為、通信速度が遅くなったりゲームとの接続が切れたり、Googleに接続できないなどの問題に悩まされる。その解消方法の一案としてスクレイピングをNordVPNのProxy経由で行うことにした。

こうすることによりスクレイピングしながらも普通にゲームが出来てGoogle検索もできるのでHappy

手順

使用するDocker Image

Docker hubにあるjeroenslot/nordvpn-proxyを使用する。github

ユーザー名とパスワードを取得する

サービス -> NordVPN -> 手動設定より、ユーザー名とパスワードを取得する。

image.png

Docker準備

Dockerより最新のDockerをダウンロードしてインストールする。
インストール直後、dockerコマンドが使用できなかったら再起動するとdockerコマンドが使えるようになる。使えなかったら手動でパスを通してみてください。

コマンド

docker run -d \
--cap-add=NET_ADMIN \
--name=vpn \
--dns=103.86.96.100 \
--dns=103.86.99.100 \
--restart=always \
-e "USERNAME=<nordvpn_username>" \
-e "PASSWORD=<nordvpn_password>" \
-e "LOCAL_NETWORK=192.168.1.0/24" \
-v /etc/localtime:/etc/localtime:ro \
-v ovpn-data:/app/ovpn/config \
-p 8118:8118 \
jeroenslot/nordvpn-proxy:latest 

ここで使用するusernameとpasswordは一つ前の箇所で取得したものを使用する。

これで、 http://localhost:8118 をproxyとして設定すればnordvpnの接続ができる。

環境変数について

  • USERNAME アカウントのユーザー名
  • PASSWORD アカウントのパスワード
  • LOCAL_NETWORK - ローカルIPネットワークのCIDRマスク(例: 192.168.1.0/24 または 10.1.1.0/24、または複数のネットワーク 192.168.1.0/24,10.1.1.0/24,172.16.2.0/24)。これはクライアントに応答するために必要です。
  • CRON この変数を設定して、デフォルトの15分ごとのチェックを変更できます。これは、LOADがまだOKかどうかを確認するために使用されます。この設定はCRON構文を使用して変更できます。
  • LOAD NordVPN サーバーのロードが75を超える場合、OpenVPNが再起動され、推奨サーバーに接続されます!このチェックはCRONによって15分ごとに行われます。
  • RANDOM_TOP 任意 設定すると、推奨サーバーの上位"x"個からランダムに選択します。有効な値は1からnordが持つサーバー数までの整数です。
  • COUNTRY 任意 NordVPNがサポートする2文字の国コードを使用して、任意の国を選択できます。
  • PROTOCOL 任意 デフォルトはtcpに設定されており、udpに変更できます。
  • SERVER 任意 設定しない場合、推奨サーバーに接続します。設定すると、指定したサーバーに接続します。サーバー名の形式例: us2484.nordvpn.com。
  • REFRESH_TIME 任意 デフォルトは120分です。設定した分数後にのみNordVPN OVPNファイルを再ダウンロードします。

Joentje/nordvpn-proxyEnvironment Variablesより自動翻訳して引用。

動作確認 / 実際のスクレイピングで使用する方法

curl

# proxy無しでIPアドレスを取得
curl https://ifconfig.me
# 経由でIPアドレスを取得
curl -x localhost:8118 https://ifconfig.me

これで二つのIPアドレスが異なっていればOK

python requests

import requests

proxies = {
    "http": "http://localhost:8118",
    "https": "http://localhost:8118",
}
response = requests.get('https://ifconfig.me')
print(response.text)
response = requests.get('https://ifconfig.me', proxies=proxies)
print(response.text)

これで二つのIPアドレスが異なっていればOK

python selenium

from selenium.webdriver.chrome.service import Service
from selenium import webdriver

driver_path = "driverのpath"
service = Service(executable_path=driver_path)
options = webdriver.EdgeOptions()
options.add_argument(f'--proxy-server={proxy_address}')
driver = webdriver.Edge(service=service, options=options)

※自分がEdgeを使用しているのでwebdriver.EdgeOptions()webdriver.Edgeを使用しています。適宜FirefoxやChrome,Ie,Chromium,Safari等で読み替えてください。

上記のコードでEdgeが起動するはずなので、nordvpnのサイトにアクセスをして、ヘッダーが「無防備」ではなく「保護済み」になってればOK
image.png
image.png
※IPはマスクしました。

あるいは https://ifconfig.me を開いてIPアドレスを確認してみて、
普通に開いたブラウザでも開いてIPアドレスに差が出ているならOK

応用

docker run -d \
--cap-add=NET_ADMIN \
--name=vpn1 \
--dns=103.86.96.100 \
--dns=103.86.99.100 \
--restart=always \
-e "USERNAME=<nordvpn_username>" \
-e "PASSWORD=<nordvpn_password>" \
-e "LOCAL_NETWORK=192.168.1.0/24" \
-v /etc/localtime:/etc/localtime:ro \
-v ovpn-data:/app/ovpn/config \
-p 8119:8118 \
jeroenslot/nordvpn-proxy:latest 

で、 http://localhost:8119 に二つ目のproxyを立てる事が出来ます。

同様に3つ目, 4つ目のproxyも作成することができます。

まとめ

jeroenslot/nordvpn-proxy を使用するとnordvpnのproxyコンテナを作成できます

宣伝(招待リンク)

お友達紹介リンク を使用した登録は下記の特典が付くので、もし検討している方はご一考ください。

- 1年または2年プランを選ぶと3か月分の無料期間
- 1か月プランを選ぶと1か月分の無料期間
がもらえます。

書いていて思いましたが、結構紹介特典がしょぼいのでハピタス経由でダウンロードしてポイント貰った方がお得かもしれません。

Discussion