2019年5月22日 星期三

[Docker] Azure上使用Docker建立Squid Proxy

[Docker] Azure上使用Docker建立Squid Proxy

簡介

最近剛好有需要使用到其他國家的IP,除了VPN外,也可以使用squid Proxy來處理,同時程式方面也可以透過Proxy使用HttpClient。所以在Azure上自己架了一台Web Proxy,這裡做簡單的紀錄。

(Azure上也有提供Web Safety Proxy 7.0 BYOLISO檔可使用,這部分有興趣的人可參考Deploy Web Safety and Squid Proxy in Azure)

測試環境

項目 版本
OS Linux (ubuntu 18.04) (記憶體至少2G以上)
Docker 18.09.6
Docker Compose 1.24.0
Docker Image sameersbn/squid:3.5.27-1

我是在Azure直接開一台Linux (ubuntu 18.04) VM,標準B1ms (1 vcpu,2 GiB 記憶體) 進行測試,如何在Azure上建立VM在這裡就不多做解釋。

建立squid Proxy

  1. 安裝Docker (Docker官方文件)

    curl -fsSL https://get.docker.com/ | sh
    
  2. 設定未來開機後都自己啟動 docker

    systemctl enable docker
    
  3. 安裝 Docker Compose (Docker Compose官方文件)

    sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
  4. 安裝完畢後給予 Docker Compose 需要的執行權限。

    sudo chmod +x /usr/local/bin/docker-compose
    
  5. 安裝 apache2-utils (htpasswd指令需要)

    sudo apt install apache2-utils
    
  6. 建立 squid container

    sudo docker run --name squid -d --restart=always \
      --publish 3128:3128 \
      --volume /opt/squid/cache:/var/spool/squid \
      sameersbn/squid:3.5.27-1
    
    • --name 指定Container名稱
    • -d (daemon mode)指定背景執行
    • --publish 3128:3128 開放port的對應
    • --restart=always:當 Container 遇到例外情況 stop 時,docker 會試著重新啟動此 Container
    • --volume 設定掛載本機的資料夾/檔案至Container的某個資料夾/檔案
      • /var/spool/squid Squid 預設 cache 目錄
      • /var/log/squid Squid 預設 log 目錄
    • sameersbn/squid:3.5.27-1 Docker Image名稱
  7. 檢查 squid container是否成功執行

    sudo docker ps
    

    如要查看log 可執行以下指令,或直接用--volume 掛載/var/log/squid資料夾

    docker exec -it squid tail -f /var/log/squid/access.log
    docker exec -it squid cat /var/log/squid/cache.log
    
  8. 取得預設的squid.config
    /etc/squid/squid.conf 檔案從Container下載到本機/opt/squid/config/squid.conf

    sudo docker cp squid:/etc/squid/squid.conf /opt/squid/config/squid.conf
    

    Reference: Docker CLI docs for cp

  9. 先刪除squid Container

    sudo docker rm -f squid
    
  10. 編輯squid.conf(加入帳密驗證)
    開啟剛剛下載下來的squid.conf(/opt/squid/config/squid.conf)

    acl SSL_ports port 443
    acl Safe_ports port 80  # http
    acl Safe_ports port 21  # ftp
    acl Safe_ports port 443  # https
    acl Safe_ports port 70  # gopher
    acl Safe_ports port 210  # wais
    acl Safe_ports port 1025-65535 # unregistered ports
    acl Safe_ports port 280  # http-mgmt
    acl Safe_ports port 488  # gss-http
    acl Safe_ports port 591  # filemaker
    acl Safe_ports port 777  # multiling http
    acl CONNECT method CONNECT
    
    auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
    acl squid_user proxy_auth REQUIRED
    http_access allow squid_user
    

    前面幾行到acl CONNECT method CONNECT都是預設的,我只加入後面三行設定帳密權限驗證

    auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
    acl squid_user proxy_auth REQUIRED
    http_access allow squid_user
    

    加入完後,儲存關閉。

  11. 設定squid使用者密碼文件

    sudo htpasswd -c /opt/squid/config/htpasswd yourUsername
    
    • -c 建立一個加密文件
    • /opt/squid/config/htpasswd 存放的路徑
    • yourUsername 自定義使用者名稱

    執行後系統會提示輸入密碼,確認後即建立密碼文件


    亦可使用-b直接設定密碼

    sudo htpasswd -bc /opt/squid/config/htpasswd yourUsername yourPassword
    
  12. 撰寫為docker-compose.yml
    /opt/squid資料夾下建立docker-compose.yml,並將剛剛設定完成的squid.confhtpasswd也設定掛載到Container裡面

    version: "3"
    
    services:
      squid-proxy:
        image: sameersbn/squid:3.5.27-1
        container_name: squid
        restart: always
        ports:
        - 3128:3128
        volumes:
        - /opt/squid/cache:/var/spool/squid
        - /opt/squid/config/squid.conf:/etc/squid/squid.conf
        - /opt/squid/config/htpasswd:/etc/squid/passwd
    
  13. 執行docker-compose.yml
    /opt/squid目錄下執行

    sudo docker-compose up -d
    
  14. 如為Azure VM 須將輸入安全性規則新增開啟3128 Port
    輸入安全性規則

  15. 完成~可以來測試看看此Proxy Server是否架設成功



參考資料

如有錯誤或建議,歡迎留言指教,謝謝!!
(相關內容如有侵犯隱私或著作權,請協助通知刪除,感謝)

沒有留言:

張貼留言