Ssh

將 SSH 預路由到不同的內部埠

  • August 14, 2019

我正在處理本地 git 項目,並且正在使用非 root 使用者在埠 2222 上執行單獨的 SSH 服務。除此之外,我正在使用 ufw 防火牆並打開埠 2222 - 我打開它只是為了測試與它的連接是否按預期工作並且沒問題。

因為 SSH 的預設埠是 22,我不希望使用者在地址中寫入額外的埠來訪問儲存庫我想將它從 22 預路由到 2222。我還希望在預路由時不能從外部訪問埠 2222是有效的。

基本上我已經完成了第一部分 - 我預先路由了從 22 到 2222 的流量,如果埠 2222 也打開,它可以正常工作,但是當嘗試關閉埠 2222 時,與 22 的連接也停止工作(打開埠的規則是還在那裡)。這在某種程度上是合乎邏輯的,因為 iptables 似乎只是將埠 22 轉換為 2222 並將其轉發給 ufw,然後它會辨識這一點並拒絕連接,因為埠 2222 未打開。

目前,這是我在 ufw 的 before.rules 中所擁有的,如果埠 2222 也打開,它就可以工作:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222

有沒有辦法在不需要打開埠 2222 的情況下進行此預路由?

原則上,沒有。在這裡使用ufw並不重要,因為它只充目前端,創建 iptables 規則。正如您所注意到的,NAT 規則是在任何過濾之前處理的,因此過濾器會在任何 NAT 規則之後看到生成的數據包。(維基百科有一張看起來很嚇人的 netfilter 內部數據包流圖表,它表示它們是獨立的。)

我不確定是否也可以在另一個埠上訪問伺服器是否有很大問題。

但是,如果你真的想丟棄直接到埠 2222 的數據包,你可以使用一些技巧,使用連接標記,即CONNMARK目標和connmark模組:

nat表中,在連接上設置一個標記,並將其重定向到目標埠。

iptables -t nat -A PREROUTING -p tcp --dport 22 -j CONNMARK --set-mark 1234
iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222

filter(預設)表中,如果沒有標記,則拒絕連接。

iptables -A INPUT -p tcp --dport 2222 -m connmark ! --mark 1234 -j REJECT

標記號是什麼並不重要,只要它不與您的其他規則衝突即可。

(我不確定是否也可以DROP在 NAT 表中創建規則。iptables v1.4.21 似乎不允許這樣做,但投訴來自 iptables 本身,而不是來自核心,就像它為REJECT.)

引用自:https://unix.stackexchange.com/questions/304613