如何在任何介面的網路範圍之外擁有一個預設網關?
我一直認為預設網關必須與嘗試連接到 Internet 的伺服器/客戶端位於同一網路上。但是今天我從 Hetzner 租了一台伺服器,該伺服器能夠連接到網際網路,儘管在我看來,預設網關肯定沒有連接到同一個網路。網路遮罩似乎也設置為 /32。
root@test:~# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 138.201.187.120 netmask 255.255.255.255 broadcast 138.201.187.120 inet6 fe80::9400:ff:fe3b:eece prefixlen 64 scopeid 0x20<link> inet6 2a01:4f8:c17:69b0::1 prefixlen 64 scopeid 0x0<global> ether 96:00:00:3b:ee:ce txqueuelen 1000 (Ethernet) RX packets 1166 bytes 638244 (638.2 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 653 bytes 92539 (92.5 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 112 bytes 8824 (8.8 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 112 bytes 8824 (8.8 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 root@test:~# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.31.1.1 0.0.0.0 UG 0 0 0 eth0 172.31.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0 root@test:~# ip route default via 172.31.1.1 dev eth0 172.31.1.1 dev eth0 scope link root@test:~# ping ipv4.google.com PING ipv4.l.google.com (172.217.21.238) 56(84) bytes of data. 64 bytes from fra16s13-in-f14.1e100.net (172.217.21.238): icmp_seq=1 ttl=54 time=4.83 ms 64 bytes from fra16s13-in-f14.1e100.net (172.217.21.238): icmp_seq=2 ttl=54 time=4.96 ms 64 bytes from fra16s13-in-f14.1e100.net (172.217.21.238): icmp_seq=3 ttl=54 time=5.01 ms ^C --- ipv4.l.google.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 4.837/4.938/5.010/0.073 ms root@test:~# root@test:~# traceroute ipv4.google.com traceroute to ipv4.google.com (216.58.207.78), 30 hops max, 60 byte packets 1 _gateway (172.31.1.1) 0.139 ms 0.091 ms 0.062 ms 2 12643.your-cloud.host (136.243.182.17) 0.320 ms 0.103 ms 0.075 ms 3 * * * 4 213-239-251-233.clients.your-server.de (213.239.251.233) 1.479 ms 213-239-251-237.clients.your-server.de (213.239.251.237) 0.722 ms 1.320 ms 5 core21.fsn1.hetzner.com (213.239.239.125) 0.417 ms 0.310 ms 0.278 ms 6 core4.fra.hetzner.com (213.239.245.18) 5.536 ms core4.fra.hetzner.com (213.239.245.14) 4.880 ms core0.fra.hetzner.com (213.239.252.33) 5.539 ms 7 72.14.218.94 (72.14.218.94) 5.094 ms 5.085 ms 5.113 ms 8 108.170.251.193 (108.170.251.193) 5.018 ms * 108.170.252.65 (108.170.252.65) 6.311 ms 9 108.170.235.246 (108.170.235.246) 7.428 ms 72.14.232.50 (72.14.232.50) 4.903 ms 72.14.234.227 (72.14.234.227) 4.951 ms 10 108.170.252.18 (108.170.252.18) 5.287 ms fra16s25-in-f14.1e100.net (216.58.207.78) 4.804 ms 108.170.251.145 (108.170.251.145) 5.646 ms root@test:~#
謝謝!
確切地說,網關需要與電腦位於同一物理網路上,因為到達它(或到達網路上的任何電腦,實際上)需要發送 ARP 包。為此,任何本地網路都需要一個路由條目,它定義了“on-link”電腦。下面是更常見的網路設置的路由條目的樣子:
Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.193.254 0.0.0.0 UG 0 0 0 enp0s3 192.168.193.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s3
從第二行可以看出,如何到達網關伺服器已經很好地定義了。列
Gateway
是0.0.0.0
,表示“對這些地址不使用網關”,因此它將這些地址定義為直接可用。不幸的是,從route -n
這個意義上說, 的輸出並不直覺,但如果你ip route
改用它,你會看到一個更直接的表示:default via 192.168.193.254 dev enp0s3 192.168.193.0/24 dev enp0s3 scope link
這裡的
dev enp0s3 scope link
意思是“這是與enp0s3
設備連結的,因此可以通過它直接訪問”。由於網關本身位於該子網中,因此電腦知道可以直接訪問它,因此如果需要,它知道如何將包路由到外部世界。如果第二個條目不存在,則 gw 將無法訪問,即使它位於同一網路上。
在您的情況下,路由條目的第二行用於此目的,儘管它適用於單個主機,而不是網路:
172.31.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
或者,作為輸出或
ip route
顯示:172.31.1.1 dev eth0 scope link
所以解決方案是您的電腦和網關可能在同一個物理網路上,並且您的伺服器被告知如何到達網關。從這一點來看,它們是否共享相同的邏輯網路並不重要。
此外,網路遮罩是什麼並不重要,只要路由表包含電腦的條目即可。設置網路遮罩只定義瞭如何填充路由表,但如果您在
/24
路由表中有一個子網條目(如我的第一個範例中),並將網路遮罩設置為/32
,伺服器將很高興地訪問路由中定義的每台電腦桌子。這也適用於相反的方向:如果您有
/24
網路遮罩,但沒有“on-link”路由條目,則本地網路將無法訪問。