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

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

  •  
  •   billion · 2017-11-07 20:47:24 +08:00 · 11050 次点击
    这是一个创建于 2571 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    第 1 条附言  ·  2017-11-07 21:31:11 +08:00
    如果能系统全局代理最好,因为内网服务器是 CentOS,每一台上面还跑了 4 个系统为 Ubuntu 的 Docker 容器。如果能 CentOS 全局代理,那么就比较方便。
    第 2 条附言  ·  2017-11-08 18:30:12 +08:00

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

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

    accept-encoding = 'gzip, deflate, br'
    

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

    45 条回复    2017-11-09 11:14:05 +08:00
    hduwillsky
        1
    hduwillsky  
       2017-11-07 21:02:39 +08:00 via iPhone
    iptables + bridge
    billion
        2
    billion  
    OP
       2017-11-07 21:34:48 +08:00
    @hduwillsky 有点麻烦。
    roychan
        3
    roychan  
       2017-11-07 21:38:13 +08:00
    tinyproxy? squid?
    Lentin
        4
    Lentin  
       2017-11-07 22:18:25 +08:00
    -0-那为什么不直接加个交换机
    试试 haproxy ?
    billion
        5
    billion  
    OP
       2017-11-07 22:32:34 +08:00
    @Lentin 因为是云服务器
    pheyer
        6
    pheyer  
       2017-11-07 22:44:47 +08:00 via iPhone
    多账户的酸酸?
    xenme
        7
    xenme  
       2017-11-07 22:46:18 +08:00 via iPhone
    centos 改成软路由,然后内网网关指向它就好了
    ik
        8
    ik  
       2017-11-07 22:55:04 +08:00 via iPhone
    dhcpd 有什么问题吗?
    fzinfz
        9
    fzinfz  
       2017-11-07 23:49:29 +08:00 via iPad
    试下 avege
    kuaner
        10
    kuaner  
       2017-11-07 23:52:09 +08:00
    内网的所有机器设置默认网关到外网到那台就可以了
    kuaner
        11
    kuaner  
       2017-11-07 23:52:35 +08:00
    lz 应该是阿里云的 vpc?
    billion
        12
    billion  
    OP
       2017-11-07 23:53:41 +08:00
    @fzinfz 这个已经废弃了。而且我并不需要梯子。。
    billion
        13
    billion  
    OP
       2017-11-07 23:54:13 +08:00
    @kuaner 是的
    hezhe
        14
    hezhe  
       2017-11-07 23:56:28 +08:00
    能不能用 nginx 来反向代理
    billion
        15
    billion  
    OP
       2017-11-08 00:01:04 +08:00
    @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  
       2017-11-08 00:04:04 +08:00
    @billion 你要在能上外网的那台机器上配置 iptables 转发的
    ik
        17
    ik  
       2017-11-08 00:04:07 +08:00 via iPhone
    @billion 网关开启转发 ,忘了还有没有其他操作了
    lbp0200
        18
    lbp0200  
       2017-11-08 00:37:11 +08:00
    我厂运维给我的解决方案是 polipo
    billion
        19
    billion  
    OP
       2017-11-08 08:34:24 +08:00 via iPhone
    @wwqgtxx 能上网的服务器上没有 iptables
    billion
        20
    billion  
    OP
       2017-11-08 08:35:35 +08:00 via iPhone
    @roychan tinyproxy 转发 http 亲测可行。但是 https 全部失败。
    liyvhg
        21
    liyvhg  
       2017-11-08 08:38:45 +08:00 via Android
    我们公司几台这么做的:
    公网那台架个 pptp server,内网的拨上去(设置好开机自动拨号就行)。
    yingfengi
        22
    yingfengi  
       2017-11-08 08:55:45 +08:00 via Android
    出口架一台墙做网关啊
    billion
        23
    billion  
    OP
       2017-11-08 09:00:25 +08:00 via iPhone
    @yingfengi 架墙?
    0ZXYDDu796nVCFxq
        24
    0ZXYDDu796nVCFxq  
       2017-11-08 09:02:40 +08:00 via iPhone
    1. 公网机器安装代理软件,比如 squid,然后其它 10 台配置代理,用 export http_proxy https_proxy 即可
    2. 公网机器配置成网关,其它 10 台把网关改为公网的内网 IP

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

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


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

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

    accept-encoding = 'gzip, deflate, br'
    再走 Squid,那么返回的网页是乱码。但是如果不使用 Squid 或者不指定 accept-encoding,那么网页就一切正常。
    flynaj
        44
    flynaj  
       2017-11-08 19:20:24 +08:00 via Android
    简单高效,golang 开发 https://github.com/ginuerzh/gost
    billion
        45
    billion  
    OP
       2017-11-09 11:14:05 +08:00
    @flynaj 这就是我想要的东西。感谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5317 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:39 · PVG 16:39 · LAX 00:39 · JFK 03:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.