Firejail 無法通過 socks5 SSH 隧道工作
我有一個 Ubuntu 18.04 伺服器,我在其中創建了兩個虛擬介面對(veth0a 和 veth0b),並將一個介面(veth0b)的末端分配給一個新的網路命名空間(netns0):
ip netns add netns0 ip netns exec netns0 ip link set lo up ip link add veth0a type veth peer name veth0b ip link set veth0b netns netns0
然後,我使用 firejail 強制特定使用者(test-user)預設使用這個新命名空間,方法是設置
/usr/bin/firejail
為該使用者的預設 shell,並將以下內容添加到/etc/firejail/login.users
文件中:test-user: --netns=netns0
我已經執行了以下測試以確保它有效:
tshark -i veth0a -f "port 443"
從 root 帳戶執行- 以測試使用者身份通過 SSH 連接到伺服器
curl https://1.1.1.1
以 SSH 使用者身份執行tshark 輸出顯示 1.1.1.1 流量的正確 veth0b 源 IP 地址。
我遇到的問題是嘗試使用 test-user 帳戶通過 SSH 建立 socks5 動態埠轉發時:
ssh -D 10000 -q -C -N test-user@server_ip
從我的筆記型電腦或工作站執行此命令允許我在埠 1000 上建立一個本地 socks5 伺服器,並通過 SSH 連接對其進行隧道傳輸。將其設置為我的本地 socks5 代理並
https://api.ipify.org
展示代理正在工作並且我的筆記型電腦正在使用伺服器的 IP 地址。問題是 sock5 流量似乎沒有通過正確的命名空間。換句話說,在我的筆記型電腦上瀏覽網頁並通過測試使用者 ssh 連接連接到 socks5 伺服器時,我的流量不會出現在 tshark -i veth0a 中。
是否需要額外的步驟來確保埠轉發隧道也使用火獄?在 /etc/passwd 中設置 shell 是否只影響互動式登錄 shell?我是否還需要將使用者的非互動式外殼更改為
/usr/bin/firejail
?如果是這樣,我會怎麼做?任何幫助將不勝感激。
您嘗試的方法行不通,我正在解釋原因。
您的 ssh 連接連接到遠端伺服器的sshd守護程序,該守護程序在主機上執行,而不是網路命名空間。為您的連接創建了一個實例。然後你通過身份驗證,然後設置隧道,然後設置你的使用者會話。
以下是使用 ssh 客戶端版本 7.9p1 執行的範例的摘錄
ssh -v -4 -D 10000 remoteuser@server
:debug1: Offering public key: /home/localuser/.ssh/id_ed25519 ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx debug1: Server accepts key: /home/localuser/.ssh/id_ed25519 ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx debug1: Authentication succeeded (publickey). Authenticated to server ([192.0.2.2]:22). debug1: Local connections to LOCALHOST:10000 forwarded to remote address socks:0 debug1: Local forwarding listening on 127.0.0.1 port 10000. debug1: channel 0: new [port listener] debug1: channel 1: new [client-session] debug1: Requesting no-more-sessions@openssh.com debug1: Entering interactive session. debug1: pledge: network debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0 debug1: Sending environment. debug1: Sending env LANG = C.UTF-8
如您所見,
Local connections to LOCALHOST:10000 forwarded to remote address socks:0
…channel 0: new [port listener]
首先發生。然後Entering interactive session
發生。這通常會呼叫firejail等,但為時已晚:之前所做的任何事情都發生在主機網路命名空間上。但實際上在您的情況下,因為您使用的是-N
:
-N
不要執行遠端命令。這對於僅轉發埠很有用。從來沒有執行過 shell,沒有執行firejail,也沒有接觸過備用網路命名空間。
-N
即使沒有如上所述,這也無關緊要。因此,如果您真的想這樣做,您將需要一個單獨的 SOCKS5 代理,並且您不能再使用該
-D
選項。您可以在網路命名空間內執行sshd實例或任何其他支持 SOCKS5 的工具(例如:)並使用iptable、nftables或**ssh的經典選項重定向到veth0b的 IP 和此 SOCKS5 代理的偵聽進行埠重定向埠,但這可能需要的不僅僅是火獄和普通使用者。此時,您最好從systemd執行整個設置,或者使用成熟的LXC(或LXD或Dockerdante-server
-L
等)容器。ip netns
功能甚至通常就足夠了(請參閱:使用 ip netns (iproute2) 進行命名空間管理)。