奇怪,一个服务,用 IP 访问正常,也能 ping 通(IP 和域名都可以),但是用 curl 就是不行

2021-07-19 17:56:34 +08:00
 ssbg2

如题,公司一个长期运维的项目,有两个 IP 网段不同的集群,通过 nginx 做了反向代理,之前是正常的,最近突然有台虚机访问服务有问题了,查了一圈发现,用 IP 加端口可以通(临时开了下策略,后面还是要去掉的),ping 域名也可以,但是用 curl 发 get 请求就不行了,显示超时,curl 给别的服务发请求都正常。

然后用另外一个网段的机器操作,也是正常的。

看 nginx 日志,请求就没有进去。

现在很苦恼……

6863 次点击
所在节点    NGINX
23 条回复
internelp
2021-07-19 17:59:11 +08:00
看下终端是否配置了代理呢
milk97
2021-07-19 18:15:13 +08:00
看下 /etc/hosts,是不是指定了域名的 IP
AngryPanda
2021-07-19 18:21:50 +08:00
是否设置了环境变量 HTTP_PROXY 之类?
darknoll
2021-07-19 18:28:41 +08:00
加个-L 试试?
lasuar
2021-07-19 19:15:35 +08:00
curl 加-v 看看通信过程
falcon05
2021-07-19 19:28:16 +08:00
是不是有 waf 把 curl 默认 ua 拦截了,换个 ua 试试
guanyin8cnq12
2021-07-19 19:29:57 +08:00
这是有拦截啊 ,用 tcping,ping 80
zzyphp111
2021-07-19 20:18:47 +08:00
给你推荐下命令( mac | linux ):

sudo tcpdump -i en0 -n port 80 -vv
可以看到当前机器和外部网络的所有流量交互,都是 ip 到 ip 的,非常详细,顺便还可以看到那些软件窃取了你的隐私上报给第三方。
Smash
2021-07-19 20:23:46 +08:00
@zzyphp111 怎么把 ip 对应到程序呢?没有打印进程信息.
zzyphp111
2021-07-19 20:31:01 +08:00
@Smash #9 当然,肯定有人有需求看下 当前流量对应是哪个进程

我推荐这个命令:
sudo nethogs -d 1 -v 4 -l
可以看到你当前网络流量开销大的进程是哪一个
xiangwan
2021-07-19 21:20:56 +08:00
检查 web 服务器起来没有
aaa5838769
2021-07-19 21:41:28 +08:00
使用 nmap 命令,看下端口是否通的
wudao95278
2021-07-20 07:35:38 +08:00
# 编辑
vi /etc/sysctl.conf
# 添加、报错
net.ipv4.tcp_timestamps = 0
# 生效
sysctl -p
orisine
2021-07-20 09:33:24 +08:00
有可能虚拟机 dns 问题
ssbg2
2021-07-20 13:25:26 +08:00
嗯,谢谢大家,我这会再去试试看。
NUT
2021-07-21 08:55:25 +08:00
本地上 telnet 看看接口通了吗
doveyoung
2021-07-21 10:17:23 +08:00
1. 虚拟机上 curl -v
2. 虚拟机上 tcpdump
3. nginx 上 tcpdump

“IP 加端口可以通”,是 curl https://IP:port 吗,还是 telnet ?
还可以检查一下 nginx 上 /proc/sys/net/ipv4/tcp_tw_recycle 的值,值是 1 的时候会影响客户端 nat 后的访问,
ssbg2
2021-07-21 16:04:09 +08:00
@NUT 谢谢您,我测试了,是通的。

@doveyoung
谢谢您,1 、虚拟机上用 curl -v,结果就是
Trying xxx.xxx.xxx.xxx:443 ....
TCP_NODELAY SET
然后等一会就超时了,提示 Closing connection 0……

2 和 3 、客户端虚拟机上( 18.200 )使用 curl 发送 get 请求,输出情况是这样:
tcpdump -n port 443 -i ens192 and host 192.168.16.218 -vv
tcpdump: listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes
15:52:24.481160 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
192.168.16.218.https > 192.168.18.200.41034: Flags [S.], cksum 0x3dcd (correct), seq 3835702915, ack 1032333183, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
15:52:24.481209 IP (tos 0x0, ttl 64, id 9141, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0
15:52:25.482070 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
192.168.16.218.https > 192.168.18.200.41034: Flags [S.], cksum 0x9963 (correct), seq 3851342334, ack 1032333183, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
15:52:25.482136 IP (tos 0x0, ttl 64, id 9552, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0
15:52:27.485907 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
192.168.16.218.https > 192.168.18.200.41034: Flags [S.], cksum 0xc9fe (correct), seq 3882655621, ack 1032333183, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
15:52:27.485972 IP (tos 0x0, ttl 64, id 10776, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0
15:52:31.489995 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
192.168.16.218.https > 192.168.18.200.41034: Flags [S.], cksum 0x1633 (correct), seq 3945222038, ack 1032333183, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
15:52:31.490057 IP (tos 0x0, ttl 64, id 13410, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0
15:52:39.505889 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
192.168.16.218.https > 192.168.18.200.41034: Flags [S.], cksum 0xcf03 (correct), seq 4070477646, ack 1032333183, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
15:52:39.505945 IP (tos 0x0, ttl 64, id 19809, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0
然后 nginx 上( 16.218 )使用 tcpdump 监听到的日志是这样:
tcpdump: listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes
15:52:25.568684 IP (tos 0x0, ttl 63, id 6305, offset 0, flags [DF], proto TCP (6), length 52)
192.168.18.200.41034 > 192.168.16.218.https: Flags [S], cksum 0x513e (correct), seq 1032333182, win 29200, options [mss 1400,nop,nop,sackOK,nop,wscale 7], length 0
15:52:25.569331 IP (tos 0x0, ttl 63, id 9141, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0
15:52:26.569602 IP (tos 0x0, ttl 63, id 6306, offset 0, flags [DF], proto TCP (6), length 52)
192.168.18.200.41034 > 192.168.16.218.https: Flags [S], cksum 0x513e (correct), seq 1032333182, win 29200, options [mss 1400,nop,nop,sackOK,nop,wscale 7], length 0
15:52:26.570270 IP (tos 0x0, ttl 63, id 9552, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0
15:52:28.573661 IP (tos 0x0, ttl 63, id 6307, offset 0, flags [DF], proto TCP (6), length 52)
192.168.18.200.41034 > 192.168.16.218.https: Flags [S], cksum 0x513e (correct), seq 1032333182, win 29200, options [mss 1400,nop,nop,sackOK,nop,wscale 7], length 0
15:52:28.574321 IP (tos 0x0, ttl 63, id 10776, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0
15:52:32.577927 IP (tos 0x0, ttl 63, id 6308, offset 0, flags [DF], proto TCP (6), length 52)
192.168.18.200.41034 > 192.168.16.218.https: Flags [S], cksum 0x513e (correct), seq 1032333182, win 29200, options [mss 1400,nop,nop,sackOK,nop,wscale 7], length 0
15:52:32.578604 IP (tos 0x0, ttl 63, id 13410, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0
15:52:40.594269 IP (tos 0x0, ttl 63, id 6309, offset 0, flags [DF], proto TCP (6), length 52)
192.168.18.200.41034 > 192.168.16.218.https: Flags [S], cksum 0x513e (correct), seq 1032333182, win 29200, options [mss 1400,nop,nop,sackOK,nop,wscale 7], length 0
15:52:40.594906 IP (tos 0x0, ttl 63, id 19809, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0
15:52:56.643423 IP (tos 0x0, ttl 63, id 6310, offset 0, flags [DF], proto TCP (6), length 52)
192.168.18.200.41034 > 192.168.16.218.https: Flags [S], cksum 0x513e (correct), seq 1032333182, win 29200, options [mss 1400,nop,nop,sackOK,nop,wscale 7], length 0
15:52:56.644167 IP (tos 0x0, ttl 63, id 33143, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0
15:53:28.709344 IP (tos 0x0, ttl 63, id 6311, offset 0, flags [DF], proto TCP (6), length 52)
192.168.18.200.41034 > 192.168.16.218.https: Flags [S], cksum 0x513e (correct), seq 1032333182, win 29200, options [mss 1400,nop,nop,sackOK,nop,wscale 7], length 0
15:53:28.709799 IP (tos 0x0, ttl 63, id 48301, offset 0, flags [DF], proto TCP (6), length 40)
192.168.18.200.41034 > 192.168.16.218.https: Flags [R], cksum 0x03e1 (correct), seq 1032333183, win 0, length 0

以上都是用域名请求的,客户端能解析到实际的内网 IP 且服务端能监听到请求,我认为网络层是通的,现在就是没有发送到 nginx 里。

使用 curl 对 IP 请求是这样请求的: https://IP:port/assets,可以正常得到返回信息。
另外就是 /proc/sys/net/ipv4/tcp_tw_recycle 这个值是 0
doveyoung
2021-07-21 17:51:36 +08:00
看 nginx 抓包的信息,nginx 收到了请求但是没有回复给客户端,客户端一直在 seq 1032333183 / 1032333182
我暂时只想到这几点
1. 客户端或服务端的 MTU 值不合理
2. 类似 /proc/sys/net/ipv4/tcp_tw_recycle =1 的原因,但是你检查后值是 0,可以暂时排除
3. nginx 本应该回复给 192.168.18.200 的包,回复给了错误的 IP,在 openstack 里的虚拟机使用了浮点 IP 后经常出现这种问题
4. emmmmm 想不到了 ( :(|
ssbg2
2021-07-22 08:38:38 +08:00
@doveyoung 嗯,谢谢了,我再想想看。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/790445

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX