Instanaエージェントのプロキシ設定例：プロキシ経由でのバックエンド接続構成の紹介（多段プロキシ対応）

## はじめに

InstanaをはじめとするSaaSサービスを利用する際、セキュリティ要件としてアウトバウンドのURLフィルタリングが必要となったり、ネットワークの制約により直接インターネットへの接続ができないといった課題に直面することがあります。そのような場合に、プロキシサーバーの導入が選択肢の一つとなります。  

本記事では、Instanaエージェントから、プロキシ経由でInstanaのSaaSバックエンドに接続するためのプロキシ構成と設定例を紹介します。また、既に別のプロキシサーバーが稼働している環境を想定し、既存のプロキシ環境に新たなプロキシサーバーを追加する方法についても解説しています。  
同じ課題を持つ方の参考になれば幸いです。

なお、今回の検証および執筆にあたっては、IBMカスタマーサクセスマネージャー（CSM）にご協力をいただきました。この場をお借りしてお礼申し上げます。  
Instanaに関する疑問や課題がある場合は、ぜひIBMのカスタマーサクセスチームにご相談してみてください。  

## 注意事項

本記事で取り扱うプロキシサーバーは、HTTPSプロキシを指します。  
本記事の内容は、2024年11月時点の情報に基づいています。  
設定例を紹介していますが、システムの重要度、セキュリティ要件、ネットワーク構成によっては追加の設定が必要となる場合があります。あくまで設定例として詳細な設定は要件に合わせてご対応ください。  
本記事ではプロキシサーバーの例を紹介しますが、インターネットへのアウトバウンド通信を行うプラクティスは他にも存在します。（例：AWSで稼働するシステムであればPrivateLinkを使用する方法や、専用線を敷設など）本記事はプロキシサーバーの利用を推奨するものではありませんので、導入する環境やSaaSサービスに応じて他の方法も検討してください。

## Instanaのプロキシ構成要件

[Instana Documentation](https://www.ibm.com/docs/ja/instana-observability/current?topic=agents-configuring-host#setting-up-an-agent-proxy)を確認するとプロキシに関して以下の記載があります。

> 場合によっては、ネットワークに入ったりネットワークから出たりする専用項目が 1 つ必要になります。 このため、さまざまなプロキシーで Instana を使用してください。 一般に、HTTP、HTTPS、 SOCKS4、および SOCKS5 プロキシーがサポートされています。 プロキシーは、パススルーする CONNECT メソッドをサポートする必要があります。 ALPN を指定した HTTP/2 がプロキシーでサポートされている限り、プロキシー・レベルでの TLS 終端がサポートされます。

以下の通り読み解くことができます。  

* フォワードプロキシによるCONNECTメソッドのトンネリングが可能
* プロキシでTLS終端を行う場合（フォワードプロキシでTLSインスペクションを行う場合やリバースプロキシでTLS終端を行う場合）は、プロキシサーバーがHTTP/2に対応しているかつ、ALPNを使ったプロトコルネゴシエーションに対応していることが条件。逆に、NPNでネゴシエーションする場合や、HTTP UpgradeによってHTTP/1.1からHTTP/2へアップグレードが必要なプロキシはサポートしていないと読み取れます。

## プロキシ構成の紹介

3種類のプロキシ構成を紹介します。  

| # | プロキシ階層 | 方式 | 概要 | 構成の特徴 |
| - | - | - | - | - |
| 1 | 単一プロキシ | フォワードプロキシによるトンネリング | CONNECTメソッドによるトンネリングを行うシンプルな構成 | ホスト名レベルでのURLフィルタリングが可能で、ネットワーク制約等で直接インターネットに接続できない場合にも活用できる構成です。TLS終端しないため、プロキシで詳細な通信内容を取得することはできません。 |
| 2 | 多段プロキシ | フォワードプロキシx2によるトンネリング | 構成1の多段構成 | 構成1と同様にホスト名レベルでのURLフィルタリングが可能です。社内で既にフォワードプロキシを使用しており、ネットワークの設計上追加でプロキシサーバーを構築したいケースを想定します。 |
| 3 | 多段プロキシ | リバースプロキシ&フォワードプロキシ | 構成2と同様ですが、1段目にリバースプロキシを使用してTLS終端する構成 | 他構成と同様にホスト名レベルでのURLフィルタリングが可能です。1段目でTLS終端したいケースを想定します。TLSを終端することで詳細なログが確認可能といったメリットがあります。 |

:::note info
構成3について、HTTP/2・ALPNに対応したフォワードプロキシソフトウェアがあれば、1段目にフォワードプロキシを配置することも可能です。ただし、代表的なフォワードプロキシであるSquidは現時点でHTTP/2・ALPNに対応していないようです。
:::

## 具体的な設定

以下、各構成の具体的な設定例を紹介します。  
長いので折りたたんでいます。必要な部分を展開してください。

## 構成1：単一プロキシ「フォワードプロキシによるトンネリング」

![img_single_forward_proxy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632799/f21c53c5-6d16-29e1-5de1-2938aa7a91fb.png)

<details><summary>1. Instana Agent設定変更（監視対象のサーバー） - 構成1</summary>

### 1. Instana Agent設定変更（監視対象のサーバー） - 構成1

\<instana-agent-install-dir\>/agent/etc/instana/com.instana.agent.main.sender.Backend.cfgを編集します。  
`host=`以降に続くHost設定はSquid設定で使用するためメモします。  
`proxy`にはプロキシサーバーの情報を設定します。

```diff_conf:<instana-agent-install-dir>/agent/etc/instana/com.instana.agent.main.sender.Backend.cfg

# Host and Port usually do not need to be changed, but can be modified to
# tunnel connections. 
host=ingress-green-saas.instana.io
port=443
protocol=HTTP/2

# ～省略～
# The HTTP/2 connection to Instana SaaS can be proxied.

## Proxy Server
- # proxy.host=
+ proxy.host=10.0.1.99
- # proxy.port=
+ proxy.port=3128
## Supported proxy.type values are "http", "socks4", "socks5"
- # proxy.type=
+ proxy.type=http
## If proxy.dns is set to "true", no local DNS resolution is attempted
- # proxy.dns=true
+ proxy.dns=true
## Some proxy servers require authentication
# proxy.user=
# proxy.password=

# Access Key for your SaaS installation. Is pre-filled during agent download.
key=XXXXXXXXXXXXXXXXXXXXXX[Instanaアカウントごとに変化]
```

変更後は以下のコマンドを実行し、Instana Agentの設定を反映します。  

```sh
<instana-agent-install-dir>/agent/bin/stop
<instana-agent-install-dir>/agent/bin/start
<instana-agent-install-dir>/agent/bin/status
```

:::note info
`<instana-agent-install-dir>`のデフォルトは`/opt/instana/agent`です。
:::

</details>

<details><summary>2. Squid設定（プロキシサーバー） - 構成1</summary>

### 2. Squid設定（プロキシサーバー） - 構成1

/etc/squid/squid.confのデフォルト設定を以下の設定におきかえます。  
`acl client_net src 10.0.0.0/24`は監視対象のサーバーが所属するサブネットのCIDRを設定します。  
`acl instana_backend dstdomain ingress-green-saas.instana.io`には前のInstana Agentの設定手順でメモしたHost名を設定します。

```conf:/etc/squid/squid.conf
# Squid port
http_port 3128

# SSL/TLS port
acl SSL_ports port 443

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Reduce the risk of unauthorized access from internal networks
http_access deny to_localhost
http_access deny to_linklocal

# Only allow manager access from localhost
http_access allow localhost manager
http_access deny manager

# Connection source subnet
acl client_net src 10.0.0.0/24
acl CONNECT_method method CONNECT

# Domain and port of the Instana backend
acl instana_backend dstdomain ingress-green-saas.instana.io
acl instana_backend_port port 443

# Repository to download updates and additional sensors
acl instana_repo dstdomain artifact-public.instana.io
acl instana_repo_port port 80
acl instana_repo_port_secure port 443

# Allow access Rules
http_access allow client_net instana_backend instana_backend_port
http_access allow client_net instana_backend CONNECT_method
http_access allow client_net instana_repo instana_repo_port
http_access allow client_net instana_repo instana_repo_port_secure
http_access allow client_net instana_repo CONNECT_method

# And finally deny all other access to this proxy
http_access deny all

# Logging
access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
```

変更後は以下のコマンドを実行し、Squidの設定を反映します。  

```sh
systemctl restart squid
systemctl status squid
```

</details>

## 構成2：多段プロキシ「フォワードプロキシx2によるトンネリング」

![img_multi_forward_proxy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632799/9b1c579d-8908-9919-feb1-38b588ea17fe.png)

<details><summary>1. Instana Agent設定変更（監視対象のサーバー） - 構成2</summary>

### 1. Instana Agent設定変更（監視対象のサーバー） - 構成2

構成1と同じため割愛

</details>

<details><summary>2. Squid設定（1台目のプロキシサーバー） - 構成2</summary>

### 2. Squid設定（1台目のプロキシサーバー） - 構成2

/etc/squid/squid.confのデフォルト設定を以下の設定におきかえます。  
`acl client_net src 10.0.0.0/24`は監視対象のサーバーが所属するサブネットのCIDRを設定します。  
`acl instana_backend dstdomain ingress-green-saas.instana.io`には前のInstana Agentの設定手順でメモしたHost名を設定します。  
`cache_peer 10.0.2.99 parent 3128 0 no-query default`、`never_direct allow all`は2台目のプロキシサーバーとの連携設定です。

```conf:/etc/squid/squid.conf
# Squid port 
http_port 3128

# SSL/TLS port
acl SSL_ports port 443

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Reduce the risk of unauthorized access from internal networks
http_access deny to_localhost
http_access deny to_linklocal

# Only allow manager access from localhost
http_access allow localhost manager
http_access deny manager

# Connection source subnet
acl client_net src 10.0.0.0/24
acl CONNECT_method method CONNECT

# Domain and port of the Instana backend
acl instana_backend dstdomain ingress-green-saas.instana.io
acl instana_backend_port port 443

# Repository to download updates and additional sensors
acl instana_repo dstdomain artifact-public.instana.io
acl instana_repo_port port 80
acl instana_repo_port_secure port 443

# Add cache peer and never direct configuration
cache_peer 10.0.2.99 parent 3128 0 no-query default
never_direct allow all

# Allow access Rules
http_access allow client_net instana_backend instana_backend_port
http_access allow client_net instana_backend CONNECT_method
http_access allow client_net instana_repo instana_repo_port
http_access allow client_net instana_repo instana_repo_port_secure
http_access allow client_net instana_repo CONNECT_method

# And finally deny all other access to this proxy
http_access deny all

# Logging
access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
```

変更後は構成1と同様にSquidを再起動します。  

</details>

<details><summary>3. Squid設定（2台目のプロキシサーバー） - 構成2</summary>

### 3. Squid設定（2台目のプロキシサーバー） - 構成2

/etc/squid/squid.confのデフォルト設定を以下の設定におきかえます。  
`acl client_net src 10.0.1.0/24`は1台目のプロキシサーバーが所属するサブネットのCIDRを設定します。  
`acl instana_backend dstdomain ingress-green-saas.instana.io`には前のInstana Agentの設定手順でメモしたHost名を設定します。

```conf:/etc/squid/squid.conf
# Squid port
http_port 3128

# SSL/TLS port
acl SSL_ports port 443

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Reduce the risk of unauthorized access from internal networks
http_access deny to_localhost
http_access deny to_linklocal

# Only allow manager access from localhost
http_access allow localhost manager
http_access deny manager

# Connection source subnet
acl client_net src 10.0.1.0/24
acl CONNECT_method method CONNECT

# Domain and port of the Instana backend
acl instana_backend dstdomain ingress-green-saas.instana.io
acl instana_backend_port port 443

# Repository to download updates and additional sensors
acl instana_repo dstdomain artifact-public.instana.io
acl instana_repo_port port 80
acl instana_repo_port_secure port 443

# Allow access Rules
http_access allow client_net instana_backend instana_backend_port
http_access allow client_net instana_backend CONNECT_method
http_access allow client_net instana_repo instana_repo_port
http_access allow client_net instana_repo instana_repo_port_secure
http_access allow client_net instana_repo CONNECT_method

# And finally deny all other access to this proxy
http_access deny all

# Logging
access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
```

変更後は構成1と同様にSquidを再起動します。  

</details>

## 構成3：多段プロキシ「リバースプロキシ&フォワードプロキシ」

![img_multi_reverse_proxy_and_forward_proxy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632799/53056d31-c919-ccba-3aa5-5963f3a916a2.png)


<details><summary>1. Instana Agent設定変更（監視対象のサーバー） - 構成3</summary>

### 1. Instana Agent設定変更（監視対象のサーバー） - 構成3

\<instana-agent-install-dir\>/agent/etc/instana/com.instana.agent.main.sender.Backend.cfgを編集します。  
`host=`以降に続くHost設定はApache設定、Squid設定で使用するためメモします。  
メモした後、`host=10.0.1.99`にリバースプロキシサーバーのIPを指定します。

```diff_conf:<instana-agent-install-dir>/agent/etc/instana/com.instana.agent.main.sender.Backend.cfg

# Host and Port usually do not need to be changed, but can be modified to
# tunnel connections. 
- host=ingress-green-saas.instana.io
+ host=10.0.1.99
port=443
protocol=HTTP/2

# ～省略～
# The HTTP/2 connection to Instana SaaS can be proxied.

## Proxy Server
# proxy.host=
# proxy.port=
## Supported proxy.type values are "http", "socks4", "socks5"
# proxy.type=
## If proxy.dns is set to "true", no local DNS resolution is attempted
# proxy.dns=true
## Some proxy servers require authentication
# proxy.user=
# proxy.password=

# Access Key for your SaaS installation. Is pre-filled during agent download.
key=XXXXXXXXXXXXXXXXXXXXXX[Instanaアカウントごとに変化]

```

変更後は構成1と同様にInstana Agentの設定を反映します。

</details>

<details><summary>2. Apache設定（1台目のプロキシサーバー） - 構成3</summary>

### 2. Apache設定（1台目のプロキシサーバー） - 構成3

以下のコマンドを実行し、証明書を発行します。  

```sh
sudo yum install openssl -y
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/httpd/conf/server-key.pem -out /etc/httpd/conf/server-cert.pem
```

:::note warn
※設定例のため、証明書のCountry Nameなどは任意の値を設定します。  
※検証目的かつ内部ネットワークを想定するため、自己証明書を作成します。
:::

以下のコマンドを実行し、証明書の権限を変更します。  

```sh
sudo chmod 600 /etc/httpd/conf/server-key.pem
sudo chmod 600 /etc/httpd/conf/server-cert.pem
sudo chown root:root /etc/httpd/conf/server-key.pem
sudo chown root:root /etc/httpd/conf/server-cert.pem
# 設定のテスト
sudo apachectl configtest
```

:::note info
※rootユーザーを使用する場合の手順になります。
:::

/etc/httpd/conf/httpd.confのデフォルト設定に追記します。

```conf:/etc/httpd/conf/httpd.conf
# Example:
# LoadModule foo_module modules/mod_foo.so
#
Include conf.modules.d/*.conf

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule http2_module modules/mod_http2.so
LoadModule proxy_http2_module modules/mod_proxy_http2.so
LoadModule ssl_module modules/mod_ssl.so
```

さらに、/etc/httpd/conf/httpd.confの末尾に以下を追記します。  
`SSLCertificateFile`、`SSLCertificateKeyFile`には作成した秘密鍵と、証明書を設定します。  
`ProxyPass`にはInstana Agentの設定でメモした、Host名を設定します。  
`ProxyRemote`には2台目のプロキシサーバーのIPアドレスを指定します。

```conf:/etc/httpd/conf/httpd.conf
SSLProxyEngine on
SSLProtocol -all TLSv1.3
SSLHonorCipherOrder on
SSLProxyCheckPeerCN on
SSLCertificateFile /etc/httpd/conf/server-cert.pem
SSLCertificateKeyFile /etc/httpd/conf/server-key.pem
Protocols h2
H2Direct on
ProxyPass "/" "h2://ingress-green-saas.instana.io/"
ProxyRequests Off
ProxyRemote * https://10.0.2.99:3128/
```

変更後は以下のコマンドを実行し、Apacheの設定を反映します。  

```sh
systemctl restart httpd
systemctl status httpd
```

</details>

<details><summary>3. Squid設定（2台目のプロキシサーバー） - 構成3</summary>

### 3. Squid設定（2台目のプロキシサーバー） - 構成3

/etc/squid/squid.confのデフォルト設定を以下の設定におきかえます。  
`acl client_net src 10.0.1.0/24`は1台目のプロキシサーバーが所属するサブネットのCIDRを設定します。  
`acl instana_backend dstdomain ingress-green-saas.instana.io`には前のInstana Agentの設定手順でメモしたHost名を設定します。

```conf:/etc/squid/squid.conf
# Squid port
http_port 3128

# SSL/TLS port
acl SSL_ports port 443

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Reduce the risk of unauthorized access from internal networks
http_access deny to_localhost
http_access deny to_linklocal

# Only allow manager access from localhost
http_access allow localhost manager
http_access deny manager

# Connection source subnet
acl client_net src 10.0.1.0/24
acl CONNECT_method method CONNECT

# Domain and port of the Instana backend
acl instana_backend dstdomain ingress-green-saas.instana.io
acl instana_backend_port port 443

# Repository to download updates and additional sensors
acl instana_repo dstdomain artifact-public.instana.io
acl instana_repo_port port 80
acl instana_repo_port_secure port 443

# Allow access Rules
http_access allow client_net instana_backend instana_backend_port
http_access allow client_net instana_backend CONNECT_method
http_access allow client_net instana_repo instana_repo_port
http_access allow client_net instana_repo instana_repo_port_secure
http_access allow client_net instana_repo CONNECT_method

# And finally deny all other access to this proxy
http_access deny all

# Logging
access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
```

変更後は構成1と同様にSquidを再起動します。  

</details>

## まとめ

Instanaエージェントを、プロキシ経由でSaaSバックエンドに接続する具体的な構成と設定例を紹介しました。  
構成1の単一プロキシではシンプルな設定でプロキシの導入が可能です。また、組織内で既にプロキシサーバーが稼働している場合や、プロキシサーバーでTLS終端したい場合には、本記事で紹介した構成2、構成3を参考にしていただければと思います。  
これらの設定例を活用し、Instanaの利用環境を最適化する一助となれば幸いです。