路由器端口映射 80 端口,如何获取真实 IP?

2014-12-24 21:37:27 +08:00
 Themyth

路由器做80端口的NAT转发(端口映射),如何让webserver获取真实的源IP?
就是访客IP....

前提:不耍openwrt ddwrt之类第三方的情况下。

9520 次点击
所在节点    问与答
19 条回复
auser
2014-12-24 21:43:23 +08:00
这么一说我还真不知道getpeername在这种情况下返回的地址是不是源地址。感觉应该就是对方真实IP来着,自己的公网IP没啥意义。

周末做个实验看看。
Themyth
2014-12-24 21:57:39 +08:00
@auser 我听不懂你在说什么…………我说的是NAT……
towser
2014-12-24 22:17:47 +08:00
张二胖最近怎么这么活跃
ranran
2014-12-24 23:10:01 +08:00
楼主你要说明自己是什么服务器。

我特地看了下我内网的iis服务器 能获得客户端的ip地址啊(我在宿舍局域网电脑访问公司的内部网站,是2个宽带,互相不是一个局域网的)

也是NAT映射的IIS端口

这不是可以清清楚楚的显示
REMOTE_ADDR 183.23.5.x
REMOTE_HOST 183.23.5.x

服务器的ip是
183.23.19.x
lhbc
2014-12-24 23:12:42 +08:00
NAT 之后是获取不到来源 IP 的,在网关做反向代理吧
Themyth
2014-12-24 23:24:17 +08:00
@towser 丫 咱们能QQ上说吗?回复你是需要分的呀!!

@ranran 真的假的???是什么服务器都无所谓呀!!最关键是能获取到。。。从系统层面netstat看到的都是路由器的IP,看不到访客的IP啊。。你是什么情况?
@lhbc 完全无解吗?
lhbc
2014-12-24 23:30:27 +08:00
NAT 本来就是为了把 IP 进行转换的技术

在计算机网络中,网络地址转换(英语:Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是一种在IP封包通过路由器或防火墙时重写源IP地址或目的IP地址的技术。这种技术被普遍使用在有多台主机但只通过一个公有IP地址访问因特网的私有网络中。根据规范,路由器是不能这样工作的,但它的确是一个方便并得到了广泛应用的技术。当然,NAT也让主机之间的通信变得复杂,导致通信效率的降低。
来源: http://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2
xenme
2014-12-24 23:35:06 +08:00
@lhbc WebServer前面的NAT应该只替换目的IP,不会替换源IP吧?所以,WebServer应该是能看到源IP的。
Themyth
2014-12-24 23:35:17 +08:00
@lhbc 我知道呀 我就想看看V2上有没有人有其他办法,譬如snat dnat之类……
我现在就是无解
xenme
2014-12-24 23:37:41 +08:00
@Themyth
@lhbc
建议分清SNAT/DNAT.
一般WebServer在防火墙后面,DNAT就可以,是可以看到IP的。
ranran
2014-12-25 00:00:58 +08:00
@Themyth 我真的是醉了,说了你还不信,自己看看我在IIS上的探针吧 看看服务器是不是内网ip 看看你的ip是不是在页面中 看看我是不是骗你

http://cdd.me/gu6

不想被搜索到 所以用短网址
ranran
2014-12-25 00:03:03 +08:00
探针能显示的 就证明http服务器是得到了这个参数的 所以你还在怀疑什么呢? 还在用自己的方式去尝试? 哎哟我的神啊 你还在意分数 我点感谢都是整个楼所有楼层都送分的

能干点靠谱的事情吗?
Themyth
2014-12-25 01:19:34 +08:00
@ranran ??发生什么了?我刚看到了,的确显示了我的IP,我去给我的那个放上探针试试
Themyth
2014-12-25 01:33:13 +08:00
@ranran 我这测试了不行,显示的是负责转发的路由器的IP,不知道你的是怎么回事。。郁闷了。。
CupTools
2014-12-25 07:50:53 +08:00
我建议OP去上点基础课。
mhycy
2014-12-25 08:46:29 +08:00
NAT内部的机子理论上应该能拿到外网的IP才对.
毕竟NAT的作用只是数据包出口的时候做个映射关系,并篡改内网机器的IP变成外网IP并做个端口映射关系,并不改变源IP地址.
gamexg
2014-12-25 09:02:56 +08:00
@ranran 我这测试了不行,显示的是负责转发的路由器的IP,不知道你的是怎么回事。。郁闷了。。

建议你通过代理访问公网IP测试,直接内网通过公网IP端口映射的服务会有各种奇怪的问题。
标准 dnat 会直接造成内网无法通过公网IP访问映射的内网服务。你的看情况是路由器专门处理了,所以获得的是路由器的IP。一般外网访问就没问题的。

具体原理可以翻看 TCP/IP 详解 dnat 部分。
gamexg
2014-12-25 09:15:32 +08:00
>> @ranran 我这测试了不行,显示的是负责转发的路由器的IP,不知道你的是怎么回事。。郁闷了。。

上面一段是引用。

具体说下出问题的原理:
正常外网访问你端口映射的服务的步骤:
1.访客的请求包到达路由器
2.路由器发现目的端口是映射的端口,就直接把目的IP和端口改成内网服务的IP和端口。注意,这里没有修改源IP。
3.转发包到内网。
4.内网服务收到,处理后发回去,由于收到的请求包源地址是访客的IP,所以回复的包的目的地址也是访客IP(公网),走默认路由会发给路由器。
5.路由器收到后发现IP和端口是之前做做过dnat,直接把源IP和端口换成自己的然后发到公网。
6.一次转发完成。

但是内网通过公网IP访问映射的服务会有个问题:
问题出在上面的第二步,这里默认不修改源地址会造成一个问题。那就是第4步内网服务回复的时候,发现之前收到的包的源地址是内网IP,就直接发到内网了,而不是发到路由器,这里就出问题了,内网服务回复的包的源地址是内网IP,但是内网访客请求的是外网IP,访客收到内网IP的回复会直接丢弃,造成内网访客无法访问映射的服务。
所以现在的路由器做了一个修改,内网访问的时候直接把源地址改成路由器IP来解决上面的问题,造成楼主发现IIS 记录的IP是路由器IP。
ranran
2014-12-25 10:17:03 +08:00
@Themyth
@gamexg

解决问题方法分两种 一步是技术上可以解决的 那就解决

技术上不能解决的 就不要绕死在这里了好吗?(如果路由器没有传达过来的话,那任何方式都不能直接实现了)

难道不能通过第三方来实现获取ip吗?

难道不能在前端用js从其他网站获取ip然后再存放在cookie里吗

如果NAT不能把客户ip传过来 那就用js实现啊 用第三方来实现啊

用script标签请求这里
http://counter.sina.com.cn/ip/
还有这里
http://pv.sohu.com/cityjson?ie=utf-8

跨域问题存在不存在?不存在!

存入cookie的代码要不要我写给你!或者你自己架设一个第三方也是可以的啊!

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

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

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

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

© 2021 V2EX