フォワードプロキシとは
フォワードプロキシを利用することで、接続元のIPを変更および、固定することが可能です。
接続元のサーバが複数台存在し、IP制限をかけてある接続先に対してリクエストをする際に、それぞれのIPアドレスすべてを許可するのは大変ですし、運用上の課題があります。
(仕組みや目的は違いますが、AWSなどではプライベートサブネット内から NAT Gateway を利用し、固定のIPで接続先にリクエストをすることは可能です。)
そこでフォワードプロキシ用のサーバをNginxで構築し、そのサーバを経由させることで、接続元IPの変更を実現します。
(Squidで用意したことはあったのですが、Nginxでやったことはなかったので作業ログを残しておこうと思います。)
フォワードプロキシをNginxで構築する
1 2 3 4 |
yum update yum install git yum groupinstall -y "Development Tools" yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel git |
1 2 3 4 5 6 7 8 9 |
cd /opt/ wget https://nginx.org/download/nginx-1.25.5.tar.gz tar zxvf nginx-1.25.5.tar.gz cd /opt/nginx-1.25.5 git clone https://github.com/chobits/ngx_http_proxy_connect_module.git patch -p1 < ./ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_102101.patch ./configure --add-module=./ngx_http_proxy_connect_module make make install |
1 2 3 4 |
# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.25.5 built by gcc 7.3.1 20180712 (Red Hat 7.3.1-17) (GCC) configure arguments: --add-module=./ngx_http_proxy_connect_module |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
vim /etc/systemd/system/nginx.service ==== [Unit] Description=The NGINX HTTP and reverse proxy server After=network.target [Service] Type=forking ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop PIDFile=/usr/local/nginx/logs/nginx.pid PrivateTmp=true [Install] WantedBy=multi-user.target ==== systemctl enable nginx systemctl start nginx curl --proxy http://10.1.9.83:8080/ https://scble.net/ |
1 2 3 4 5 6 |
# curl --proxy http://10.1.9.83:8080/ https://scble.net/ curl: (56) Received HTTP code 502 from proxy after CONNECT ==> /usr/local/nginx/logs/error.log <== 2024/07/03 14:57:26 [error] 6262#0: *14 connect() to [2606:4700:3037::6815:2160]:443 failed (101: Network is unreachable) while connecting to upstream, client: 10.1.174.66, server: , request: "CONNECT scble.net:443 HTTP/1.1", host: "scble.net:443" 2024/07/03 14:57:26 [error] 6262#0: *14 proxy_connect: connection error while connecting to upstream, client: 10.1.174.66, server: , request: "CONNECT scble.net:443 HTTP/1.1", host: "scble.net:443" https://github.com/chobits/ngx_http_proxy_connect_module/issues/168#issuecomment-748301616 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
server { listen 8080; # CONNECTメソッドのサポート resolver 8.8.8.8 ipv6=off; proxy_buffers 16 16k; proxy_buffer_size 16k; proxy_connect; proxy_connect_allow all; #proxy_connect_connect_timeout 10s; #proxy_connect_read_timeout 10s; #proxy_connect_send_timeout 10s; # フォワードプロキシの設定 location / { proxy_pass http://$http_host$request_uri; #proxy_set_header Host $http_host; #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } |
まとめ
プログラムからフォワードプロキシを実行する際は、それぞれ適当なライブラリやオプションを使用して、上記で作成したNginxを経由するようにしてください。
アクセス先のログには、接続元のIPがフォワードプロキシで利用したNginxサーバのIPになっていることが確認できると思います。
先ほども上げた通り、仕組みや目的は違いますが AWS NAT Gateway 等を使用することで接続元のIPを固定したり変更したりすることは容易ですが、今回のフォワードプロキシが何かの参考になれば嬉しいです。
ただしクローラーとして IP制限を回避するための利用など、合意の取れていないサービスに対して害となるような利用は控えるように注意してください。