本地透明代理 SSLSplit 導致轉發循環
我正在嘗試調試通過 HTTPS 發送 RPC 的應用程序。為了讀取實際的 RPC 內容,我嘗試在與應用程序相同的機器上使用 SSLSplit 來 MITM 連接。為此,我在我的 iptables NAT 表中設置了一條規則,該規則將所有不是來自根應用程序的流量路由到
127.0.0.1:8443
:iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner root --dport 443 -j REDIRECT --to-port 8443
隨後,我執行
sslsplit -D -k key.pem -c cert.pem -P https 127.0.0.1 8443
以root
防止來自 SSLSplit(到目標伺服器)的出站流量被重定向回 SSLSplit。儘管如此,我得到Error 24 on listener: Too many open files
了,根據https://github.com/droe/sslsplit/issues/93#issuecomment-96894847可以歸因於打開了太多的套接字。這可能是 SSLSplit 發送的流量被循環回 SSLSplit 的症狀。鑑於 SSLSplit 以 root 身份執行並且 root 流量不受重定向規則的影響,我不知道我做錯了什麼。此外,我通過兩次執行 curl 來檢查我的 iptables 規則是否正確,一次以 root 身份執行,一次以非 root身份執行。正如預期的那樣,非根捲曲不起作用(
curl: (7) Failed to connect to unix.stackexchange.com port 443: Connection refused
),而根捲曲完美地工作(==> 不受 iptables 規則的影響)。問題:
- 鑑於 SSLSplit 以 root 身份執行,我的 iptables 規則如何創建一個循環,導致從 SSLSplit 發送的流量被回饋回自身?
- 我該如何解決這個問題才能最終能夠閱讀通信?
嘗試在執行 SSLSplit 的瀏覽器中訪問https://unix.stackexchange.com時得到的輸出摘錄:
SNI peek: [www.gravatar.com] [complete] Connecting to [192.0.73.2]:443 <repeated 96 times> SNI peek: [platform-lookaside.fbsbx.com] [complete] SNI peek: [www.gravatar.com] [complete] Connecting to [157.240.17.15]:443 Connecting to [192.0.73.2]:443 <repeated some more times> SNI peek: [www.gravatar.com] [complete] Connecting to [192.0.73.2]:443 <repeated 95 times> SNI peek: [platform-lookaside.fbsbx.com] [complete] SNI peek: [www.gravatar.com] [complete] Connecting to [157.240.17.15]:443 Connecting to [192.0.73.2]:443 <repeated some more times> Error 24 on listener: Too many open files Main event loop stopped (reason=0). Child pid 12445 exited with status 0
閱讀 OP 的相同連結評論:
添加一個輸入介面,以便僅將入站連接發送到 sslsplit,例如,如果您面向 LAN 的介面是 eth0,而面向 WAN 的介面是 eth1,
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080
這不是所做的,因此無法警告如何以root使用者身份執行是由
sslsplit
.實際上,當以root
sslsplit
身份執行時,該命令會通過切換到使用者來放棄特權,除非另有配置:nobody
/* * User to drop privileges to by default. This user needs to be allowed to * create outbound TCP connections, and in some configurations, perform DNS * resolution. * * Packagers may want to use a specific service user account instead of * overloading nobody with yet another use case. [...] */ #define DFLT_DROPUSER "nobody"
這是對分叉的“工人”子程序完成的。我不確定是否有興趣以root身份執行它,除非綁定到低埠。
所以應該做的是:
sslsplit
以普通使用者身份執行它不會更改 uid 或 gid,只需確保要攔截的應用程序不會以該使用者身份執行。將重定向更改為:
iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner normaluser --dport 443 -j REDIRECT --to-port 8443
- 或配置sslsplit以在以 root 身份執行時使用專用使用者和/或組。
為此,請參閱配置文件或選項。為此,我會使用(或創建和使用)該組。然後會使用.
-u
-m
proxy``! --gid-owner proxy