搭建自己的Google--nginx反向代理Google(ubuntu 16.04)

最近由于不能描述的原因,很多服务器挂了……

实际上,作为技术人员,翻墙之所以为刚需,就是为了Google。

bing是残废;baidu是垃圾;唯有Google才能准确提供相关技术文档。

那么,在目前的网络环境下,如何能低风险的访问Google(节省下有关部门的茶钱)?

答案很简单,自己做个服务器,将Google的服务反向代理出来即可。

原理大概就是:

  • 利用nginx的proxy_pass,将访问A域名的请求,转化为访问Google的请求。
  • Google内容,通过nginx反馈给客户端。
  • 对于客户来说,就是访问了一个Google的镜像站。

一切都很完美。

参考了N个帖子后。开工如下:

重新编译nginx

  • 查看下当前系统自带的nginx

    1
    2
    3
    4
    5
    6
    $nginx -V
    nginx version: nginx/1.10.3 (Ubuntu)
    built with OpenSSL 1.0.2g 1 Mar 2016
    TLS SNI support enabled
    configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads

    这就是ubuntu 16.04自带的nginx的编译选项。记录下来备用。

  • 下载对应版本nginx源码

    既然是ningx/1.10.3,那就去官网下载一个同版本的。

    1
    wget http://nginx.org/download/nginx-1.10.3.tar.gz

    解压,备用。

  • 下载所需的扩展模块

    需要两个模块源代码。分别是页面内容替代库和大佬专为google反代开发的过滤模块。

    1
    2
    git clone https://github.com/cuber/ngx_http_google_filter_module
    git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module

    记住库路径

  • 编译工具和依赖库安装

    这个无需多说,人家需要我就安~

    1
    sudo apt install libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev libxml2 libxml2-dev libxslt1-dev libgd-dev libgeoip-dev build-essential
  • 编译&安装

    进入nginx-1.10.3目录,执行:

    1
    2
    3
    ./configure --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads
    --add-module={YOUR_PATH}ngx_http_google_filter_module
    --add-module={YOUR_PATH}ngx_http_substitutions_filter_module

    注意,最后的add-module里面的YOUR_PATH是刚才git的那2个工程的path

    1
    2
    3
    make;
    sudo make install
    sudo cp -rf objs/nginx /usr/sbin/nginx

    至此,nginx已经OK

  • 测试

    1
    nginx -V (看看最后是不是包含了add-module)

域名

  • 域名解析更改

    把一个域名指向服务器地址即可。

    (假设你希望用 google.0w0.io 。以下配置都以此为例)

搞定证书的一摊事

  • 安装acme.sh

    1
    wget https://get.acme.sh -O install_acme.sh ; bash install_acme.sh
  • 申请个证书

    1
    acme.sh --issue -d google.0w0.io --nginx

    证书搞定后,会保存在 `~/.acme/google.0w0.io下。

ps: 这里多说一句,acme包含三种域名所有权验证。最简单的是standalone,这个需要当前服务器80端口工作正常。其次是nginx,很快就搞定。还有一种是webroot,这个没试。按实际情况选择吧。

综合配置

  • nginx配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    proxy_cache_path /tmp/nginx/cache/one levels=1:2 keys_zone=one:10m max_size=2g;
    proxy_cache_key "$host$request_uri";
    upstream www.google.com {
    server 172.217.160.100:443 weight=1 max_fails=3;
    server 172.217.160.68:443 weight=1 max_fails=3;
    server 172.217.27.132:443 weight=1 max_fails=3;
    server 216.58.200.228:443 weight=1 max_fails=3;
    server 216.58.200.36:443 weight=1 max_fails=3;
    }
    server {
    listen 80;
    server_name google.0w0.io;
    # http to https
    location / {
    rewrite ^/(.*)$ https://google.0w0.io$1 permanent;
    }
    }
    server {
    listen 443 ssl;
    server_name google.0w0.io;
    resolver 8.8.8.8;
    ssl on;
    ssl_certificate /srv/www/google.0w0.io/ssl/server.cer;
    ssl_certificate_key /srv/www/google.0w0.io/ssl/server.key;
    ssl_dhparam /srv/www/google.0w0.io/ssl/dhparam.pem;
    access_log off;
    error_log on;
    error_log /var/log/nginx/google-proxy-error.log;
    location / {
    google on;
    }
    }

    基本照抄就可以了。里面的证书路径,按照自己的来。其中server.cer 就是 acme.sh申请下来的fullchain.cer

细小但重要的的事情

  • 外人勿用

    nginx配置里面,在location/ 域里面添加:

    1
    2
    auth_basic "for better search...";
    auth_basic_user_file /srv/www/google.0w0.io/password;

    其中,password文件,用一下脚本生成:

    1
    printf "username:$(openssl passwd -crypt password)\n" >> password

    把里面的username和password改为自己的就可以了。

    利用auth_basic,可以阻挡外人访问我们自己的网站。包括爬虫~