
我正在運行Ubuntu server 22.04
,並且本地計算機有一個特殊的端口轉發問題。本機有兩個乙太網路接口,連接的enp1s0
接口有一個IP 位址192.168.1.50
。完整的ip配置如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:e0:4f:68:02:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.50/24 metric 100 brd 192.168.1.255 scope global enp1s0
valid_lft forever preferred_lft forever
inet6 240f:74:de92::d1e/128 scope global dynamic noprefixroute
valid_lft 35597sec preferred_lft 35597sec
inet6 fd41:d8b6:99ba::d1e/128 scope global dynamic noprefixroute
valid_lft 35597sec preferred_lft 35597sec
inet6 fd41:d8b6:99ba:0:2e0:4fff:fe68:2bb/64 scope global mngtmpaddr noprefixroute
valid_lft forever preferred_lft forever
inet6 240f:74:de92:0:2e0:4fff:fe68:2bb/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 98462sec preferred_lft 98462sec
inet6 fe80::2e0:4fff:fe68:2bb/64 scope link
valid_lft forever preferred_lft forever
3: eno1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 00:e0:4c:68:01:6e brd ff:ff:ff:ff:ff:ff
altname enp2s0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:55:86:e6:e5 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
我已經為我的路由器設定了連接埠轉送規則,以便任何傳入的 TCP 或 UDPfrom wan to port 22211
封包forwarded to lan 192.168.1.50 port 22211
在我的ufw
配置中,我允許此連接埠的路由:
$ sudo ufw status
[sudo] password for *
Status: active
To Action From
-- ------ ----
22211/tcp ALLOW Anywhere
22211/tcp (v6) ALLOW Anywhere (v6)
nc -l -p 22211
現在,如果我為此連接埠啟動一個簡單的 netcat 套接字 ( ),我可以telnet
透過本機網路中的另一台機器存取它。這是tcudump
我從另一臺本機電腦遠端登入時的日誌。我連接並發送一封信a
並按 Enter 鍵:
$ sudo tcpdump -pnvvi enp1s0 port 22211
tcpdump: listening on enp1s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
21:01:48.350024 IP (tos 0x0, ttl 64, id 59572, offset 0, flags [DF], proto TCP (6), length 60)
192.168.1.196.38840 > 192.168.1.50.22211: Flags [S], cksum 0x527d (correct), seq 3440167578, win 32120, options [mss 1460,sackOK,TS val 3772353734 ecr 0,nop,wscale 7], length 0
21:01:48.350139 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
192.168.1.50.22211 > 192.168.1.196.38840: Flags [S.], cksum 0x3a60 (correct), seq 495600843, ack 3440167579, win 65160, options [mss 1460,sackOK,TS val 102903428 ecr 3772353734,nop,wscale 7], length 0
21:01:48.351892 IP (tos 0x0, ttl 64, id 59573, offset 0, flags [DF], proto TCP (6), length 52)
192.168.1.196.38840 > 192.168.1.50.22211: Flags [.], cksum 0x66b7 (correct), seq 1, ack 1, win 251, options [nop,nop,TS val 3772353737 ecr 102903428], length 0
21:01:50.698846 IP (tos 0x0, ttl 64, id 59574, offset 0, flags [DF], proto TCP (6), length 55)
192.168.1.196.38840 > 192.168.1.50.22211: Flags [P.], cksum 0xf275 (correct), seq 1:4, ack 1, win 251, options [nop,nop,TS val 3772356082 ecr 102903428], length 3
但是,當我在本地網路之外嘗試 telnet 形式時,由於某種原因,連接從未建立。在很長一段時間裡,我確信我的連接埠轉送設定已關閉(儘管同一路由器將其他連接埠轉送到本機網路中的另一台電腦就很好,而且我基本上只是將設定鏡像到另一個連接埠) ,但是正如您從tcpdump
日誌中看到的下面,資料包到達介面enp1s0
:
$ sudo tcpdump -pnvvi enp1s0 port 22211
tcpdump: listening on enp1s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
20:58:05.448829 IP (tos 0x0, ttl 50, id 0, offset 0, flags [DF], proto TCP (6), length 64)
126.33.109.168.9875 > 192.168.1.50.22211: Flags [S], cksum 0x4448 (correct), seq 2086171535, win 65535, options [mss 1240,nop,wscale 6,nop,nop,TS val 560510789 ecr 0,sackOK,eol], length 0
20:58:06.593532 IP (tos 0x0, ttl 50, id 0, offset 0, flags [DF], proto TCP (6), length 64)
126.33.109.168.9875 > 192.168.1.50.22211: Flags [S], cksum 0x405f (correct), seq 2086171535, win 65535, options [mss 1240,nop,wscale 6,nop,nop,TS val 560511790 ecr 0,sackOK,eol], length 0
20:58:07.613818 IP (tos 0x0, ttl 50, id 0, offset 0, flags [DF], proto TCP (6), length 64)
126.33.109.168.9875 > 192.168.1.50.22211: Flags [S], cksum 0x3c76 (correct), seq 2086171535, win 65535, options [mss 1240,nop,wscale 6,nop,nop,TS val 560512791 ecr 0,sackOK,eol], length 0
20:58:08.603603 IP (tos 0x0, ttl 50, id 0, offset 0, flags [DF], proto TCP (6), length 64)
126.33.109.168.9875 > 192.168.1.50.22211: Flags [S], cksum 0x388c (correct), seq 2086171535, win 65535, options [mss 1240,nop,wscale 6,nop,nop,TS val 560513793 ecr 0,sackOK,eol], length 0
20:58:09.563590 IP (tos 0x0, ttl 50, id 0, offset 0, flags [DF], proto TCP (6), length 64)
126.33.109.168.36371 > 192.168.1.50.22211: Flags [S], cksum 0xcd21 (correct), seq 2086171535, win 65535, options [mss 1240,nop,wscale 6,nop,nop,TS val 560514795 ecr 0,sackOK,eol], length 0
我還可以看到 netcat 正在偵聽所有介面(0.0.0.0 部分):
$ sudo ss -tulpn | grep 22211
tcp LISTEN 0 1 0.0.0.0:22211 0.0.0.0:* users:(("nc",pid=3344,fd=3))
路由表如下所示:
$ sudo route -vn
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 enp1s0
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 enp1s0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp1s0
192.168.1.1 0.0.0.0 255.255.255.255 UH 100 0 0 enp1s0
所以我不明白為什麼來自外部網路的封包永遠不會到達連接埠 22211 中的本機套接字...是否有一些我應該配置的額外防火牆配置?
編輯:有趣的是,確實ping 8.8.8.8
超時了(例如 ping google.com 工作正常)
答案1
長話短說
如果複雜的東西不起作用,那麼首先要確保基礎功能正常運作。
加長版
前言
這是如何提問的一個很好的例子。
有背景訊息,例如它運行的是Ubuntu 22.04,機器有兩個乙太網路介面。
提供詳細信息,例如 ip 配置信息。
顯示了工作和非工作範例。
調試問題。
糾正誤解。
OP 表示“所以我不知道為什麼來自外部網路的資料包永遠不會到達連接埠 22211 中的本機套接字。”當資料顯示資料包到達時,回應並未從該介面發出。
OP說它有兩個接口。 IP 資訊顯示第二個介面已關閉,但也許機器期望從另一個介面發送回應?
第一次請求提供更多資訊。
“路由表是否顯示到 126.33.189.168 的路由是透過已啟動的介面 (enp1s0) 進行的?” OP 透過加入路由表來回應,也說
“我將路由表資訊新增至原始訊息。此外,我還確定另一個介面 eno1 已關閉,但似乎沒有任何變化”
第二次請求提供更多資訊。
路由表中有符號名稱,而不是數字位址。在不知道映射的情況下,這不是很有用,所以
- “您能否更改您的編輯以顯示輸出
sudo route -vn
以顯示數值?”
以響應者自然的方式提問。
有評論建議使用ip route
而不是route -vn
.我已經使用了ip route
很多年,並且斷言它是一個更好的工具。要問的問題是「我們是在嘗試教 OP 更好的工具還是在嘗試幫助他解決問題?」。我認為開始引入新工具會分散注意力。
第二次請求提供更多資訊 - 繼續。
“您還能否確認您可以從 192.168.1.50 ping 某個眾所周知的地址,例如 8.8.8.8?”這引起了回應
「你是對的,由於某種原因 ping 8.8.8.8 失敗了!但 ping google.com 工作正常。
調試為什麼ping google.com
有效
- “ping google.com 選擇什麼 IP 位址?(它顯示在第一行中。)這聽起來好像您已將自己設定為遠離 IPv4,但仍然擁有功能齊全的 IPv6。”
我不會使用這個詞firewalled
。由於路由表顯示 2 個具有不同指標的預設路由,現在幾乎可以肯定這是一個路由問題。
第三次請求提供更多資訊。
大多數人只有一個互聯網連接,但盡量不要做出任何毫無根據的假設。
- 「您是否希望擁有 2 個路由器,每個路由器都可以訪問互聯網(可能有 2 個不同的 ISP)?”
當答案是否定的時,只需告訴 OP 修復路由問題(使用他們熟悉的命令)即可,一切正常。預期答案並將說明與問題放在一起可以節省延遲。
- “能夠 ping 通 8.8.8.8 是您最重要的問題。解決這個問題很可能會解決所有問題。”
實際問題。
當封包需要發送到互聯網而不是本地網路時,它們被告知要透過不存在的機器發送。
為了將封包傳送到這台不存在的機器,主機正在發送 ARP 封包,但沒有得到回應。
最終主機放棄嘗試聯繫不存在的機器並向 ping 命令報告錯誤,或沒有向傳入連線發送確認。
修復路由表以透過正確的位址將資料包發送到網路使一切正常。