使用 Apache 搭建 VPC 服务器代理

本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或从新修改使用,但须要注明来源。 署名 4.0 国际 (CC BY 4.0)html

本文做者: 苏洋linux

建立时间: 2019年08月10日 统计字数: 2779字 阅读时间: 6分钟阅读 本文连接: soulteary.com/2019/08/10/…docker


使用 Apache 搭建 VPC 服务器代理

有的小伙伴或许没有使用过 VPC 网络下的服务器,在该网络环境下,服务器默认没有公网 IP ,因此用户没法访问到服务器。通常策略是使用 SLB 进行入网流量代理,这样用户就能从公网访问服务器上的应用了。apache

可是这样只能解决流量进入的问题,并解决不了 VPC 环境下的内网机器访问公网资源的问题,给每一台机器单独分配 IP 显然不是最优解,这时咱们通常会选择使用某一台服务器做为出口,搭建代理服务器。编程

使用容器配置 Apache 代理服务器

为内网环境服务器搭建代理服务器,咱们通常会优先选择 Apache Traffic Server ,可是其实使用 Apache 也能够简单的解决问题。json

相比较 Traffic Server,使用 Apache 做为代理服务器很是简单。容器编排文件 docker-compose.yml 只须要 22 行:安全

version: "3.6"

services:

  proxy:
    image: httpd:2.4.39-alpine
    restart: always
    container_name: network-proxy
    ports:
      - 1080:80
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./httpd.conf:/usr/local/apache2/conf/httpd.conf
    healthcheck:
      test: ["CMD-SHELL", "httpd -T"]
      interval: 5s
      retries: 12
    logging:
        driver: "json-file"
        options:
            max-size: "10m"
复制代码

Apache 配置文件 httpd.conf也无需像网上配置那么复杂,只须要下面这30来行就行:bash

ServerName localhost
Listen 80

LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_http2_module modules/mod_proxy_http2.so
LoadModule unixd_module modules/mod_unixd.so

User daemon
Group daemon

ErrorLog /proc/self/fd/2
LogLevel warn

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog /proc/self/fd/1 common

ProxyRequests On
ProxyVia On

<Proxy *>
    Order deny,allow
    Deny from all
    Allow from 192.168.0.0/24
</Proxy>
复制代码

若是你和我同样,明确代理服务器的服务目标,能够在 <Proxy> 配置中将其声明,避免服务被盗用,固然,推荐搭配防火墙安全策略一块儿使用,万无一失。服务器

使用 docker-compose up 启动应用,会看到相似下面的日志:网络

network-proxy | [Sat Aug 10 15:32:06.652264 2019] [mpm_event:notice] [pid 1:tid 140135351733576] AH00489: Apache/2.4.39 (Unix) configured -- resuming normal operations
network-proxy | [Sat Aug 10 15:32:06.652318 2019] [core:notice] [pid 1:tid 140135351733576] AH00094: Command line: 'httpd -D FOREGROUND'
复制代码

看日志服务确实是启动起来了,可是是否有效不得而知,因此咱们要进行测试。

测试服务

在另一台服务器上使用 curl 测试代理服务器是否正常工做,若是可否正常使用,结果会相似下面这样:

# http_proxy=http://192.168.0.50:1080 curl http://cip.cc/
IP	: 39.xxx.xxx.xxx
地址	: 中国  北京
运营商	: 阿里云/电信/联通/移动/铁通/教育网
数据二	: 香港 | 特别行政区
数据三	: 中国北京北京市 | 阿里云

URL	: http://www.cip.cc/39.xxx.xxx.xxx
复制代码

配置服务器

让服务器默认出公网的流量走代理服务器很简单,只须要在 /etc/profile 配置文件中添加两行便可:

export http_proxy=http://192.168.0.50:1080
export https_proxy=http://192.168.0.50:1080
复制代码

对 profile 文件进行修改后,须要手动重载文件:

source /etc/profile
复制代码

或者断开当前的终端链接,从新链接服务器,也可让配置生效。再次使用 curl 对代理服务器进行验证,会看到默认出公网的流量会先通过代理服务器。

# curl -v https://www.baidu.com
* Rebuilt URL to: https://www.baidu.com/
*   Trying 192.168.0.50...
* TCP_NODELAY set
* Connected to 192.168.0.50 (192.168.0.50) port 1080 (#0)
* allocate connect buffer!
* Establish HTTP proxy tunnel to www.baidu.com:443
> CONNECT www.baidu.com:443 HTTP/1.1
> Host: www.baidu.com:443
> User-Agent: curl/7.58.0
> Proxy-Connection: Keep-Alive
>
< HTTP/1.0 200 Connection Established
< Proxy-agent: Apache/2.4.39 (Unix)
<
* Proxy replied 200 to CONNECT request
* CONNECT phase completed!
* ALPN, offering h2
* ALPN, offering http/1.1
复制代码

配置容器服务

Docker 官方文档中有提过 ,若是想要 Docker Daemon 使用系统代理配置,须要在其启动以前进行配置,因此配置 daemon.json 大法在此处就不适用啦。

解决方法是覆盖默认的 docker.service 配置文件,先建立一个服务配置目录:

sudo mkdir -p /etc/systemd/system/docker.service.d
复制代码

而后建立一个文件并编辑文件内容 /etc/systemd/system/docker.service.d/http-proxy.conf ,添加环境变量:

[Service]

Environment="HTTP_PROXY=http://192.168.0.50:1080"
Environment="HTTPS_PROXY=http://192.168.0.50:1080"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.0.0/24,*.domain.ltd"
复制代码

接着重启服务:

sudo systemctl daemon-reload && sudo systemctl restart docker
复制代码

最后,使用 docker pull 命令验证配置是否正常:

# docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
050382585609: Already exists
Digest: sha256:6a92cd1fcdc8d8cdec60f33dda4db2cb1fcdcacf3410a8e05b3741f44a9b5998
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
复制代码

配置容器内部环境

若是不进行容器内部网络配置,使用容器访问公网服务,基本会遇到网络超时:

docker run --rm -it alpine

/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.10/main: network error (check Internet connection and firewall)
WARNING: Ignoring APKINDEX.00740ba1.tar.gz: No such file or directory
复制代码

Docker 官方文档其实也有提过 ,解决方案的原理是:经过编辑 ~/.docker/config.json Docker 客户端配置文件,来为容器自动注入 PROXY 环境变量。

{
    "proxies": {
        "default": {
            "httpProxy": "http://192.168.0.50:1080",
            "httpsProxy": "http://192.168.0.50:1080",
            "noProxy": "127.0.0.1,localhost,192.168.0.0/24,*.domain.ltd"
        }
    }
}
复制代码

将上述配置添加好以后,无须重启容器服务,直接再次执行命令便可:

# docker run --rm -it alpine

/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
v3.10.1-62-g89778c626e [http://dl-cdn.alpinelinux.org/alpine/v3.10/main]
v3.10.1-60-gb0081284ea [http://dl-cdn.alpinelinux.org/alpine/v3.10/community]
OK: 10337 distinct packages available
复制代码

至此,VPC 环境下的服务器和容器访问外网就设置完毕啦。

最后

别忘记设置防火墙规则,服务器访问公网的 IP 不容许入网流量,减小服务器对外安全隐患。

—EOF


我如今有一个小小的折腾群,里面汇集了一些喜欢折腾的小伙伴。

在不发广告的状况下,咱们在里面会一块儿聊聊软件、HomeLab、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。

喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核)

关于折腾群入群的那些事

相关文章
相关标签/搜索