SquidとTailscaleでフォワードプロキシを構築する

Posted on Dec 5, 2023

Step1 Tailscaleのインストール

適当にアカウントを作りTailscaleのコントロールパネルにアクセスします。プロキシになる側のサーバー(VPSなど)と使う側のサーバー(自宅サーバー)に画面に表示される手順に従ってインストールします。 必要に応じてACLを設定しましょう。なくてもなんとかなることはなります。

Step2 ファイアウォールの設定

Tailscale経由でのみSquidへのアクセスを受け入れるように設定します。間違えるとオープンプロキシになるので注意してください。

sudo ufw allow in on tailscale0 from 100.64.0.0/10 to any port 3128 proto tcp

Step3 Squidの設定

sudo apt install squidでSquidを入れます。設定を変えていく訳ですがDebian系のLinuxの場合、デフォルトの設定ファイルが長すぎてこれをしばいていると人生の貴重な時間が浪費されてしまいます。以下の方法でサクッと設定します。

sudo mv /etc/squid/squid.conf ./squid.conf.backup
sudo nano /etc/squid/squid.conf

以下の内容を書き込みます。

acl localnet src 100.64.0.0/10

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 443         # https
acl CONNECT method CONNECT

# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# ローカルIPへのアクセスを拒否(SSRF対策)
acl localdst dst 0.0.0.0
acl localdst dst 0.0.0.1-0.255.255.255
acl localdst dst 10.0.0.0/8
acl localdst dst 100.64.0.0/10
acl localdst dst 169.254.0.0/16
acl localdst dst 172.16.0.0/12
acl localdst dst 192.168.0.0/16
acl localdst dst fc00::/7
acl localdst dst fe80::/10
http_access deny localdst

# 念のため
include /etc/squid/conf.d/*

http_access allow localnet
http_access allow localhost

# 許可されてないのを全部拒否
http_access deny all

# 必要に応じてワーカー数を調整
workers 2

# Listenするポート
http_port 3128

Step4 完成

sudo systemctl enable --now squid (既に起動してるならsudo systemctl restart squid)で起動させます。少し時間がかかりますが辛抱強く待ってください。

Squidを使う側のサーバーからcurl -x http://[squidサーバーのTailscale内でのIPアドレス]:3128 ifconfig.meを実行してVPSのIPが返ってくれば成功です。
Tailscale内でのIPアドレスはTailscaleのコントロールパネルかsudo tailscale statusで確認可能です。