如何將到達給定埠的所有流量轉發到另一個埠?
如何將到達給定埠的所有流量轉發到另一個埠?
定義佈局和問題
佈局
這是我正在嘗試做的佈局……
+--------+ +---------------------+ +----------------+ | WAN | <---> | 6789 | | | | Client | | Gateway | | Host | | | | 4567 | <---> | 2345 Service | +--------+ +---------------------+ +----------------+
我想透明地將所有到達埠 6789 的流量轉發到埠 4567。WAN 上的客戶端和主機上的服務應該對網關一無所知。
網關是帶有 firewalld 的 Debian 10。
問題
我無法讓流量到達網關上的埠 6789 以轉發到埠 4567。
目前的設置
步驟 01 - 在防火牆上公開埠並確認埠已打開。
打開網關上的埠
- 執行
firewall-cmd
命令:firewall-cmd --add-port=6789
- 檢查防火牆狀態…
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:
- 確認埠已打開。
- 在網關上,啟動一個監聽器:
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 時工作。
我正在努力使到達網關的流量成功傳遞到主機。網關是“透明的”。安全證書由主機持有,客戶端應該認為它直接與主機對話。
我仍在努力學習這些術語,所以如果有更正確的方法來問這個問題,我當然願意知道它是什麼。
感謝您的各種評論。
我錯過了兩件事……
GatewayPorts
in/etc/ssh/sshd_config
需要從預設更改no
為clientspecified
- 該
ssh
命令需要從偵聽環回更改為偵聽所有地址。更新後的命令如下所示:(ssh -N -R 0.0.0.0:4567:localhost:2345 tunnel@gateway.example.org
注意**0.0.0.0:**添加在 4567 埠前面。)