路由器做80端口的NAT转发(端口映射),如何让webserver获取真实的源IP?
就是访客IP....
前提:不耍openwrt ddwrt之类第三方的情况下。
1
auser 2014-12-24 21:43:23 +08:00 via Android
这么一说我还真不知道getpeername在这种情况下返回的地址是不是源地址。感觉应该就是对方真实IP来着,自己的公网IP没啥意义。
周末做个实验看看。 |
3
towser 2014-12-24 22:17:47 +08:00
张二胖最近怎么这么活跃
|
4
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 |
5
lhbc 2014-12-24 23:12:42 +08:00
NAT 之后是获取不到来源 IP 的,在网关做反向代理吧
|
6
Themyth OP |
7
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 |
10
xenme 2014-12-24 23:37:41 +08:00
|
11
ranran 2014-12-25 00:00:58 +08:00
@Themyth 我真的是醉了,说了你还不信,自己看看我在IIS上的探针吧 看看服务器是不是内网ip 看看你的ip是不是在页面中 看看我是不是骗你
http://cdd.me/gu6 不想被搜索到 所以用短网址 |
12
ranran 2014-12-25 00:03:03 +08:00
探针能显示的 就证明http服务器是得到了这个参数的 所以你还在怀疑什么呢? 还在用自己的方式去尝试? 哎哟我的神啊 你还在意分数 我点感谢都是整个楼所有楼层都送分的
能干点靠谱的事情吗? |
15
CupTools 2014-12-25 07:50:53 +08:00 via Android
我建议OP去上点基础课。
|
16
mhycy 2014-12-25 08:46:29 +08:00
NAT内部的机子理论上应该能拿到外网的IP才对.
毕竟NAT的作用只是数据包出口的时候做个映射关系,并篡改内网机器的IP变成外网IP并做个端口映射关系,并不改变源IP地址. |
17
gamexg 2014-12-25 09:02:56 +08:00
@ranran 我这测试了不行,显示的是负责转发的路由器的IP,不知道你的是怎么回事。。郁闷了。。
建议你通过代理访问公网IP测试,直接内网通过公网IP端口映射的服务会有各种奇怪的问题。 标准 dnat 会直接造成内网无法通过公网IP访问映射的内网服务。你的看情况是路由器专门处理了,所以获得的是路由器的IP。一般外网访问就没问题的。 具体原理可以翻看 TCP/IP 详解 dnat 部分。 |
18
gamexg 2014-12-25 09:15:32 +08:00 1
>> @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。 |
19
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的代码要不要我写给你!或者你自己架设一个第三方也是可以的啊! |