Ssh

匿名化 OpenVPN 允許 SSH 訪問內部伺服器

  • January 14, 2018

我正在使用匿名 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 連接。

有幾種方法可以解決此問題,但我將與您分享在相同情況下對我有用的方法。這是我們需要做的:

  1. 創建一個新的 IP 規則表來處理非 VPN 流量
  2. 添加一個 IP 規則以查找我們的 no-VPN 表,以查找任何標記有特定網路過濾器遮罩的數據包
  3. 添加一個 IP 路由,將我們的 no-VPN 表中的所有流量定向到使用您的乙太網介面而不是隧道
  4. 添加一個 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)——它們將在您下次重新啟動電腦時清除。讓它們永久化是我留給你的練習。

引用自:https://serverfault.com/questions/425493