我遇到了一个有趣的问题,我正在努力弄清楚这个问题的根源,并欢迎任何关于可能发生的事情的见解。
我正在运行 OSX 10.13.6 上的 Macbook pro。
我的问题如下...我启动一个通过地址绑定到所有接口的节点服务器0.0.0.0
。我能够使用 Curllocalhost:3000
并127.0.0.1:3000
成功访问服务器并收到响应。
当我尝试从我的机器 curl 我的私有 IP 时,curl 192.168.1.113:3000
服务器会收到请求并发送响应,但是 curl 从未收到响应。网络上的同事能够成功 curl 我的私有 IP 并获得响应。
这是我迄今为止观察到的。
我刷新我的路由表netstat -rn
看起来如下。
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.1.1 UGSc 74 0 en0
127 127.0.0.1 UCS 0 0 lo0
127.0.0.1 127.0.0.1 UH 3 1561554184 lo0
169.254 link#12 UCS 0 0 en0
192.168.1 link#12 UCS 0 0 en0
192.168.1.1/32 link#12 UCS 1 0 en0
192.168.1.1 70:4f:57:81:72:d2 UHLWIir 24 37 en0 1198
192.168.1.113/32 link#12 UCS 0 0 en0
224.0.0/4 link#12 UmCS 2 0 en0
224.0.0.251 1:0:5e:0:0:fb UHmLWI 0 0 en0
239.255.255.250 1:0:5e:7f:ff:fa UHmLWI 0 2 en0
255.255.255.255/32 link#12 UCS 0 0 en0
我的私有 IP 有一条记录 192.168.1.113/32,该记录绑定到 en0 接口。当我在 localhost 和 127.0.0.1 上使用 curl 访问服务器时,我的路由表中没有任何变化。
从我的机器访问后,curl 192.168.1.113:3000
路由表中立即出现一条新记录,如下所示。
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.1.1 UGSc 71 0 en0
127 127.0.0.1 UCS 0 0 lo0
127.0.0.1 127.0.0.1 UH 5 1561554801 lo0
169.254 link#12 UCS 0 0 en0
192.168.1 link#12 UCS 1 0 en0
192.168.1.1/32 link#12 UCS 1 0 en0
192.168.1.1 70:4f:57:81:72:d2 UHLWIir 22 43 en0 1170
192.168.1.113/32 link#12 UCS 1 0 en0
192.168.1.113 88:e9:fe:4c:a3:58 UHLWIi 2 8 lo0
192.168.1.255 ff:ff:ff:ff:ff:ff UHLWbI 0 11 en0
224.0.0/4 link#12 UmCS 2 0 en0
224.0.0.251 1:0:5e:0:0:fb UHmLWI 0 0 en0
239.255.255.250 1:0:5e:7f:ff:fa UHmLWI 0 18 en0
255.255.255.255/32 link#12 UCS 0 0 en0
该线路有一个网关接口,即en0接口,并绑定到lo0环回接口。
192.168.1.113 88:e9:fe:4c:a3:58 UHLWIi 2 8 lo0
我想知道当请求从主机内部发出时,响应数据包是否被错误地路由。非常感谢大家的帮助。
编辑->下面的 ifconfig
ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
XHC0: flags=0<> mtu 0
XHC1: flags=0<> mtu 0
XHC20: flags=0<> mtu 0
en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=60<TSO4,TSO6>
ether 32:00:f0:81:a8:01
media: autoselect <full-duplex>
status: inactive
en2: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=60<TSO4,TSO6>
ether 32:00:f0:81:a8:00
media: autoselect <full-duplex>
status: inactive
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=60<TSO4,TSO6>
ether 32:00:f0:81:a8:05
media: autoselect <full-duplex>
status: inactive
en4: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=60<TSO4,TSO6>
ether 32:00:f0:81:a8:04
media: autoselect <full-duplex>
status: inactive
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 88:e9:fe:4c:a3:58
inet6 fe80::a5:7168:25d:73ec%en0 prefixlen 64 secured scopeid 0xc
inet 192.168.1.113 netmask 0xffffff00 broadcast 192.168.1.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
ether 0a:e9:fe:4c:a3:58
media: autoselect
status: inactive
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
ether a2:cf:3c:7c:70:56
inet6 fe80::a0cf:3cff:fe7c:7056%awdl0 prefixlen 64 scopeid 0xe
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=63<RXCSUM,TXCSUM,TSO4,TSO6>
ether 32:00:f0:81:a8:01
Configuration:
id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
ipfilter disabled flags 0x2
member: en1 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 8 priority 0 path cost 0
member: en2 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 9 priority 0 path cost 0
member: en3 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 10 priority 0 path cost 0
member: en4 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 11 priority 0 path cost 0
nd6 options=201<PERFORMNUD,DAD>
media: <unknown type>
status: inactive
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 2000
inet6 fe80::61db:32d6:4611:1341%utun0 prefixlen 64 scopeid 0x10
nd6 options=201<PERFORMNUD,DAD>
en5: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether ac:de:48:00:11:22
inet6 fe80::aede:48ff:fe00:1122%en5 prefixlen 64 scopeid 0x7
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
可以在 Node 中启动服务器
require('http')
.createServer(function (req, res) {
res.end('OK');
})
.listen(3000, '0.0.0.0');
或 Python 2
python -m SimpleHTTPServer 3000
答案1
在尝试重现该问题时,我确实看到了主 IP 偶尔分配给lo0接口。看来,操纵路由表是导致该问题的原因。
要将网络接口重置为“默认”配置而不重新启动,您可以执行以下操作。(注意,如果情况持续恶化,最坏的情况是您可能必须重新启动)(警告:这将会颠覆所有现有的 IP 连接和服务):
- 关闭所有网络实用程序和服务,如 VPN
- 禁用现有网络接口。在大多数 MacBook 上,这将en0
查找代表您的主 IP 的接口。您可以使用以下命令找到它:
ping `hostname`
Porky:Downloads hogstrom$ ping `hostname`
PING porky.local (10.0.0.114): 56 data bytes
64 bytes from 10.0.0.114: icmp_seq=0 ttl=64 time=0.055 ms
ifconfig
在输出中查找该 IP 地址(在本例中为 10.0.0.114)
ifconfig
en0: flags=8863 mtu 1500
ether a0:99:9b:1a:a7:f1
inet6 fe80::874:c2c9:c839:ac4a%en0 prefixlen 64 secured scopeid 0x5
inet 10.0.0.114 netmask 0xffffff00 broadcast 10.0.0.255
nd6 options=201
media: autoselect
status: active
注意接口名称(在此示例中为en0
)
关闭当前网络
`sudo ifconfig en0 down
刷新现有路线
sudo route -n flush
注意:-n需要标志,否则您最终将等待很长时间才能出现网络超时;这是在我们刷新路由表时预料到的。
这是主服务器关闭时路由表的样子,并且route -n flush
已运行了几次。我执行了该命令三次。
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
127 127.0.0.1 UCS 0 0 lo0
127.0.0.1 127.0.0.1 UH 1 97314 lo0
224.0.0 link#1 UmCS 1 0 lo0
224.0.0.251 link#1 UHmW3I 0 0 lo0 12
- 启动步骤 3 中关闭的主接口。
sudo ifconfig en0 up
使用步骤 3 中的接口名称。
- 验证网络路由表:
netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 10.0.0.1 UGSc 92 0 en0
10/24 link#5 UCS 1 0 en0
10.0.0.1/32 link#5 UCS 2 0 en0
10.0.0.1 2c:fd:a1:2:49:40 UHLWIir 24 5 en0 1198
10.0.0.114/32 link#5 UCS 0 0 en0
10.0.0.255 ff:ff:ff:ff:ff:ff UHLWbI 0 2 en0
127 127.0.0.1 UCS 0 0 lo0
127.0.0.1 127.0.0.1 UH 1 97314 lo0
169.254 link#5 UCS 0 0 en0
224.0.0/4 link#5 UmCS 2 0 en0
224.0.0.251 1:0:5e:0:0:fb UHmLWI 0 0 en0
239.255.255.250 1:0:5e:7f:ff:fa UHmLWI 0 2 en0
255.255.255.255/32 link#5 UCS 0 0 en0
注意:根据提供的诊断,主 IP(我的系统上为 10.0.0.114)与 lo0 不关联。我在调整路由表时确实观察到了这种情况,但这是异常的,很可能是问题的原因。
- 验证网络配置
我通过 ping Google 的主 DNS 服务器进行测试。
ping 8.8.8.8
Porky:Downloads hogstrom$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=120 time=25.527 ms
此时您应该有一个正常工作的网络,并且能够使用本地主机和您的主 IP 地址访问您的节点服务器。