skip to content

squid proxy

最近客戶有個需求, 需要在特定的地區才可以使用特殊的服務, 換句話說...就是這個服務只有在特定的 ip 下才可以使用, 這需求的最簡單粗暴的解決方式, 就是開一台 vm 然後架一個 proxy 就可以達標了

緣起

2022-05-15-18-30-14

最近客戶有個需求, 需要在特定的地區才可以使用特殊的服務, 換句話說…就是這個服務只有在特定的 ip 下才可以使用, 這需求的最簡單粗暴的解決方式, 就是開一台 vm 然後架一個 proxy 就可以達標了

想法

解決問題大概思路其實蠻簡單的, 大致就下面幾個步驟

  • 使用 cloud service 在那區域開個 vm
  • 用 squid 架一個 proxy
  • 使用 httping 測試 proxy(模擬用戶使用)

開幹

開一台 vm, 在 vm 裡面裝 docker

curl -fsSL get.docker.com -o get-docker.sh && chmod 700 get-docker.sh && ./get-docker.sh

# for centos
vi /etc/sysctl.conf
net.ipv4.ip_forward=1

systemctl restart network
sysctl net.ipv4.ip_forward
systemctl enable docker
systemctl restart docker

安裝 proxy 應該是首選 squid 這個已經很成熟的東西

  • 修改 squid.conf 設定檔, 使用帳號密碼的方式來建立 proxy

    可能讀者會問我 squid.conf 檔案在哪? 阿就用 exec 進去 container, 在 /etc/squid/squid.conf 複製出來改就好了 💩💩💩💩💩💩

# squid.conf

# 我是關掉,你也可以不關
cache_log /dev/null
cache deny all

# access_log none

# http_access deny all
# http_access allow all

# 用帳號密碼的方式使用 squid
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm Squid-Proxy
acl authenticated proxy_auth REQUIRED
http_access allow authenticated
  • 新增使用者帳號列表
    • 可以用 htpasswd -c ./passwords username 來新增
    • 或是用線上的 tool 來批次新增

2022-05-15-18-04-07

# passwords

curry:$apr1$BjHgbc.G$KDpGs.hacOp1IZwP9.PNp.
paul:$apr1$n06zcGbI$jONLIhmC8yYN8abGadfls/
  • 使用 docker 建 squid
docker run -d \
  --rm \
  --name squid \
  -p 3128:3128 \
  -v /<app-path>/squid.conf:/etc/squid/squid.conf \
  -v /<app-path>/passwords:/etc/squid/passwords \
  datadog/squid

使用 httping

# 可以看一下使用說明
docker run --rm bretfisher/httping --help

# 基本使用
docker run --rm bretfisher/httping --proxy x.x.x.x.:3128 --proxy-user bb --proxy-password 1234 -g http://baidu.com

# 進階使用
docker run --rm bretfisher/httping --proxy x.x.x.x.:3128 --proxy-user bb --proxy-password 1234 -SGbs -g http://baidu.com

2022-05-15-18-15-32

最後

上面的處理方式, 看起來沒啥問題, 但是生活就是他媽的不容易, 當我建好了 proxy 測試驗證一下發現, 那個 response time 起伏不定, 尤其在某個時間點就會給你大幅的上上下下跳動, 甚至會直接 timeout, 就他媽的心冷…先說結論, 最後問題是解決了, 本來想一起寫出來的, 但是…解決的方式有點複雜還有一篇文章不要有太多分支, 所以還是留在下回再分曉好了 😆😆😆😆

references