billion
V2EX  ›  问与答

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

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

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

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

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


    不过楼主这种情况,建议还是上 SLB 吧,没几个钱。
    akira
    akira
    Nov 8, 2017
    37
    @pqee 审题审题, 需求理解有偏差啊
    yingfengi
    yingfengi
    Nov 8, 2017 via Android
    38
    @billion 防火墙啊,路由模式部署在出口,下面服务器直接一个局域网就好了啊
    yingfengi
    yingfengi
    Nov 8, 2017 via Android
    39
    额。。。vps 啊,,,我以为公司的服务器。。。
    pq
    pq
    Nov 8, 2017
    40
    socks 5 proxy ?
    msg7086
    msg7086
    Nov 8, 2017❤️1
    41
    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
    lslqtz
    Nov 8, 2017 via iPhone
    42
    sniproxy ?
    billion
    billion
    OP
    Nov 8, 2017
    43
    最后使用 squid 实现了我的需求。

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

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