V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
jbue520
V2EX  ›  NGINX

Ngnix 奇怪问题...不知道怎么解决

  •  
  •   jbue520 · 2021-12-25 21:44:50 +08:00 · 3038 次点击
    这是一个创建于 1055 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个是服务器的架构,域名解析到 186.16.15.12 的外网 IP 上,然后 186.16.15.12 上安装 NGNIX ,反向代理到 192.168.1.1 上,因为涉及到微信公众号,所以已经把 186.16.15.12 的 IP 加入到白名单上,但是出现一个奇怪的问题,服务器访问公众号的时候,却是另一个 IP 地址去访问,就是 221.221.221.221 的 IP 去访问微信公众号,导致访问不上.. 所以我的问题就是这个是怎么发生的?如何让固定的 IP 186.16.15.12 去访问公众号?如果要全部外网 IP 加入到白名单里,那如果我有多条外网线路,那不是都要加进去?

    15 条回复    2022-01-04 17:18:52 +08:00
    chairuosen
        1
    chairuosen  
       2021-12-25 22:00:38 +08:00
    出口和入口不一样很正常 ,186.16.15.12 只是公网进来的流量,走域名->nginx ,是由外向内的流量。你业务请求公众号是由内到外是不走这条路的,除非反过来是公众号请求你的域名。你要搜索的是如何指定网卡 IP 发请求(如果 221 是绑在你内网机器的,我猜不是),或者问运维内网机器出口网关是哪怎么指定
    jbue520
        2
    jbue520  
    OP
       2021-12-25 22:10:06 +08:00
    Nginx 这台服务器是 windows 的,有没有什么方法让出口 IP 访问请求固定为 186.16.15.12 这个呢??
    sujin190
        3
    sujin190  
       2021-12-25 22:32:43 +08:00
    @jbue520 #2 调路由优先级啊,网络基础了吧,如果在本机的话也可以打开 socket 的 bind 到对应网卡上去

    如果云主机买的公网 ip 这种的话,以上两种方式就不行了,但是云主机后台都有设为出口 ip 这样的功能吧,你可以找找看

    话说把所有 ip 都加到白名单里就是了,干嘛这么纠结?
    gtchan13579
        4
    gtchan13579  
       2021-12-26 07:20:33 +08:00 via iPhone
    可以设置 acl 或者添加静态路由表,具体要看你路由表。
    jbue520
        5
    jbue520  
    OP
       2021-12-26 10:16:41 +08:00
    @sujin190 主要是服务器托管了,最简单的方法肯定是添加白名单,但是公众号不单单一个,而且管理员还不同,还得一个一个的去联系,太麻烦了!
    jbue520
        6
    jbue520  
    OP
       2021-12-26 10:18:05 +08:00
    @gtchan13579 现在就是服务器是托管出去,只能改路由表么?
    ik
        7
    ik  
       2021-12-26 10:25:32 +08:00 via iPhone
    没太看懂你的描述,nginx 是不是有配置这两条呢?

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    Kinnice
        8
    Kinnice  
       2021-12-26 10:27:26 +08:00 via Android
    route -n 把第一行删了
    thunderw
        9
    thunderw  
       2021-12-26 10:56:59 +08:00
    @jbue520 托管出去的,那一个电话过去让机房帮你改?
    ch2
        10
    ch2  
       2021-12-26 12:56:21 +08:00
    改一下路由表记录的优先级
    到 0.0.0.0/32 的全部路由表记录中,221.221.221.221 的 metric 优先级比 186.16.15.12 的更高
    所以对外发请求的时候会通过 221.221.221.221 发出去
    Xusually
        11
    Xusually  
       2021-12-26 15:27:13 +08:00 via iPhone
    defaut gw 的问题
    改路由表就行
    你需要的出口优先级调高就可以了
    akira
        12
    akira  
       2021-12-26 16:05:27 +08:00
    如果是阿里云的 vpc 的话,应该是 dnet 和 snet 的配置问题,出口 ip 配一下就好
    msg7086
        13
    msg7086  
       2021-12-26 19:44:05 +08:00
    AlexEzio
        14
    AlexEzio  
       2021-12-27 10:56:28 +08:00
    这个问题和 nginx 没有关系, 原因在于出口多线路时,网关路由策略的选择导致了不同路线出口。
    内网客户端无法决定网关路由策略,因此最佳方案是通过网关层策略修改来达到预期的效果。

    解决方法:
    # 网关层
    1. 固定外网 IP ,建议把所有 IP 加入微信白名单,因为多线路场景,对应的是多运营商与负载均衡,不同运营商的流量走不同的路线,以获取最佳速度
    2. 如果 IP 过多,想指定某一条路线走特定流量,可以通过路由层,加上策略路由,通过七层策略,匹配所有*.weixin.com 的 http host 头流量走特定 IP 出口。
    # 客户端层
    3. 如果路由层不支持七层策略,可以咨询运维人员,获取具体的四层策略,比如联通 IP 走哪个,电信 IP 走哪个。 然后手动修改服务器 host ,将微信服务器指向特定的运营商 IP , 来保持请求总是走到对应的外网路线上
    4. 如果外网是动态 IP ,客户端需要编写脚本,定期获取自己的外网地址,然后通过微信的 api,进行白名单刷新。 这也是常用手段之一
    yadgen
        15
    yadgen  
       2022-01-04 17:18:52 +08:00
    整一个网关。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5138 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:50 · PVG 11:50 · LAX 19:50 · JFK 22:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.