Hyper-V 等の VM 上にプロキシと DNS を立てる

Pocket

本ブログでは、ちょいちょいプロキシ環境下での設定方法を紹介しているが、
そういったプロキシ環境下での動作の検証のため、以下を満たすプロキシサーバーを立てたい。

  • OS は Ubuntu 24.04
  • squid によって 8080 ポートにて HTTP プロキシする
  • bind9 によって自身のアドレスを proxy.example.com として名前解決する DNS サーバーとなる

とりあえず、 squid と bind9 をいれて、設定ファイルを必要最低限書き換えてみよう。

export CURRENT_IP_ADDRESS=`hostname -I | tr -s ' ' '\n' | tail -n 1`
sudo apt -y install squid bind9 bind9utils
sudo sed -i -r -e 's/^(#\s*)(http_access allow localnet)/\2/' -e 's/^http_port 3128/http_port 8080/' /etc/squid/squid.conf
sudo sed -i -e 's%^\s*\(//\)\?\s*forwarders {%        forwarders {\n                8.8.8.8;\n        };\n\0%' -e 's%^};%\0\nzone "proxy.example.com" in {\n  type master;\n  file "proxy.example.com.zone";\n};%' /etc/bind/named.conf.options
sudo tee /var/cache/bind/proxy.example.com.zone << EOF > /dev/null
\$TTL 86400
@       IN      SOA     proxy.example.com. root.proxy.example.com. (
                        2023070301      ;Serial
                        3600            ;Refresh
                        1800            ;Retry
                        604800          ;Expire
                        86400           ;Minimum TTL
)
@       IN      NS      proxy.example.com.
@       IN      A       $CURRENT_IP_ADDRESS
EOF
sudo systemctl restart squid named

これだけ。

環境変数 CURRENT_IP_ADDRESShostname -I コマンドで自身の IPアドレス の一つを設定しているが、あらかじめアドレスがわかっているなら、手動で設定しても良い。

プロキシでの動作を検証したい VM と、上記のプロキシ VM を、(Hyper-V の場合)「内部ネットワーク」または「プライベートネットワーク」の仮想スイッチに接続させる。

検証対象 VM の IP アドレスは同じサブネットになるように設定し、 DNS のアドレスも上記プロキシ VM のものを設定する。
一方、プロキシ VM のほうは、 Default Switch と 前述の『「内部ネットワーク」または「プライベートネットワーク」』の両方の仮想スイッチに繋いで、直接インターネット側にも出られるようにしておく。

architecture-beta
    group host(server)[Host PC]
    service winnat(cloud)[WinNAT Default Switch] in host
    group vms(database)[VMs] in host

    service vm1(server)[proxy] in vms
    service vm2(server)[target] in vms
    winnat:B -- T:vm1
    vm1:R -- L:vm2

このように繋ぐことで、プロキシ経由を想定した通信のテストが行える。

検証したい VM の方で以下のように実行し、

$ export http_proxy=http://proxy.example.com:8080; export https_proxy=$http_proxy
$ curl https://example.com/ -v

https://example.com の HTML が返されれば成功だ。

* Uses proxy env variable https_proxy == 'http://proxy.example.com:8080'
* Host proxy.example.com:8080 was resolved.
...
* Connected to proxy.example.com (192.168.192.53) port 8080
* CONNECT tunnel: HTTP/1.1 negotiated
* allocate connect buffer
* Establish HTTP proxy tunnel to example.com:443
> CONNECT example.com:443 HTTP/1.1
> Host: example.com:443
> User-Agent: curl/8.5.0
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection established
<
...
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
...

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください