「HTTP・SOCKS・透過プロキシ・UDP」の版間の差分

Notion-MW
 
Notion-MW
1行目: 1行目:
SOCKS・透過プロキシ・UDP-over-TCPなどを中心に、ネットワークの変更に使えるプロキシ関連の各種技術を雑にまとめた。
近年はGo製のものが多い。また検閲に対抗するためか、中国系(中国語でissueが投稿されているなど)のものが多い。gost, go-proxy, hysteria, txthinking/socks5, things-go/socks5などはいずれもその2つに当てはまる。たまにロシア系もある。
近年はGo製のものが多い。また検閲に対抗するためか、中国系(中国語でissueが投稿されているなど)のものが多い。gost, go-proxy, hysteria, txthinking/socks5, things-go/socks5などはいずれもその2つに当てはまる。たまにロシア系もある。


35行目: 37行目:
==== shadowsocks ====
==== shadowsocks ====


shadowsocksはSOCKSに暗号化を施した独自プロトコルで、いくつかの実装がある。[https://github.com/shadowsocks/shadowsocks-rust https://github.com/shadowsocks/shadowsocks-rust]などが主流とみられる。
SOCKSに暗号化を施した独自プロトコルで、いくつかの実装がある。[https://github.com/shadowsocks/shadowsocks-rust https://github.com/shadowsocks/shadowsocks-rust]などが主流とみられる。


VPN以外だとこれが現在主流と思われる。
VPN以外のGFW回避ソフトウェアだとおそらくもっともメジャー。


サーバーとクライアントに分かれていて、クライアント側では透過プロキシにも対応している。
サーバーとクライアントに分かれていて、クライアント側では透過プロキシにも対応している。
53行目: 55行目:
HTTP・HTTPSのリバースプロキシで、host(HTTPの場合)あるいはsni(HTTPSの場合)に基づいてアクセスを振り分けるものをSNI Proxyと呼ぶことがあるらしい。<strong>Nginx</strong>や<strong>HAProxy</strong>のような汎用のプロキシサーバーでも使える機能だが、これを専門とするソフトウェアもある。
HTTP・HTTPSのリバースプロキシで、host(HTTPの場合)あるいはsni(HTTPSの場合)に基づいてアクセスを振り分けるものをSNI Proxyと呼ぶことがあるらしい。<strong>Nginx</strong>や<strong>HAProxy</strong>のような汎用のプロキシサーバーでも使える機能だが、これを専門とするソフトウェアもある。


* こんな使い方もある→ [https://turgenev.hatenablog.com/entry/2025/03/21/020550 【Android】NextDNSをアプリごとに有効無効切り替え+Tailscale経由の自宅鯖を使ってControl D風のトラフィック転送 &#45; turgenev’s blog]
* こんな使い方もある(自分の記事)→ [https://turgenev.hatenablog.com/entry/2025/03/21/020550 【Android】NextDNSをアプリごとに有効無効切り替え+Tailscale経由の自宅鯖を使ってControl D風のトラフィック転送 - turgenev’s blog]


<span id="dlundquistsniproxy"></span>
<span id="dlundquistsniproxy"></span>
80行目: 82行目:
==== Dante ====
==== Dante ====


[https://www.inet.no/dante/index.html https&#58;//www.inet.no/dante/index.html]
[https://www.inet.no/dante/index.html Dante - A free SOCKS server]


企業(Inferno Nettverk A/S)によるオープンソースなSOCKS5実装で、有償サポートまであるらしい。見るからに古臭いHPで、メンテされているかどうか不安になるが、つい最近2024年末にもアップデートがあり、次期バージョンの計画についても記載されている。
企業(Inferno Nettverk A/S)によるオープンソースなSOCKS5実装で、有償サポートまであるらしい。見るからに古臭いHPで、メンテされているかどうか不安になるが、つい最近2024年末にもアップデートがあり、次期バージョンの計画についても記載されている。
100行目: 102行目:


TCP接続(あるいは任意のバイトストリーム)の上にUDP付きのSOCKS5を通すために自分が実装したツール。サーバー側とクライアント側に分かれている。しかし実装した後にgostで同じことができることに気付いた。
TCP接続(あるいは任意のバイトストリーム)の上にUDP付きのSOCKS5を通すために自分が実装したツール。サーバー側とクライアント側に分かれている。しかし実装した後にgostで同じことができることに気付いた。
経緯・使い方などは[https://turgenev.hatenablog.com/entry/2024/05/12/231208 root権限のないssh上にUDPを通す方法について(ポートフォワード、SOCKS5プロキシなど) - turgenev’s blog]に書いてある。


==== 3proxy ====
==== 3proxy ====


[https://github.com/3proxy/3proxy https://github.com/3proxy/3proxy] [https://3proxy.ru/ https&#58;//3proxy.ru/]
[https://3proxy.ru/ 3proxy tiny free proxy server for Windows, Linux, Unix: SOCKS, HTTP, FTP proxy]
 
[https://github.com/3proxy/3proxy https://github.com/3proxy/3proxy]


ロシア系。エラーメッセージなどがかなり不親切だが、ちゃんと動くソフト。
ロシア系。エラーメッセージなどがかなり不親切だが、ちゃんと動くソフト。
181行目: 187行目:
<span id="透過socksプロキシクライアント"></span>
<span id="透過socksプロキシクライアント"></span>
== 透過SOCKSプロキシクライアント ==
== 透過SOCKSプロキシクライアント ==
[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法(Windows・Linux(iptables TPROXY)・Androidなど) - turgenev’s blog]で扱った内容。


バックにSOCKS(SOCKS5)プロキシを用いてTCP・UDPのレイヤで透過プロキシを行うもの。基本的には管理者権限(最低でもCAP_NET_ADMIN)が必要。
バックにSOCKS(SOCKS5)プロキシを用いてTCP・UDPのレイヤで透過プロキシを行うもの。基本的には管理者権限(最低でもCAP_NET_ADMIN)が必要。
188行目: 196行目:
[https://github.com/semigodking/redsocks semigodking/redsocks] (fork元の[https://github.com/darkk/redsocks darkk/redsocks]はメンテされておらず、TCPのTPROXYに非対応)
[https://github.com/semigodking/redsocks semigodking/redsocks] (fork元の[https://github.com/darkk/redsocks darkk/redsocks]はメンテされておらず、TCPのTPROXYに非対応)


&#42;nix対応
&#42;nix対応。BSD系で動かすことができたという話は[https://turgenev.hatenablog.com/entry/2024/06/10/134017 FreeBSD/OpenBSD/NetBSDで透過プロキシのredsocksを動かしてみる - turgenev’s blog]に書いた。


<span id="proxifyre"></span>
<span id="proxifyre"></span>
216行目: 224行目:


後述のDanteの一部。UDP/TCP両対応。唯一のUDP対応のものである。
後述のDanteの一部。UDP/TCP両対応。唯一のUDP対応のものである。
<syntaxhighlight lang="go">route {
  from: 0.0.0.0/0 to: 0.0.0.0/0 via: 192.168.1.1 port = 1080
}</syntaxhighlight>
こんな感じの<code>/etc/socks.conf</code>を作るか、<code>SOCKS5_SERVER&#61;192.168.1.1&#58;1080 socksify curl http&#58;//ipv4.icanhazip.com</code> とかでもよい。
Macでも動くはずだが、筆者が唯一試したMac環境ではcurlに対してさえうまく動作しなかった(socksifyを使わないのと全く同様に動作するだけだった)(<code>DYLD_FORCE_FLAT_NAMESPACE&#61;1</code>は指定している)。


<span id="proxychains&#45;ngproxychains"></span>
<span id="proxychains&#45;ngproxychains"></span>
251行目: 266行目:
== HTTPプロキシ ==
== HTTPプロキシ ==


Squid, Privoxyなどが有名
Squid, Privoxyなどが有名。
 
Squidには透過プロキシ機能があるが、redsocksなどとは動作の細かい部分が異なる。[https://turgenev.hatenablog.com/entry/2025/03/25/171736 squidで透過プロキシ(intercept, tproxy)を動かす - turgenev’s blog]に書いた。


<span id="socks関連の話題"></span>
<span id="socks関連の話題"></span>
259行目: 276行目:
==== ブラウザのSOCKS5プロキシのWebRTC対応 ====
==== ブラウザのSOCKS5プロキシのWebRTC対応 ====


基本的に現在主流のブラウザ(Firefox, Chrome)のSOCKS5プロキシ機能(拡張機能で設定する場合を含む)はUDPには対応していないため、Discordの通話などWebRTC関係の機能を使うと生IPが漏洩する(またはそれを防ごうとすると単にその機能が使えない)。
基本的に現在主流のブラウザ(Firefox, Chrome)のSOCKS5プロキシ機能(拡張機能で設定する場合を含む)はUDPには対応していないため、Discordの通話などWebRTC関係の機能を使うと生IPが漏洩する(またはそれを防ごうとすると単にその機能が使えない)。これは原理的に実装が不可能なわけではなく、単に需要が少ないから実装されていないだけである。


* Chromeではどれが最新か不明(最近の物は少ない)。このへんとか?[https://issues.chromium.org/issues/41180783 Chromium]
* torのバグ報告 [https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/151 https&#58;//gitlab.torproject.org/tpo/applications/mullvad&#45;browser/&#45;/issues/151]
* torのバグ報告 [https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/151 https&#58;//gitlab.torproject.org/tpo/applications/mullvad&#45;browser/&#45;/issues/151]
* firefoxの [https://bugzilla.mozilla.org/show_bug.cgi?id=1808692 https&#58;//bugzilla.mozilla.org/show_bug.cgi?id&#61;1808692]
* firefoxの [https://bugzilla.mozilla.org/show_bug.cgi?id=1808692 https&#58;//bugzilla.mozilla.org/show_bug.cgi?id&#61;1808692]
** QUIC関連 [https://bugzilla.mozilla.org/show_bug.cgi?id=1882071 https&#58;//bugzilla.mozilla.org/show_bug.cgi?id&#61;1882071]
** QUIC関連 [https://bugzilla.mozilla.org/show_bug.cgi?id=1882071 https&#58;//bugzilla.mozilla.org/show_bug.cgi?id&#61;1882071]
** 新しめの包括的なバグレポート [https://bugzilla.mozilla.org/show_bug.cgi?id=1947229 https&#58;//bugzilla.mozilla.org/show_bug.cgi?id&#61;1947229]
** 新しめの包括的なバグレポート [https://bugzilla.mozilla.org/show_bug.cgi?id=1947229 https&#58;//bugzilla.mozilla.org/show_bug.cgi?id&#61;1947229]
従って、ブラウザのWebRTCをプロキシさせたい場合はVPNや透過プロキシなどroot/管理者権限が必要な手法を使うことになる。ただしLinux+Firefoxの場合はsocksifyが使えるのでrootが無くても可能。


<span id="udp-associateリクエストのdstaddrとdstport"></span>
<span id="udp-associateリクエストのdstaddrとdstport"></span>