匿名化 OpenVPN 允許 SSH 訪問內部伺服器
我正在使用匿名 VPN,但希望通過 SSH 訪問內部電腦。
如何通過 SSH 訪問我的內部電腦?當我執行ssh 98.123.45.6時,連接超時。
- 有線電視提供商的 IP 地址:98.123.45.6
- 通過 VPN 的匿名 IP:50.1.2.3
- 內部電腦:192.168.1.123
搜尋時,我發現建議要麼設置 iptables 規則、路由規則,要麼將 ListenAddress 添加到 sshd_config。以下哪一項適用於我的情況?
這是我的路線:
核心IP路由表 目標網關 Genmask 標誌 Metric Ref Use Iface 10.115.81.1 10.115.81.9 255.255.255.255 UGH 0 0 0 tun0 10.115.81.9 * 255.255.255.255 UH 0 0 0 tun0 50.1.2.3-sta ddrt 255.255.255.255 UGH 0 0 0 eth0 192.168.1.0 * 255.255.255.0 U 202 0 0 eth0 169.254.0.0 * 255.255.0.0 U 204 0 0 vboxnet0 環回 * 255.0.0.0 U 0 0 0 lo 預設 10.115.81.9 128.0.0.0 UG 0 0 0 tun0 128.0.0.0 10.115.81.9 128.0.0.0 UG 0 0 0 tun0 預設ddwrt 0.0.0.0 UG 202 0 0 eth0
要解決此問題,您需要設置iptables 和路由規則**。**您遇到的具體問題是傳出的 SSH 數據包是通過匿名 VPN 隧道介面而不是乙太網介面路由的。發生這種情況是因為您的 VPN 軟體設置了路由規則以通過隧道介面發送任何和所有未處理的流量。有利於匿名化您的網路流量;不利於與您的電腦建立 SSH 連接。
有幾種方法可以解決此問題,但我將與您分享在相同情況下對我有用的方法。這是我們需要做的:
- 創建一個新的 IP 規則表來處理非 VPN 流量
- 添加一個 IP 規則以查找我們的 no-VPN 表,以查找任何標記有特定網路過濾器遮罩的數據包
- 添加一個 IP 路由,將我們的 no-VPN 表中的所有流量定向到使用您的乙太網介面而不是隧道
- 添加一個 iptables 規則以使用我們指定的 netfilter 遮罩標記所有 SSH 流量
注意:我在執行以下操作時正在使用 Raspbian,因此您可能需要稍微調整命令以適應您的發行版。
創建新的 IP 規則表
首先檢查 iproute2 的表定義文件。我們要確保不使用任何現有規則表的名稱或編號。
cat /etc/iproute2/rt_tables
您可能會看到以下內容:
# reserved values 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep
為您的新規則表選擇任意數字和名稱——上面未使用的任何內容。我將使用數字 201 和名稱
novpn
作為這個答案的其餘部分。將定義直接附加到定義文件或在您選擇的文本編輯器中編輯它:
echo "201 novpn" >> /etc/iproute2/rt_tables
添加新的 IP 規則以查找 no-VPN 表
檢查任何現有的處理 netfilter 遮罩的 ip 規則:
ip rule show | grep fwmark
如果 grep 什麼也沒有出現,那麼你就清楚了。
fwmark
如果它確實列印了一些行,請記下每行中單詞右側的十六進制數字。您需要選擇一個目前未使用的號碼。由於我沒有現有的 fwmark 規則,我選擇了數字 65。ip rule add fwmark 65 table novpn
這會導致任何帶有 netfilter 遮罩 65 的數據包查找我們的新
novpn
表以獲取有關如何路由數據包的說明。引導我們新表中的所有流量使用乙太網介面
ip route add default via YOUR.GATEWAY.IP.HERE dev eth0 table novpn
這裡要注意的重要一點是
dev eth0
. 這會強制通過novpn
表的所有流量僅使用硬體乙太網介面,而不是您的 VPN 創建的虛擬隧道介面。現在是刷新 iproute 記憶體的好時機,以確保您的新規則和路由立即生效:
ip route flush cache
指示防火牆規則使用指定的 netfilter 遮罩標記所有 SSH 流量
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 65
這裡有太多選擇,我無法深入解釋。我強烈建議您閱讀 iptables 的手冊頁,以了解這裡發生了什麼:
man iptables
簡而言之:我們將一個輸出規則附加到防火牆的 mangle 表(用於專門的數據包處理),指示它用我們指定的網路過濾器遮罩 65 標記來自源埠 22 的任何 TCP 數據包。
接下來是什麼?
此時,您應該準備好測試 SSH。如果一切順利,您應該會看到快樂的“登錄身份”提示。
為了安全起見,我建議您指示您的防火牆丟棄來自隧道介面的任何傳入 SSH 請求:
iptables -A INPUT -i tun0 -p tcp -m tcp --dport 22 -j DROP
請注意,以上所有說明都是暫時的(除了創建規則表 ID)——它們將在您下次重新啟動電腦時清除。讓它們永久化是我留給你的練習。