架设透明代理实现 HTTP/HTTPS 流量转发的最高效方案是什么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
billion
V2EX    问与答

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

  •  < href="Javascript:" Onclick="downVoteTopic(404424);" class="vote">
  •   billion 2017-11-07 20:47:24 +08:00 11570 次点击
    这是一个创建于 2897 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在有 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     Solana     5979 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 01:42 PVG 09:42 LAX 18:42 JFK 21:42
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86