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

# 背景
スクレイピングをする際にnordvpnの[Windowsソフト](https://nordvpn.com/ja/download/windows/)を使用してPCをVPNを繋いでいた

この方法だとスクレイピングではない通信もVPN経由となる為、通信速度が遅くなったりゲームとの接続が切れたり、[Googleに接続できない](https://www.reddit.com/r/nordvpn/comments/13updx2/i_can_no_longer_use_google_when_nordvpn_is_active/)などの問題に悩まされる。その解消方法の一案としてスクレイピングをNordVPNのProxy経由で行うことにした。

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

# 手順
## 使用するDocker Image
Docker hubにある[jeroenslot/nordvpn-proxy](https://hub.docker.com/r/jeroenslot/nordvpn-proxy)を使用する。[github](https://github.com/Joentje/nordvpn-proxy)

## ユーザー名とパスワードを取得する
サービス -> NordVPN -> [手動設定](https://my.nordaccount.com/ja/dashboard/nordvpn/manual-configuration/)より、ユーザー名とパスワードを取得する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838545/c6bd41e3-b1c3-dffa-2e35-43c224af1632.png)

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

## コマンド
```shell
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-proxy](https://github.com/Joentje/nordvpn-proxy)の[Environment Variables](https://github.com/Joentje/nordvpn-proxy?tab=readme-ov-file#environment-variables)より自動翻訳して引用。

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

```shell
# proxy無しでIPアドレスを取得
curl https://ifconfig.me
# 経由でIPアドレスを取得
curl -x localhost:8118 https://ifconfig.me
```
これで二つのIPアドレスが異なっていればOK

### python requests
```python
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
```python
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のサイト](https://refer-nordvpn.com/ClziUzUtdba)にアクセスをして、ヘッダーが「無防備」ではなく「保護済み」になってればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838545/ad53ba9b-c4bc-980b-3f5a-525d4caf305f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838545/c45369b2-2795-246b-a8f9-e65cea881581.png)
※IPはマスクしました。

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

# 応用
```shell
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](https://hub.docker.com/r/jeroenslot/nordvpn-proxy) を使用するとnordvpnのproxyコンテナを作成できます

# 宣伝(招待リンク)

[お友達紹介リンク](https://refer-nordvpn.com/ClziUzUtdba) を使用した登録は下記の特典が付くので、もし検討している方はご一考ください。

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

書いていて思いましたが、結構紹介特典がしょぼいので[ハピタス](https://m.hapitas.jp/item/detail/itemid/77465?i=24116723&route=pcText&apn=itemsharelink)経由でダウンロードしてポイント貰った方がお得かもしれません。