本文使用「署名 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
有的小夥伴或許沒有使用過 VPC 網絡下的服務器,在該網絡環境下,服務器默認沒有公網 IP ,因此用戶沒法訪問到服務器。通常策略是使用 SLB 進行入網流量代理,這樣用戶就能從公網訪問服務器上的應用了。apache
可是這樣只能解決流量進入的問題,並解決不了 VPC 環境下的內網機器訪問公網資源的問題,給每一臺機器單獨分配 IP 顯然不是最優解,這時咱們通常會選擇使用某一臺服務器做爲出口,搭建代理服務器。編程
爲內網環境服務器搭建代理服務器,咱們通常會優先選擇 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、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。
喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)