Port-Forwarding

如何將到達給定埠的所有流量轉發到另一個埠?

  • September 1, 2021

如何將到達給定埠的所有流量轉發到另一個埠?

定義佈局和問題

佈局

這是我正在嘗試做的佈局……

+--------+         +---------------------+         +----------------+
|  WAN   |  <--->  | 6789                |         |                |
| Client |         |       Gateway       |         |      Host      |
|        |         |                4567 |  <--->  |  2345 Service  |
+--------+         +---------------------+         +----------------+

我想透明地將所有到達埠 6789 的流量轉發到埠 4567。WAN 上的客戶端和主機上的服務應該對網關一無所知。

網關是帶有 firewalld 的 Debian 10。

問題

我無法讓流量到達網關上的埠 6789 以轉發到埠 4567。


目前的設置

步驟 01 - 在防火牆上公開埠並確認埠已打開。

打開網關上的埠

  1. 執行firewall-cmd命令:firewall-cmd --add-port=6789
  2. 檢查防火牆狀態…
root@gateway:~# firewall-cmd --list-all
public (active)
 target: default
 icmp-block-inversion: no
 interfaces: etho0
 sources: 
 services: dhcpv6-client http https ssh
 ports: 6789/tcp
 protocols: 
 masquerade: yes
 forward-ports: 
 source-ports: 
 icmp-blocks: 
 rich rules:
  1. 確認埠已打開。
  • 在網關上,啟動一個監聽器:nc -vvlp 6789 &
  • 確認監聽器已啟動…
root@gateway:~# netstat -tulnp | grep 6789
tcp        0      0 0.0.0.0:6789              0.0.0.0:*               LISTEN      2274/nc
  • 從客戶端,嘗試到達網關:
client@client123:~$ nc -vvN gateway.example.org 6789
Connection to gateway.example.org 6789 port [tcp/*] succeeded!

結論:防火牆上的 6789 埠是開放的。

nc通過終止客戶端和網關上的程序進行清理。

步驟 02 - 確認網關和主機上的服務之間的連接

root@gateway:~# telnet localhost 4567
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 backendhost.backendhost MyService (Debian/GNU)

結論:網關和主機上的服務之間的隧道是up的。

步驟 03 - 在網關上添加埠轉發並檢查防火牆狀態

root@gateway:~# firewall-cmd --add-forward-port=port=6789:proto=tcp:toport=4567`
root@gateway:~# firewall-cmd --list-all
public (active)
 target: default
 icmp-block-inversion: no
 interfaces: etho0
 sources: 
 services: dhcpv6-client ssh
 ports: 6789/tcp
 protocols: 
 masquerade: no
 forward-ports: port=6789:proto=tcp:toport=4567:toaddr=
 source-ports: 
 icmp-blocks: 
 rich rules: 

結論:埠轉發在防火牆中。


此時,如果我嘗試從客戶端遠端登錄主機,我會得到……

client@client123:~$ telnet gateway.example.org 6789
Trying <IP_of_gateway>...
telnet: Unable to connect to remote host: Connection refused

在這一點上,我想看看我在上面的步驟 02 中看到了什麼。

問題

這是我不確定的地方…

當我netstat -tulnp在網關上執行時,它不會顯示任何監聽埠 6789 的內容。我不希望它顯示,因為我沒有執行任何監聽埠 6789 的服務。

我需要某種服務來監聽 6789 埠嗎?如果是這樣,是什麼?還是我在防火牆設置中遺漏了什麼?我需要這裡提到的某種透明代理嗎?

我不會在這篇文章中加上我在過去幾週讀過的所有內容的連結,但如果有一篇文章有​​答案,請隨時指出。

編輯

回應@AB

主機在防火牆後面執行。當主機啟動時,它會使用 SSH 埠轉發自動創建到網關的隧道。

這是主機在啟動時執行的命令:ssh -N -R 4567:localhost:2345 tunnel@gateway.example.org

該隧道已在步驟 02 中確認。雖然我之前沒有提到,但客戶端在與主機位於同一 LAN 時工作。

我正在努力使到達網關的流量成功傳遞到主機。網關是“透明的”。安全證書由主機持有,客戶端應該認為它直接與主機對話。

我仍在努力學習這些術語,所以如果有更正確的方法來問這個問題,我當然願意知道它是什麼。

感謝您的各種評論。

我錯過了兩件事……

  1. GatewayPortsin/etc/ssh/sshd_config需要從預設更改noclientspecified
  2. ssh命令需要從偵聽環回更改為偵聽所有地址。更新後的命令如下所示:(ssh -N -R 0.0.0.0:4567:localhost:2345 tunnel@gateway.example.org注意**0.0.0.0:**添加在 4567 埠前面。)

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