V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Themyth
V2EX  ›  问与答

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

  •  
  •   Themyth · 2014-12-24 21:37:27 +08:00 · 9269 次点击
    这是一个创建于 3416 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    19 条回复    2014-12-25 10:17:03 +08:00
    auser
        1
    auser  
       2014-12-24 21:43:23 +08:00 via Android
    这么一说我还真不知道getpeername在这种情况下返回的地址是不是源地址。感觉应该就是对方真实IP来着,自己的公网IP没啥意义。

    周末做个实验看看。
    Themyth
        2
    Themyth  
    OP
       2014-12-24 21:57:39 +08:00
    @auser 我听不懂你在说什么…………我说的是NAT……
    towser
        3
    towser  
       2014-12-24 22:17:47 +08:00
    张二胖最近怎么这么活跃
    ranran
        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
    lhbc
        5
    lhbc  
       2014-12-24 23:12:42 +08:00
    NAT 之后是获取不到来源 IP 的,在网关做反向代理吧
    Themyth
        6
    Themyth  
    OP
       2014-12-24 23:24:17 +08:00
    @towser 丫 咱们能QQ上说吗?回复你是需要分的呀!!

    @ranran 真的假的???是什么服务器都无所谓呀!!最关键是能获取到。。。从系统层面netstat看到的都是路由器的IP,看不到访客的IP啊。。你是什么情况?
    @lhbc 完全无解吗?
    lhbc
        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
    xenme
        8
    xenme  
       2014-12-24 23:35:06 +08:00
    @lhbc WebServer前面的NAT应该只替换目的IP,不会替换源IP吧?所以,WebServer应该是能看到源IP的。
    Themyth
        9
    Themyth  
    OP
       2014-12-24 23:35:17 +08:00
    @lhbc 我知道呀 我就想看看V2上有没有人有其他办法,譬如snat dnat之类……
    我现在就是无解
    xenme
        10
    xenme  
       2014-12-24 23:37:41 +08:00
    @Themyth
    @lhbc
    建议分清SNAT/DNAT.
    一般WebServer在防火墙后面,DNAT就可以,是可以看到IP的。
    ranran
        11
    ranran  
       2014-12-25 00:00:58 +08:00
    @Themyth 我真的是醉了,说了你还不信,自己看看我在IIS上的探针吧 看看服务器是不是内网ip 看看你的ip是不是在页面中 看看我是不是骗你

    http://cdd.me/gu6

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

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

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

    具体原理可以翻看 TCP/IP 详解 dnat 部分。
    gamexg
        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。
    ranran
        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的代码要不要我写给你!或者你自己架设一个第三方也是可以的啊!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1813 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:52 · PVG 08:52 · LAX 17:52 · JFK 20:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.