heiher / natmap

TCP/UDP port mapping for full cone NAT
MIT License
1.38k stars 103 forks source link

请教连接问题 #37

Closed egg1234 closed 1 year ago

egg1234 commented 1 year ago

出口路由器是家庭路由器netgear,路由器wan口有公网ip地址,经过NatTypeTester测试是fullcone状态

在内网ubuntu 20系统上使用root用户运行下面的命令

./natmap -s stun.voip.blackberry.com -h qq.com -b 19999 -t 10.0.0.59 -p 80 或 ./natmap -s stun.voip.blackberry.com -h qq.com -b 19999 -t 127.0.0.1 -p 80

输出下面信息,而且1.2.3.4的确也是路由器wan口现在的公网ip地址 1.2.3.4 19999 2001::4e1f:d848:d8ba 19999 tcp 10.0.0.59

并且这台ubuntu 20(10.0.0.59)已经安装nginx并监听80端口,内网其他机器可以直接用浏览器访问http://10.0.0.59:80,能够显示正常的web页面

然后使用外网其他机器的浏览器访问natmap输出的公网地址及端口,浏览器报告连接失败

然后在外网其他ubuntu 20机器使用nc测试natmap输出的公网地址及端口 ./nc -vz 1.2.3.4 19999

输出下面的结果 nc: connect to 1.2.3.4 port 19999 (tcp) failed: Connection refused

也试过把10.0.0.59机器放到路由器的DMZ区域,情况一样,都是不能访问

想请教一下这个问题出现在什么地方?

非常感谢!

heiher commented 1 year ago

看上去应该是没有放行入站,参考OpenWrt的配置是: https://github.com/heiher/natmap/wiki/web#4-%E9%98%B2%E7%81%AB%E5%A2%99%E6%94%BE%E8%A1%8Ctcp%E5%8D%8F%E8%AE%AE%E7%9B%AE%E7%9A%84%E7%AB%AF%E5%8F%A36336%E7%9A%84%E5%85%A5%E7%AB%99

另外,有公网IP为何要用natmap?

egg1234 commented 1 year ago

@heiher 谢谢指点!实际上这个路由器防火墙都是关闭的,然后这台ubuntu 20根本没有安装防火墙ufw,所以上面也特别说明内网其他机器可以直接用浏览器访问http://10.0.0.59:80,所以不存在没有放行入站的问题,更进一步是即使把这台ubuntu 20放到路由器的DMZ区也是不能外网访问natmap输出的公网地址及端口,所以才不明白究竟出了什么问题

这个路由器有公网ip还要做这个测试是因为有另外一个广电的网络没有公网ip,所以想先在一个简单的环境测试通过,才到那个广电网络去试验

heiher commented 1 year ago

先检查路由器wan口的入站,比如先用nc测一下,然后再抓包排查一下。不清楚什么场景,上游设备有没有可能有防火墙?

egg1234 commented 1 year ago

有一个奇怪的现象,我换了另外一个运营商测试,也是wan出口有公网ip地址的,也是类似下面的命令 ./natmap -s stun.voip.blackberry.com -h qq.com -b 19999 -t 10.0.0.59 -p 80

natmap的输出 1.2.3.4 19999 2001::4e1f:d848:d8ba 19999 tcp 10.0.0.59

奇怪的地方是为什么natmap的输出永远都把我自己bind的19999端口写到输出里面,按我理解natmap的输出端口应该是对方stun服务器检测到我这边的源端口才是,为什么换了不同运营商都一样是输出自己bind的19999端口,根本没有输出对方反馈的我自己这边广域网的源端口

所以我从另外的地方用浏览器访问 http://1.2.3.4:19999 当然会出错,因为根本没有访问到广域网的打洞端口

heiher commented 1 year ago

因为wan口是公网ip呀,如果natmap是跑在路由器上,这就是必然的结果,而如果是跑在子网主机上,也有很大概率分配相同的端口(与NAT实现相关)。

egg1234 commented 1 year ago

尝试在10.0.0.59机器加了ip转发 echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

然后在远端的ubuntu机器测试访问变成下面的反馈,实际上内网访问 http://10.0.0.59:80 没有任何问题,而外网访问过来就有问题 nc -vz 1.2.3.4 19999 Connection to 1.2.3.4 19999 port [tcp/*] succeeded!

curl http://1.2.3.4:19999 curl: (56) Recv failure: Connection reset by peer

heiher commented 1 year ago

好吧,这看上去端口是通的,很可能是运营商阻断了HTTP协议,相同外部端口试试转发SSH或其它协议。

egg1234 commented 1 year ago

换成下面的命令 ./natmap -s stun.voip.blackberry.com -h qq.com -b 19999 -t 10.0.0.59 -p 22

然后ssh尝试连接,出现下面反馈,这个username肯定是用密码登录的,不需要用证书 ssh username@1.2.3.4 -p 19999

kex_exchange_identification: read: Connection reset by peer Connection reset by 1.2.3.4 port 19999

heiher commented 1 year ago

这看上去还是端口不通呀,路由器上对wan口抓包看看双向流量情况。

egg1234 commented 1 year ago

由于出口路由器都是标准的家用路由器,所以抓不了包,

现在估计也没有什么头绪,先把issue关了,以后有机会或有其他头绪再reopen吧