2026年5月24日
2026年5月24日
プロキシ経由でアクセスIPを変更する方法|自前プロキシの構築・curlやWordPressからの利用・確認手順
接続先のサーバーから見える送信元IPを変えたいときは、通信をプロキシサーバーに中継させます。接続先には、自分の回線のIPではなくプロキシのIPが見えるようになります。正当な用途としては、外部APIの「許可IP」に固定の送信元を登録する、地域ごとに表示が変わる自社サイトを確認する、社内のアクセス経路をまとめる、といったものがあります。この記事では、仕組みと注意点、VPS上に認証付きのプロキシを立てる手順、curl・SSH・WordPressからの使い方、IPが本当に変わったかの確かめ方を説明します。
仕組みと、使う前に知っておくこと
接続先に見えるIPが変わる理由
プロキシを使うと、クライアントはプロキシに接続し、プロキシが代わりに接続先へアクセスします。接続先が受け取るTCP接続の送信元はプロキシなので、アクセスログに残るIPもプロキシのものになります。HTTPSの場合、クライアントは CONNECT メソッドでプロキシにトンネルを作らせ、その中で接続先とTLS通信をするため、プロキシからは通信の中身は見えません。
元のIPが伝わってしまうことがある
プロキシの設定によっては、X-Forwarded-For や Via といったヘッダーに元のIPやプロキシの情報を付けて送ります。社内の透過型プロキシなどではこれが普通の動きです。送信元を変える目的で自前のプロキシを立てる場合は、これらのヘッダーを付けない設定にします(後述)。
守るべき線
送信元IPを変えられるのは便利ですが、使い方には線があります。アクセス制限や利用停止を回避する目的での利用、サービスの利用規約で禁止された地域制限の回避、許可されていないシステムへのアクセスは行わないでください。また、無料で公開されているプロキシは、運営者が通信を記録・改ざんできる立場にあるため、ログイン情報や業務データを通すのは避けます。用途に合った自前のプロキシか、信頼できる事業者のサービスを使うのが基本です。
VPS に認証付きのプロキシを立てる(Squid)
固定の送信元IPが欲しい場合は、グローバルIPを持つVPSに Squid を入れるのが手軽です。最も注意すべき点は、誰でも使える「オープンプロキシ」にしないことです。オープンプロキシは短時間で第三者に見つかり、不正アクセスやスパムの踏み台にされ、VPSのIPがブラックリストに載る原因になります。
インストールとパスワードファイルの作成
Ubuntu / Debian の例です。
sudo apt update
sudo apt install squid apache2-utils
# プロキシ利用者のパスワードファイルを作成(パスワードは対話で入力)
sudo htpasswd -c /etc/squid/passwords proxyuser
sudo chown proxy:proxy /etc/squid/passwords
sudo chmod 640 /etc/squid/passwords
パスワードはコマンドライン引数に書かず、対話入力にします。シェルの履歴やプロセス一覧に残るのを避けるためです。
設定ファイルの編集
/etc/squid/squid.conf をバックアップしてから編集します。既定の設定ファイルには多くの記述がありますが、http_access は上から順に評価されるので、許可のルールは既存の http_access deny all より前に置きます。
# 認証の設定(パスはディストリビューションによって異なる場合がある)
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm proxy
acl authenticated proxy_auth REQUIRED
acl allowed_clients src 198.51.100.10/32
# 許可した接続元から、認証に成功した場合だけ使える
http_access allow allowed_clients authenticated
http_access deny all
# 元のIPやプロキシの情報をヘッダーで送らない
forwarded_for delete
via off
http_port 3128
allowed_clients には、プロキシを使う側(自宅やオフィス、WordPressサーバー)のIPを指定します。認証と接続元の制限を両方かけることで、パスワードが漏れた場合の被害も抑えられます。
設定の文法は sudo squid -k parse で確認し、問題がなければ sudo systemctl restart squid で反映します。
ファイアウォールで接続元を絞る
Squid の設定に加えて、OS のファイアウォールでもプロキシのポートへの接続元を限定します。
sudo ufw allow from 198.51.100.10 to any port 3128 proto tcp
sudo ufw status numbered
Basic 認証のパスワードは、クライアントとプロキシの間を暗号化せずに流れます。インターネット越しに使う場合は、接続元の制限をかけたうえで、次に説明する SSH トンネルや VPN を組み合わせると安全性が上がります。
クライアントからプロキシを使う
curl で確かめる
まず、プロキシを通したときと通さないときで、外から見えるIPが変わるかを確かめます。
# プロキシを通さない場合
curl https://ifconfig.me
# プロキシを通す場合(パスワードは対話で入力)
curl -x http://proxy.example.com:3128 --proxy-user proxyuser https://ifconfig.me
2つ目の結果がVPSのIPになっていれば成功です。407 が返る場合は認証の失敗、接続が拒否される場合はファイアウォールか allowed_clients の設定を確認します。
環境変数で指定する
多くのコマンドラインツールは、HTTP_PROXY / HTTPS_PROXY / NO_PROXY の環境変数を参照します。大文字と小文字のどちらを読むかはツールによって異なるため、うまく効かない場合は両方設定して試します。
export HTTPS_PROXY=http://proxy.example.com:3128
export NO_PROXY=localhost,127.0.0.1,.internal.example.com
NO_PROXY に社内のホストやローカルアドレスを入れておかないと、内部向けの通信までプロキシへ送られてしまいます。
SSH の動的ポートフォワーディングを使う
VPSにSSHでログインできるなら、プロキシソフトを入れなくても、SSH を SOCKS プロキシとして使えます。通信はSSHで暗号化されます。
# ローカルの1080番ポートを SOCKS プロキシにする
ssh -D 1080 -N user@vps.example.com
# 別の端末から確認(--socks5-hostname で名前解決もプロキシ側で行う)
curl --socks5-hostname 127.0.0.1:1080 https://ifconfig.me
--socks5 ではなく --socks5-hostname を使うのは、名前解決をプロキシ側で行わせるためです。前者だと、DNSの問い合わせは手元の回線から出ます。
ブラウザでは、ブラウザやOSのプロキシ設定に SOCKS のアドレスを指定します。設定の場所はブラウザやOSのバージョンで異なります(2026年10月現在)。
WordPress の外向き通信をプロキシ経由にする
外部APIが「登録したIPからのアクセスだけ許可」という条件を持つ場合、WordPress の外向き通信をプロキシ経由にすると、送信元を固定できます。WordPress の HTTP API(wp_remote_get() など)は、wp-config.php の定数でプロキシを使えます。
define( 'WP_PROXY_HOST', 'proxy.example.com' );
define( 'WP_PROXY_PORT', '3128' );
define( 'WP_PROXY_USERNAME', 'proxyuser' );
define( 'WP_PROXY_PASSWORD', 'your-proxy-password' );
// プロキシを通さないホスト(カンマ区切り)
define( 'WP_PROXY_BYPASS_HOSTS', 'localhost, www.example.com' );
この設定は、WordPress 本体やプラグインの更新確認を含む、HTTP API を使うすべての外向き通信に効きます。プロキシが止まると更新確認や外部API連携も止まるので、影響範囲を理解したうえで設定してください。HTTP API を使わず独自に cURL を呼ぶプラグインには効きません。wp-config.php は第三者が読めないパーミッションにし、バージョン管理に含める場合はパスワードを環境変数など別の場所に分けます。
反映後は、WP-CLI で外から見えるIPを確かめられます。
wp eval 'echo wp_remote_retrieve_body( wp_remote_get( "https://ifconfig.me/ip" ) );'
IP が変わらない・漏れるときの確認ポイント
- IPv6 で直接出ている:プロキシがIPv4だけで、手元の回線がIPv6に対応していると、アプリによってはプロキシを通らずにIPv6で接続することがあります。
curl -6 https://ifconfig.meで、IPv6の送信元も確かめます。 - DNSの問い合わせが手元から出ている:SOCKSでは
--socks5-hostnameのように、名前解決をプロキシ側に任せる設定にします。 - ヘッダーで元のIPが送られている:自分の管理するサーバーのアクセスログやヘッダーを表示するページで、
X-Forwarded-ForやViaが付いていないかを見ます。 - ブラウザのWebRTC:ブラウザでは、WebRTC がプロキシを通らずに手元のIPを相手に伝えることがあります。ブラウザごとの設定や仕様を確認してください。
まとめ
- プロキシを通すと、接続先には自分の回線ではなくプロキシのIPが見える
- 自前のプロキシは認証と接続元の制限を両方かけ、オープンプロキシにしない
forwarded_for deleteとvia offで、元のIPやプロキシ情報をヘッダーで送らないようにする- 手軽に暗号化したいときは SSH の動的ポートフォワーディング、WordPress の外向き通信は
WP_PROXY_*定数で固定IPにできる - IPv6・DNS・ヘッダー・WebRTC の経路で元のIPが漏れていないかを確かめ、規約に反する使い方はしない