Nuro 光で WireGuard (VPN) がつながらないとき

少し前に自宅回線を Nuro 光にしたのだが、気づいたら勤務先がホストしている VPN サーバーに WireGuard (VPN) で繋げなくなっていた。テザリング環境では接続できるので Nuro 光のせいで繋げられなくなったのだろうと仮定して、ルーターの設定をいじってみた。

我ながら間抜けな方法だと思うけど、Nuro から貸与されたルーター (SGP200W) の設定項目から怪しいものを端から on/off してみた。最終的には「パケット転送における IPv6 ファイアウォール制御を有効化」というチェックをオフにして解決できた。この “パケット転送における IPv6 ファイアウォール” はどう振る舞うものなのか、ぼんやり想像することくらいしかできないけど…。

SGP200W の IPv6 ファイアウォール制御

半年くらい前に価格コムで同じ (と思われる) 問題に遭遇している方がいたので、誰かの助けになるかもしれないと思って記事にした。

追記

次の記事を読んだ。

「ルーター + ONU」であるところの SGP200W で IPv6 ファイアウォールを無効にしても僕のデバイス群では問題ないだろう。しかし、家族が使う端末でも問題がないとは言い切れない (公開ポートが限定されているとは限らない)。IPv6 ファイアウォールを無効にするだけでは妥当な問題解決とは言えなそうだ。

そこで、元記事の内容に加えて IPv6 そのものを無効にした。

SGP200W で IPv6 を無効化

(「経路広告を有効にする」と「DHCPv6サーバを有効にする」のチェックを外している)

これで IPv6 の IP アドレスが割り振られなくなった…はず。少なくとも What Is My IP Address からは Not detected と言われるようになった。

IPv6 の無効化

プライベートサブネットの Locust クラスタで動いているウェブインタフェースに接続する

Locust のようなウェブアプリケーションに対するベンチマークツール (負荷試験ツール) を使うのであれば、アプリケーションが動いている場所と同じネットワークで起動するべきである。ベンチマークを取るときにネットワークの影響を軽減するためだ。

多くの場合はウェブアプリケーションはプライベートサブネット内で動くだろう。公開されたロードバランサが、ウェブアプリケーションにリクエストをフォワードするのである。この場合、Locust も同じプライベートサブネットで動かすべきである。しかし、Locust のウェブインタフェースに手元からアクセスしたい場合はどうすればよいだろう?

この場合、SSH のポートフォワードを使うのが最も手っ取り早い。

Locust のウェブインタフェース (通常はマスター) が ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com のポート 8089 (デフォルト) で動いているものとする。また、このプライベートサブネットに接続できる踏み台サーバが bastion.example.com と仮定する。その場合、次のコマンドでリモートで動いている Locust のウェブインタフェースに対してポートフォワードできる。

ssh -fNL 8081:ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com:8089 bastion.example.com

このコマンドを叩いた後で localhost:8081 をブラウザで開けば、手元のブラウザから Locust を管理できる。

Python で Socks プロキシを経由して目的とするサーバにアクセスする方法

この記事は何か?

Python で Socks プロキシを経由して目的とするサーバにアクセスする方法について書いた記事である。わたしは Python 3.8 環境で実験したけれど、Python 3 系であればバージョンを問わず同じように動かせるはずである。

具体的なコード

requestsPySocks が導入された状態で、次のようにプロキシの設定をする。なお、Socks プロキシそのものを作成する方法はこちらの記事を参考にしてほしい。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import requests

proxies = {
    'http' : "socks5h://localhost:1080",
    'https' : "socks5h://localhost:1080"
}

requests.get('http://somewhere.example.internal/ping', proxies=proxies)

何がハマりどころかというと、Socks プロキシの記述で socks5://localhost:1080 ではなく、socks5h://localhost:1080 としなければならない点である。そうでない場合、DNS での名前解決をローカルで行うため、Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known のようなエラーメッセージを見ることになる。