Linux

iptables 將本地連接重定向到遠端系統/埠

  • December 29, 2016

我正在嘗試使用 SSH 將 windows 機器本地埠 3389 埠轉發到某個任意埠(在非特權區域)上的 redhat 伺服器,我在防火牆後面進行了保護,然後將 redhat 伺服器上的非特權埠轉發到使用者遠端桌面。本質上是創建一個高度專業化的 VPN,它只處理一項任務:使用我控制的加密隧道讓使用者進入防火牆後面的系統。

我知道幾年前可以使用以下命令:

iptables -A OUTPUT -t nat --dport ${LOCAL UNPRIV PORT} \
          -j DNAT ${ANOTHER SYSTEM}:${REMOTE PORT}

但從我閱讀的內容來看,該功能似乎已被刪除,並且我在 /var/log/messages 中收到了消息

     kernel: NAT: no longer support implicit source local NAT 

我發現資源表明從核心 2.6.X - 2.6.10 開始,有一種方法可以使用 IP_NF_NAT_LOCAL 在核心中啟用此功能,但顯然在最近的核心中它已被刪除。我已經嘗試轉發所有本地流量,使其進入 PREROUTING 鏈,但成功有限,這感覺是個壞主意,因為我必須打開伺服器上的非特權埠,這樣我才能將其回饋到eth0 介面。我肯定給了更多時間,我可以找出某種奇怪的組合或解決方法,但我寧願不要破壞我的防火牆腳本那麼多。似乎必須有一種更簡單的方法來做到這一點,我沒有看到。社區可以提供的任何幫助或指導都會非常有幫助!提前致謝

我不完全確定我是否理解,但我認為你只是在錯誤的鏈條中。:-) 當我第一次使用 iptables 時,我也很困惑。但是轉發****本地埠 ${LOCAL UNPRIV PORT}的方式是下面的語句:

$IPT -t nat -A PREROUTING -i eth0 -p tcp --dport ${LOCAL UNPRIV PORT} 
    -j DNAT --to ${ANOTHER SYSTEM}:${REMOTE PORT}

它是語義問題和 netfilter 工作方式之間的混合體:在過去,轉發本地埠涉及到正在轉發的盒子的連接,以及到目的地的第二個連接。iptables 一步完成。因此,而不是兩個連接 - 您將流量直接轉發到該埠到目的地。Netfilter 進行所有的完整性檢查和記賬:只有屬於有效連接的數據包才經過 NAT,因此可以轉發。

啟用 DNAT 不允許轉發任何數據包。您還必須添加一條規則:

$IPT -N INET-PRIV
$IPT -A FORWARD -i eth0 -o eth1 -j INET-PRIV
$IPT -A FORWARD -j DROP

$IPT -A INET-PRIV -p tcp -d ${ANOTHER SYSTEM} --dport ${REMOTE PORT} -j ACCEPT

$IPT -A INET-PRIV -j DROP

當然,您必須啟用轉發。

echo "1" > /proc/sys/net/ipv4/ip_forward

Pro iptables:更安全,更靈活,每個連接使用的記憶體和 CPU 更少

對比 iptables:將連接從內部機器轉發到內部機器(將其回饋回 eth0)對 iptables 沒有意義(當然你總是可以直接連接),轉發本地生成的流量不起作用(埠轉發守護程序可能會有所幫助 - 但通常沒有意義)

正是這可能是問題所在:您嘗試在非路由器上使用 NAT,因此您應該使用轉發守護程序或完全跳過這個額外的埠轉發並執行以下操作:

ssh -L 1234:${ANOTHER SYSTEM}:${REMOTE PORT} special-vpn-box

在 special-vpn-box 上,您只能允許來自路由器的傳入連接和傳出連接 $ {ANOTHER SYSTEM}: $ {REMOTE PORT} 使用 iptables。這樣特殊-vpn-box的使用者只能訪問 $ {ANOTHER SYSTEM}: $ {REMOTE PORT},如果他們不受信任,將無法做任何其他事情。

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