余っているノートPCにLinuxを入れて、透過型プロキシ(Transparent Proxy)を作ってみました。
SquidでSSL Bumpを設定して、クライアントPCのデフォルトゲートウェイをこのLinuxのIPアドレスに指定して使う想定です。
昔はCentOSを好んで使っていたけど、サポート終了とかStreamとか聞こえてきて、よくわからないので、今回は比較的コミュニティが活発そうに見える、Rocky Linux 8.5をインストールしてみました。
Rocky Linux 公式ミラーサイト一覧から、日本のサイトを選んでブータブルISOイメージをダウンロードして、Rufus でブータブルなUSBメモリを作成しました。インストール方法はCentOS8と同様で、ググるとたくさん出てくるので省略。
各種バージョンは2021/12/22現在。面倒なので、作業はrootで行いました。
今回試した環境。
透過型プロキシサーバー
OS: Rocky Linux 8.5
プロキシ: Squid 4.15
IPアドレス: 192.168.1.1
ネットワークアダプタ: wlp1s0 (ノートPCにLANポートがなく、WiFiでお試し)
クライアントPC
OS: Windows 10
IPアドレス: 192.168.1.2
デフォルトゲートウェイ(Default GW): 192.168.1.1
まずは Linux に Squid をインストール。Rocky Linux 8.5 では標準リポジトリにありました。
yum install squid
SSL Bumpを使うためには、Squidのビルドで「
--enable-ssl-crtd」と「
--with-openssl」を指定していないといけないらしいので確認。
1 2 3 4 5 6 7 |
# squid -v Squid Cache: Version 4.15 Service Name: squid This binary uses OpenSSL 1.1.1k FIPS 25 Mar 2021. For legal restrictions on distribution see https://www.openssl.org/source/license.html configure options: '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/var/lib' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--libexecdir=/usr/lib64/squid' '--datadir=/usr/share/squid' '--sysconfdir=/etc/squid' '--with-logdir=/var/log/squid' '--with-pidfile=/var/run/squid.pid' '--disable-dependency-tracking' '--enable-eui' '--enable-follow-x-forwarded-for' '--enable-auth' '--enable-auth-basic=DB,fake,getpwnam,LDAP,NCSA,PAM,POP3,RADIUS,SASL,SMB,SMB_LM' '--enable-auth-ntlm=SMB_LM,fake' '--enable-auth-digest=file,LDAP' '--enable-auth-negotiate=kerberos' '--enable-external-acl-helpers=LDAP_group,time_quota,session,unix_group,wbinfo_group,kerberos_ldap_group' '--enable-storeid-rewrite-helpers=file' '--enable-cache-digests' '--enable-cachemgr-hostname=localhost' '--enable-delay-pools' '--enable-epoll' '--enable-icap-client' '--enable-ident-lookups' '--enable-linux-netfilter' '--enable-removal-policies=heap,lru' '--enable-snmp' '--enable-ssl' '--enable-ssl-crtd' '--enable-storeio=aufs,diskd,ufs,rock' '--enable-diskio' '--enable-wccpv2' '--enable-esi' '--enable-ecap' '--with-aio' '--with-default-user=squid' '--with-dl' '--with-openssl' '--with-pthreads' '--disable-arch-native' '--disable-security-cert-validators' '--with-swapdir=/var/spool/squid' 'build_alias=x86_64-redhat-linux-gnu' 'host_alias=x86_64-redhat-linux-gnu' 'CFLAGS=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' 'LDFLAGS=-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld' 'CXXFLAGS=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' 'PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig' |
これなら大丈夫。
SSL Bumpで使うための Diffie-Hellman アルゴリズムのパラメータファイル「bump_dhparam.pem」と、秘密鍵「bump.key」と「bump.crt」で自己署名ルート証明書を作成します。今回は遊びなので、RSA 2048bit、sha256、有効期限3650日(約10年)を指定。
1 2 3 4 5 |
cd /etc/squid openssl dhparam -outform PEM -out bump_dhparam.pem 2048 openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes -x509 -extensions v3_ca -subj "/OU=PrivateCA/C=JP/CN=Private" -keyout bump.key -out bump.crt chown squid:squid bump* chmod 400 bump* |
ここで作成した証明書はクライアントPCにコピーして、「信頼されたルート証明機関」にインポートしておきます。
Windows 10では、証明書ファイルを右クリックして「証明書のインストール」を選択、保管場所を指定、証明書ストアを「信頼されたルート証明機関」としてインポートします。
続いて、SSL Bumpで使うための証明書データベースを作成します。
1 2 |
/usr/lib64/squid/security_file_certgen -c -s /var/lib/squid/ssl_db -M 4MB chown -R squid:squid /var/lib/squid/ssl_db |
ここまで準備できたら、Squidの設定を変更します。主な変更点は以下の通り。
※2021/1/5 変更。https_portのオプションでoptionsに「NO_SSLv2」を追加。SSL 2.0は既知のセキュリティホールがあるので、使ってはいけないそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# localnetは自分のネットワークだけ acl localnet src 192.168.1.0/24 # サポートしないプロトコルはトンネルする on_unsupported_protocol tunnel all # for SSL Bump sslcrtd_program /usr/lib64/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 4MB sslproxy_cert_error allow all acl step1 at_step SslBump1 ssl_bump peek step1 ssl_bump bump all # for Forwarding 80->3128 443->3129 http_port 8080 http_port 3128 intercept https_port 3129 intercept tcpkeepalive=60,30,3 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=20MB tls-cert=/etc/squid/bump.crt tls-key=/etc/squid/bump.key cipher=HIGH:MEDIUM:!LOW:!RC4:!SEED:!IDEA:!3DES:!MD5:!EXP:!PSK:!DSS options=NO_SSLv2,NO_SSLv3,NO_TLSv1,SINGLE_DH_USE,SINGLE_ECDH_USE tls-dh=prime256v1:/etc/squid/bump_dhparam.pem |
これでSquidを起動できるか確認します。
systemctl start squid
うーん、動かない。またハマった。いろいろ調べたところ、デフォルトで SELinux が有効になっていて、そこで許可されているポート以外は拒否されてた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
※SELinuxでsquidに許可されているポートを確認 # semanage port -l | grep -w -i squid_port_t squid_port_t tcp 3128, 3401, 4827 squid_port_t udp 3401, 4827 ※ポート3129を追加しようとしたら他で使われてた # semanage port -l | grep -w -i 3129 netport_port_t tcp 3129 netport_port_t udp 3129 ※もう面倒になったので、SELinuxを無効にして再起動しちゃった # vi /etc/selinux/conf ~変更箇所~ #SELINUX=enforcing SELINUX=disabled |
改めて起動してみる。
systemctl start squid
今度は動いたので自動起動も設定。
systemctl enable squid
あとは透過型プロキシとして使いたいので、80→3128、443→3129に変換するよう設定。
昔はiptablesでやってたけど、最近はfirewall-cmdでやるみたい。
1 2 3 4 5 6 |
※IPフォワーディングを有効に echo 1 > /proc/sys/net/ipv4/ip_forward ※ネットワークアダプタ wlp1s0 で、80->3128 443->3129 に変換 firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i wlp1s0 -p tcp --dport 80 -j REDIRECT --to-ports 3128 firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i wlp1s0 -p tcp --dport 443 -j REDIRECT --to-ports 3129 firewall-cmd --runtime-to-permanent |
ちゃんと設定できているか確認してみる。
1 2 3 |
# firewall-cmd --direct --get-all-rules ipv4 nat PREROUTING 0 -i wlp1s0 -p tcp --dport 80 -j REDIRECT --to-ports 3128 ipv4 nat PREROUTING 0 -i wlp1s0 -p tcp --dport 443 -j REDIRECT --to-ports 3129 |
ここまでできたら、先ほど証明書をインポートしたノートPCのデフォルトゲートウェイを192.168.1.1に設定して、Webブラウザで動作確認。
Squidのログは、/var/log/squid/access.logで確認。
一応動いているっぽいけど、なんかおかしい。ちゃんとやるときはもっと調べてみよう。