billion
V2EX  ›  问与答

架设透明代理实现 HTTP/HTTPS 流量转发的最高效方案是什么?

  •  
  •   billion · Nov 7, 2017 · 12100 views
    This topic created in 3135 days ago, the information mentioned may be changed or developed.

    我现在有 10 台内网服务器,他们不能直接访问外网。

    有一台公网服务器,可以访问外网。这 11 台服务器内网互通。

    希望让公网服务器做代理,把 10 台内网服务器的所有 HTTP/HTTPS 请求,apt-get 请求,git 请求,pip 请求等等所有网络请求全部通过公网服务器转发出去。

    请问这种需求,最高效的方案是什么?我是用 mitmproxy 来做转发,发现链接一多效率就极其底下,而且容易崩溃。

    Supplement 1  ·  Nov 7, 2017
    如果能系统全局代理最好,因为内网服务器是 CentOS,每一台上面还跑了 4 个系统为 Ubuntu 的 Docker 容器。如果能 CentOS 全局代理,那么就比较方便。
    Supplement 2  ·  Nov 8, 2017

    最后使用squid实现了我的需求。

    但是我发现一个很奇怪的地方。在Http Headers里面,如果设置了

    accept-encoding = 'gzip, deflate, br'
    

    再走Squid,那么返回的网页是乱码。但是如果不使用Squid或者不指定accept-encoding,那么网页就一切正常。

    45 replies    2017-11-09 11:14:05 +08:00
    hduwillsky
        1
    hduwillsky  
       Nov 7, 2017 via iPhone
    iptables + bridge
    billion
        2
    billion  
    OP
       Nov 7, 2017
    @hduwillsky 有点麻烦。
    roychan
        3
    roychan  
       Nov 7, 2017
    tinyproxy? squid?
    Lentin
        4
    Lentin  
       Nov 7, 2017
    -0-那为什么不直接加个交换机
    试试 haproxy ?
    billion
        5
    billion  
    OP
       Nov 7, 2017
    @Lentin 因为是云服务器
    pheyer
        6
    pheyer  
       Nov 7, 2017 via iPhone
    多账户的酸酸?
    xenme
        7
    xenme  
       Nov 7, 2017 via iPhone
    centos 改成软路由,然后内网网关指向它就好了
    ik
        8
    ik  
       Nov 7, 2017 via iPhone
    dhcpd 有什么问题吗?
    fzinfz
        9
    fzinfz  
       Nov 7, 2017 via iPad
    试下 avege
    kuaner
        10
    kuaner  
       Nov 7, 2017
    内网的所有机器设置默认网关到外网到那台就可以了
    kuaner
        11
    kuaner  
       Nov 7, 2017
    lz 应该是阿里云的 vpc?
    billion
        12
    billion  
    OP
       Nov 7, 2017
    @fzinfz 这个已经废弃了。而且我并不需要梯子。。
    billion
        13
    billion  
    OP
       Nov 7, 2017
    @kuaner 是的
    hezhe
        14
    hezhe  
       Nov 7, 2017
    能不能用 nginx 来反向代理
    billion
        15
    billion  
    OP
       Nov 8, 2017
    @kuaner 使用命令
    首先使用`route -n`查到了默认网管的地址,然后使用

    ```
    route del default gw x.x.x.x
    route add default gw y.y.y.y
    ```
    进行修改。但是改好以后,依然无法 ping 通 baidu.com
    wwqgtxx
        16
    wwqgtxx  
       Nov 8, 2017
    @billion 你要在能上外网的那台机器上配置 iptables 转发的
    ik
        17
    ik  
       Nov 8, 2017 via iPhone
    @billion 网关开启转发 ,忘了还有没有其他操作了
    lbp0200
        18
    lbp0200  
       Nov 8, 2017
    我厂运维给我的解决方案是 polipo
    billion
        19
    billion  
    OP
       Nov 8, 2017 via iPhone
    @wwqgtxx 能上网的服务器上没有 iptables
    billion
        20
    billion  
    OP
       Nov 8, 2017 via iPhone
    @roychan tinyproxy 转发 http 亲测可行。但是 https 全部失败。
    liyvhg
        21
    liyvhg  
       Nov 8, 2017 via Android
    我们公司几台这么做的:
    公网那台架个 pptp server,内网的拨上去(设置好开机自动拨号就行)。
    yingfengi
        22
    yingfengi  
       Nov 8, 2017 via Android
    出口架一台墙做网关啊
    billion
        23
    billion  
    OP
       Nov 8, 2017 via iPhone
    @yingfengi 架墙?
    0ZXYDDu796nVCFxq
        24
    0ZXYDDu796nVCFxq  
       Nov 8, 2017 via iPhone
    1. 公网机器安装代理软件,比如 squid,然后其它 10 台配置代理,用 export http_proxy https_proxy 即可
    2. 公网机器配置成网关,其它 10 台把网关改为公网的内网 IP

    建议方案 1
    billion
        25
    billion  
    OP
       Nov 8, 2017 via iPhone
    @liyvhg 因为还有一个 upstream 上游代理。如果这样做,岂不是公网需要全局走代理了?能不能设置只有来自内网的请求经过公网服务器再走上游代理,公网自己产生的流量不经过上游代理?
    liyvhg
        26
    liyvhg  
       Nov 8, 2017 via Android
    @billion 加 iptables 转发规则就可以了
    JasperYanky
        27
    JasperYanky  
       Nov 8, 2017
    tinyproxy 最简单吧
    xdz
        28
    xdz  
       Nov 8, 2017
    如果用透明代理转发 https,会有证书问题。
    kuaner
        29
    kuaner  
       Nov 8, 2017
    不需要代理软件呀,就是内网主机通过路由器上网嘛,vpc 里面都是这么干的
    sujin190
        30
    sujin190  
       Nov 8, 2017
    直接把内网的默认网关改到那台机器去呗,让后有公网 ip 的机器再开 nat 就行了啊
    billion
        31
    billion  
    OP
       Nov 8, 2017
    @xdz 那应该怎么办?
    ryd994
        32
    ryd994  
       Nov 8, 2017 via Android
    不止是 nat 转发,还要配置 ip_forwarding=1
    billion
        33
    billion  
    OP
       Nov 8, 2017
    @liyvhg 没有 iptables。。。
    billion
        34
    billion  
    OP
       Nov 8, 2017
    @gstqc 目前正是用的方法 1,但是发现 tinyproxy 对 https 支持不好。正在尝试 squid
    wwqgtxx
        35
    wwqgtxx  
       Nov 8, 2017 via iPhone
    @billion 你就不能装一个 iptables 么……………………
    pqee
        36
    pqee  
       Nov 8, 2017
    都让开,我来现身说法:

    TCP 代理用 Nginx 最好,同理 HTTP HTTPS SSH 等基于 TCP 的协议全部支持。


    不过楼主这种情况,建议还是上 SLB 吧,没几个钱。
    akira
        37
    akira  
       Nov 8, 2017
    @pqee 审题审题, 需求理解有偏差啊
    yingfengi
        38
    yingfengi  
       Nov 8, 2017 via Android
    @billion 防火墙啊,路由模式部署在出口,下面服务器直接一个局域网就好了啊
    yingfengi
        39
    yingfengi  
       Nov 8, 2017 via Android
    额。。。vps 啊,,,我以为公司的服务器。。。
    pq
        40
    pq  
       Nov 8, 2017
    socks 5 proxy ?
    msg7086
        41
    msg7086  
       Nov 8, 2017   ❤️ 1
    Linux:
    iptables masquerade
    iptables 是内置在内核里的,除非是自己编译内核并且手动裁剪了 iptables 模块……

    Windows:
    RRDS https://technet.microsoft.com/en-us/library/dd469812.aspx

    BSD:
    Packet Filter https://www.openbsd.org/faq/pf/nat.html
    lslqtz
        42
    lslqtz  
       Nov 8, 2017 via iPhone
    sniproxy ?
    billion
        43
    billion  
    OP
       Nov 8, 2017
    最后使用 squid 实现了我的需求。

    但是我发现一个很奇怪的地方。在 Http Headers 里面,如果设置了

    accept-encoding = 'gzip, deflate, br'
    再走 Squid,那么返回的网页是乱码。但是如果不使用 Squid 或者不指定 accept-encoding,那么网页就一切正常。
    flynaj
        44
    flynaj  
       Nov 8, 2017 via Android
    简单高效,golang 开发 https://github.com/ginuerzh/gost
    billion
        45
    billion  
    OP
       Nov 9, 2017
    @flynaj 这就是我想要的东西。感谢。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4066 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 80ms · UTC 00:54 · PVG 08:54 · LAX 17:54 · JFK 20:54
    ♥ Do have faith in what you're doing.