====== 踏み台にプロキシサーバ ====== {{tag>centos6 centos7 rhel8-clone squid ssh}} {{:articles:jump.png?nolink|}} ===== 踏み台の内側からyumを使用するためのHTTPプロキシ ===== 踏み台の内側からyumを使用するために、踏み台にプロキシを構築する。 ==== 踏み台 ==== セキュリティを考えなければsquidのデフォルト設定だけで動作する。 設定ファイルは''/etc/squid/squid.conf''。デフォルトのポート番号は''3128''。 === Rocky Linux 8/AlmaLinux 8の場合 === squidのバージョンは[[http://www.squid-cache.org/Versions/v4/cfgman/|4.15]]。 dnf install squid systemctl enable squid --now firewall-cmd --add-service=squid firewall-cmd --runtime-to-permanent === CentOS 7の場合 === squidのバージョンは[[http://www.squid-cache.org/Versions/v3/3.5/cfgman/|3.5]]。 yum install squid systemctl enable squid systemctl start squid firewall-cmd --add-service=squid firewall-cmd --runtime-to-permanent === CentOS 6の場合 === squidのバージョンは、パッケージ名がsquidなら3.1、squid34なら3.4。 -A INPUT -m state --state NEW -m tcp -p tcp --dport 3128 -j ACCEPT yum install squid34 service squid start service iptables restart ==== 内側 ==== echo "proxy=http://192.168.0.1:3128" >> /etc/yum.conf ==== 踏み台とインターネットの間にプロキシがある場合 ==== squidの[[http://www.squid-cache.org/Doc/config/cache_peer/|cache_peer]]を使用する。 プロキシが''http://user:pass@10.1.2.3:8080''の場合の例。 cache_peer 10.1.2.3 parent 8080 0 no-query default login=user:pass proxy-only never_direct allow all ==== 内側からの要求のみを受け付ける場合 ==== 踏み台を悪用されないようにアクセス制限をかける。 アクセス制御の部分のみ抜粋。 # 踏み台の内側 acl private src 192.168.0.0/24 # ローカルホストからの要求は許可 http_access allow localhost # 踏み台内側からの要求は許可 http_access allow private # それ以外の要求は拒否 http_access deny all ===== HTTPプロキシに外側から内側へのアクセスも許可する場合 ===== * 内側から外側へのプロキシ * 外側から先は別のプロキシへ転送 * 外側から内側へのプロキシ * 外側から外側への要求は拒否する ++++ acl dstの-nオプションについて | [[http://www.squid-cache.org/Versions/v3/3.4/cfgman/acl.html|acl dst]]は、要求の宛先であるURLのホスト部分と引数のIPアドレスを比較する。 URLのホストがIPではなくホスト名の場合はDNSでIPアドレスを問い合わせてから比較する。 そのためネームサーバを正しく設定していないと、名前解決がタイムアウトするまで要求を処理できない。 ''acl dst''を使用していて、応答が5分程度たってからかえってくる場合はおそらくこれが原因。 ''acl dst''に''-n''オプションを付けると形式が違う場合にDNSへの問い合わせを行わずに不一致と判定する。 つまり、URLがIPなら引数と一致するか判定し、URLがホスト名なら無条件で不一致とする。 acl no-proxy dst -n 10.0.0.0/8 ただし、宛先のホスト名からIPアドレスを解決すれば引数のIPアドレスと一致するはずだったとしても、不一致と「誤」判定してしまう。 ネームサーバが利用できない状況で、誤判定してもアクセス制御結果に影響がない事が確実な場合にのみ指定する。 ''-n''オプションはsquid 3.4からの機能なので、CentOS 6では''squid''パッケージではなく''squid34''パッケージが必要。 ++++ 外側の端末は、''http://192.168.0.1:3128''をプロキシに設定すれば踏み台の内側にアクセスできる。 # 宛先がno-proxyでなければ、外側のプロキシに要求を転送 cache_peer 10.1.2.3 parent 8080 0 no-query default login=user:pass proxy-only acl no-proxy dst 10.0.0.0/8 acl no-proxy dst 172.16.0.0/12 acl no-proxy dst 192.168.0.0/16 acl no-proxy dst fc00::/7 always_direct allow no-proxy never_direct allow all # デフォルトの設定 ここから acl SSL_ports port 443 # https acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost manager http_access deny manager # デフォルトの設定 ここまで # 踏み台の内側 acl from-private src 192.168.0.0/24 acl to-private dst 192.168.0.0/24 # ローカルホストからの要求は許可 http_access allow localhost # 踏み台内側からの要求は許可 http_access allow from-private # 踏み台外側から踏み台内側への要求は許可 http_access allow !from-private to-private # それ以外、踏み台外側から踏み台外側、の要求は拒否 http_access deny all # ホスト名を取得できないという警告が出るならここで設定 visible_hostname xxxx # キャッシュを無効にしてプロキシ機能のみを使う cache deny all # 停止時の待ち時間を短く shutdown_lifetime 1 seconds # X-Forwarded-Forヘッダを編集しない forwarded_for transparent # デフォルトの設定 ここから http_port 3128 coredump_dir /var/spool/squid refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320 # デフォルトの設定 ここまで ===== SSHでSOCKS5プロキシ ===== SSHを利用して簡単にSOCKS5のプロキシサーバを構築する。 SOCKSに対応したアプリなら内側から外側にも、外側から内側にも使用できる。 systemdを使用するCentOS7以降での設定方法。 ==== 公開鍵の登録 ==== なるべくroot以外のユーザで、 SSH認証鍵を作成し、自分自身に公開鍵を登録する。 ''localhost''は公開鍵の登録時と、次のユニットファイルでの指定とで合わせる。 $ ssh-keygen $ ssh-copy-id localhost ==== ユニットファイルの作成 ==== 実行するユーザをuser、グループをgroupとした場合。 # vi /etc/systemd/system/socks-proxy.service [Unit] Description=SOCKS5 proxy server After=network.target network-online.target Requires=sshd.service [Service] Type=simple ExecStart=/usr/bin/ssh -nTND :1080 -o BatchMode=yes localhost User=user Group=group SELinuxContext=system_u:system_r:ssh_t:s0 Restart=always [Install] WantedBy=multi-user.target # chmod 664 /etc/systemd/system/socks-proxy.service # chown root:root /etc/systemd/system/socks-proxy.service ==== SELinuxのポリシーモジュールを作成 ==== ポリシーモジュール''socks-proxy.pp''を作成する。 別の環境で作成可能。 systemdのinit_tドメインから、sshのssh_tドメインへの遷移を許可する。 ドメイン遷移はルールによる暗黙的な遷移ではなくsystemdのユニットファイルで明示的に行うものとする。 またssh_tドメインがsocks_port_tのポートを使用できるようにする。 ポリシーモジュールでは''1080/tcp''をsocks_port_tに割り付けられないため、 別途''semanage port''コマンドを使用して割り付ける。 module socks-proxy 1.0; require { role system_r; type init_t; type ssh_t; type ssh_exec_t; type socks_port_t; class file { execute open read }; class process transition; class tcp_socket name_bind; } role system_r types ssh_t; allow init_t ssh_t:process transition; allow init_t ssh_exec_t:file { execute open read }; allow ssh_t socks_port_t:tcp_socket name_bind; $ sudo dnf install policycoreutils-devel $ make -f /usr/share/selinux/devel/Makefile socks-proxy.pp ==== SELinuxのポリシーモジュールをインストールし、ポートにラベルを付与する ==== # semodule -i socks-proxy.pp # semanage port -a -t socks_port_t -p tcp 1080 ==== サービスの開始とポートの開放 ==== # systemctl daemon-reload # systemctl start socks-proxy # systemctl enable socks-proxy # firewall-cmd --add-port 1080/tcp # firewall-cmd --runtime-to-permanent ==== クライアントの設定 ==== === curl === curl -x socks5h://10.2.3.4:1080 プロトコルに''socks5h''を使用するとプロキシサーバに名前解決を依頼する。 例えば踏み台の内側で独自にDNSサーバを建ててプライベートなドメインを構築している場合、 ''socks5h''を使用すると踏み台の外側から内側のホスト名でURLを指定できる。 プロキシサーバでの名前解決が不要な場合はプロトコルに''socks5''を使用する。 === TeraTerm === ''新しい接続''で''ホスト''を以下のように指定する。 -proxy=socks5://10.2.3.4:1080 @ 名前解決はプロキシサーバに依頼。 === WinSCP === サイトの設定で、''接続''-''プロキシ''を開く。 ''プロキシの形式''で''SOCKS5''を選択し、''プロキシホスト名''と''ポート番号''を入力する。 名前解決はプロキシサーバに依頼。 === FireFox === プロキシの設定で、SOCKSホストに設定する。 また''SOCKS v5''を選択し、必要なら''SOCKS v5を使用するときはDNSもプロキシーを使用する''も選択する。