OCI_プロキシサーバ構築

# OCI_プロキシサーバ構築
## 目的
OCIのプライベートサブネット内にあるWindowsServerのWindowsUpdateのみ許可したいという要件があったので、OCIでプロキシサーバを構築して、プライベートサブネットからプロキシサーバ経由でインターネットに接続する。構築する構成は以下の通り。
### 構成
![スクリーンショット 2024-12-07 16.20.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/0b557732-6dcb-c9ed-f002-cfcd01fba372.png)

## 結論
- OCIのNetworkFierwallであればプロキシサーバと同等のURL制御などでき、「NetworkFierwall」＋「NATGateWay」の構成の方がシンプルで良いが、利用料が高いため小規模な利用を想定する場合は、今回構築する「Proxyサーバ」＋「NATGateWay」の構成が良いと思われる。
- Proxyサーバをパブリックサブネットに配置し、InternetGateWayでインターネットに接続する構成も検討したが、Proxyサーバが常に外部からのアクセスに晒されるため、プライベートサブネットに配置することにした。Internet GateWayの代わりにNAT GateWayでグローバルネットに接続することで、インターネットから開始されたインバウンド接続を受信しない。Windows Updateは基本的にクライアント側（Windows）からMicrosoftのサーバーへアウトバウンド通信を行うことで動作するので、NAT Gateway経由でもWindows Updateの通知や更新プログラムのダウンロードは可能。

## 構築手順
### 準備
- VCNは作成しておく。当ドキュメントにおいては下記のIP CIDRで作成した。
    - 10.0.0.0/16
- Proxyサーバ経由でインターネットに接続するPrivate Subnet（構成図中の「10.0.2.0/24」）とクライアント端末となるWindowsServer2022（構成図中の「10.0.2.4」）を作成しておく。WindowsServer2022の代わりにOracleLinuxでも動作確認は可能。

### 1. NATGateWay作成
ナビゲートメニューから[ネットワーキング] > [仮想クラウド・ネットワーク] > [仮想クラウド・ネットワークの詳細] の左のリソース欄の[NATゲートウェイ]リンクを選択し、[NATゲートウェイの作成]をクリックし、NATゲートウェイの作成画面で作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/86fe7eed-1879-1a69-963e-61ba807bc3a6.png)

### 2. ルート表を作成
ナビゲートメニューから[ネットワーキング] > [仮想クラウド・ネットワーク] > [仮想クラウド・ネットワークの詳細] のリソース欄の[ルート表]リンクを選択し、[ルート表の作成]をクリックし、ルート表の作成画面で作成する。作成するルート表は以下の２つ。
- NATGateWay用のルート表
    - 名前：rtb-NAT
    - ルート・ルール(オプション)：設定なし（後で設定する）
- プロキシサーバ配置用サブネットのルート表
    - 名前：rtb-sub1
    - ルート・ルール(オプション)：設定なし（後で設定する）

### 3. セキュリティリストを作成
ナビゲートメニューから[ネットワーキング] > [仮想クラウド・ネットワーク] > [仮想クラウド・ネットワークの詳細] のリソース欄の[セキュリティ・リスト]リンクを選択し、[セキュリティ・リストの作成]をクリックし、セキュリティ・リストの作成画面で作成する。
- プロキシサーバ配置用サブネットのセキュリティリスト
    - 名前：sl-sub1
    - イングレスのルール許可：設定なし（後で設定する）
    - エグレスレスのルール許可：設定なし（後で設定する）

### 4. プロキシサーバ配置用サブネットの作成
ナビゲートメニューから[ネットワーキング] > [仮想クラウド・ネットワーク] > [仮想クラウド・ネットワークの詳細] のリソース欄の[サブネット]リンクを選択し、[サブネットの作成]をクリックし、サブネットの作成画面で作成する。
ルート表、セキュリティリストは、先に作成したものをアタッチする
![image(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/9900e58a-0b32-3816-a7ce-d865c6517560.png)
![image(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/56b863a5-8617-ee6f-c6ae-1f1262b80bcd.png)


### 5. プロキシサーバ用インスタンス作成
ナビゲートメニューから[コンピュート] > [インスタンス] の[インスタンス作成]をクリックし作成する。
イメージやシェイプなどは、プロキシサーバの利用頻度、クライアント数などによるため適宜妥当なものを選択頂きたい。当ドキュメントにおいては以下の選択にした。

- 名前：proxy-1
- イメージ：Oracle Linux 8
- シェイプ：VM.Standard.E5.Flex
    - 仮想マシン, 2 core OCPU, 12.5% burstable baseline, 3 GB memory, 1 Gbps network bandwidth
- サブネット：10.0.1.0/24（プロキシサーバ配置用サブネット）
- プライマリVNIC IPアドレス：
    - [プライベートIPv4アドレスの手動割当て]を選択
    - IPv4アドレス：10.0.1.4

### 6. プロキシサーバインスタンスのVNICを編集
**※重要：この設定を行わないとルート表のルートルールでプロキシサーバのIPを指定できない。**
1. 作成したプロキシサーバのインスタンス詳細画面で[VINICの編集]をクリック
![image(3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/0f624e05-fc68-3123-ca93-c8e3f467c87f.png)
1. VINICの編集画面で[ソース/宛先チェックのスキップ]を選択し[変更の保存]をクリック
![image(4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/1e7f4f45-64be-ab9a-fd26-c26fcc3beffc.png)

### 7. 下記のルート表を変更
下記のとおり、各ルート表にルートルールを追加する。
- NAT用ルート表
    - 名前：rtb-NAT
    - ルート・ルール
    - ![image(5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/c477e6de-667f-ea78-7d56-e02c46270a42.png)
        - ターゲット・タイプ：プライベートIP
        - 宛先タイプ：CIDRブロック
        - 宛先CIDRブロック：10.0.1.0/24
        - ターゲット選択：作成したプロキシサーバのIP（10.0.1.4）
- プロキシサーバ配置用サブネットのルート表
    - 名前：rtb-sub1
    - ルート・ルール]
        - ターゲット・タイプ：NATゲートウェイ
        - 宛先CIDRブロック：0.0.0.0/0
        - ターゲットNATゲートウェイ：作成済みのNATGateWayを指定
### 8. 下記のセキュリティリストを変更
- プロキシサーバ配置用サブネットのセキュリティリスト
    - 名前：sl-sub1
    - イングレスのルール許可
    ![image(6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/cf4df66a-b329-421f-0a56-12e7cc4d148c.png)
    - エグレスレスのルール許可：
    ![image(7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/b7945670-3848-4193-d62d-4c6205fec5a6.png)


### 9. プロキシサーバのセットアップ
1. squidをインストール
    ```
    sudo yum install squid -y
    ```
1. squid設定ファイルのバックアップ
    ```
    sudo mv /etc/squid/squid.conf /etc/squid/squid.conf_bk
    ```
1. squid設定ファイルを新たに作成
    ```
    sudo vi /etc/squid/squid.conf
    ```
    - 以下の内容を追記　
        ```
        # Define the network allowed to access the proxy
        acl allowed_network src 10.0.0.0/16

        # Define the list of domains used for Windows Update
        acl windows_update dstdomain .windowsupdate.com
        acl windows_update dstdomain .microsoft.com
        acl windows_update dstdomain .windows.com
        acl windows_update dstdomain .msft.net

        # Define the allowed ports for HTTP and HTTPS
        acl Safe_ports port 80            # HTTP port
        acl Safe_ports port 443           # HTTPS port
        acl CONNECT method CONNECT        # Allow CONNECT method for HTTPS

        # Deny requests to any ports that are not considered "Safe_ports"
        http_access deny !Safe_ports

        # Deny HTTPS (CONNECT method) to any port except Safe_ports (80 and 443)
        http_access deny CONNECT !Safe_ports

        # Allow access to Windows Update domains from the allowed network
        http_access allow allowed_network windows_update

        # Allow local system (localhost) to access the proxy
        http_access allow localhost

        # Deny all other requests that do not match the above rules
        http_access deny all

        # The port Squid will listen on for incoming connections
        http_port 3128

        # Suppress version information in HTTP headers to avoid exposing Squid version
        httpd_suppress_version_string on

        # Define the hostname that will appear in proxy-related error messages
        visible_hostname proxy-server
        ```
1. 設定ファイルのテスト
    ```
    sudo squid -k parse
    ```
1. squidの起動
    ```
    sudo systemctl restart squid
    sudo systemctl status squid
    ```
1. firewallルールの編集
    ```
    sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=3128:toaddr=10.0.1.4
    sudo firewall-cmd --permanent --zone=public --add-port=3128/tcp
    sudo firewall-cmd --permanent --add-masquerade
    sudo firewall-cmd --complete-reload
    ```

### 10. プロキシサーバの動作確認準備
1. プロキシサーバでアクセスログを表示しておく
    ```
    sudo tail -f /var/log/squid/access.log
    ```
### 11. クライアントの設定と動作確認(Windows2022の場合)
1. [Server Manager]を開く
![image(8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/dc46e754-61e7-ba31-8ac7-f87108fef48a.png)

1. Server Managerで[Local Server]を選択し、[Internet Explorer Enhanced Security Configuration]のリンクをクリックし、AdministratorsとUsersともに[Off]が設定されている事を確認する。設定されていない場合は変更する。
![image(9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/20a8d6e6-4cfc-8436-6d74-ac6f965d7b65.png)
![image(10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/ced3c965-7b6f-8a7d-5659-f8ffa72734ad.png)

1. Proxy設定画面で、プロキシサーバを手動設定する。
![image(11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/3e1b1688-3685-5e2a-3048-1aa76d2217b2.png)

1. Windows Updateが可能か確認する。
![image(12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75324/ca0dd459-ef77-d5a4-174b-f21ce988f927.png)

### 12. クライアントの設定と動作確認(Linuxの場合)
1. クライアントの設定と動作確認
    ```
    sudo vi /etc/profile
    ```
    - 以下の内容を追記
        ```
        MY_PROXY_SRV="http://10.0.1.4:3128/"
        HTTPS_PROXY=$MY_PROXY_SRV
        https_proxy=$MY_PROXY_SRV
        export  HTTPS_PROXY https_proxy
        ```
    - 設定を反映
        ```
        source /etc/profile
        ```
1. 許可されたサイトに接続できるか確認
    ```
    curl -I https://www.microsoft.com/
    ```
1. 許可されていないサイトに接続できない事を確認
    ```
    curl -I https://www.yahoo.co.jp/
    ```