Oracle Cloud：オンプレミスからVPN経由でObject Storageにアクセスさせてみてみた

# ■ 目的
Object Storage はPrivate IP は無いので、インターネットでアクセスすることになりますが、HTTPSでアクセスするので暗号化されセキュアです。
今回は、あえてPrivate IPからアクセスできるようSquidのProxy Server経由でObject Strageにアクセスさせてみてみます。


# ■ ネットワーク構成
![NW構成2.png](https://qiita-image-store.s3.amazonaws.com/0/109087/6c57b423-c59d-4881-b4cb-56b2bcf421d2.png)






# ■ ネットワーク構成の作成
・上記構成をTerraformなど使用してちょろんと作成します
　本手順は、Proxy Serverのインストールから説明します

# ■ Proxy Server構築
## ● Proxy Server用Linux インスタンス作成
Private Subnet上にCompute Instanceを作成します

## ● NAT Gatway作成
 NAT Gatewayを設定します
 yumインストールするには、Internetアクセスが必要です。
 今回Private SubnetにServerを構築するため、Public IPはありません
 そのため、NAT Gatway経由でsquidをインストールします

## ●  squidインストール

```shell-session
# yum install squid
[root@squid-proxy opc]# yum install -y squid
    ・・・
			インストール:
			  squid.x86_64 7:3.5.20-12.el7

			依存性関連をインストールしました:
			  libecap.x86_64 0:1.0.0-1.el7
			  libtool-ltdl.x86_64 0:2.4.2-22.el7_3
			  perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.el7
			  perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7
			  perl-DBI.x86_64 0:1.627-4.el7
			  perl-Data-Dumper.x86_64 0:2.145-3.el7
			  perl-Digest.noarch 0:1.17-245.el7
			  perl-Digest-MD5.x86_64 0:2.52-3.el7
			  perl-IO-Compress.noarch 0:2.061-2.el7
			  perl-Net-Daemon.noarch 0:0.48-5.el7
			  perl-PlRPC.noarch 0:0.2020-14.el7
			  squid-migration-script.x86_64 7:3.5.20-12.el7

			完了しました!
```

インストール完了後、Internetアクセス不要であればNAT Gatewayを [Block Traffic] もしくは削除します

## ● squid設定
**1) Proxyサーバーにアクセス可能なCIDR登録とwhitelist動作設定**
viで以下情報を追加

```shell-session
[root@squid-proxy ~]# cp /etc/squid/squid.conf /etc/squid/squid.conf.org
[root@squid-proxy ~]# vi /etc/squid/squid.conf
	# should be allowed
	acl localnet src 10.0.0.0/16
	acl localnet src 172.24.0.0/16

	# Squid normally listens to port 3128
	http_port 3128

	# Wite List
	acl whitelist dstdomain "/etc/squid/whitelist"
	http_access allow whitelist
```

**2) ホワイトリスト設定**
必要なRegionのObject StorageURLを登録

```shell-session
[root@squid-proxy ~]# vi /etc/squid/whitelist
objectstorage.us-ashburn-1.oraclecloud.com
```

**3) Squid起動**

```shell-session
[root@squid-proxy ~]# service squid restart
[root@squid-proxy ~]# systemctl status squid.service
	● squid.service - Squid caching proxy
	   Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled; vendor preset: disabled)
	   Active: active (running) since 日 2019-01-20 23:04:19 GMT; 16h ago
	  Process: 12721 ExecStop=/usr/sbin/squid -k shutdown -f $SQUID_CONF (code=exited, status=0/SUCCESS)
	  Process: 12729 ExecStart=/usr/sbin/squid $SQUID_OPTS -f $SQUID_CONF (code=exited, status=0/SUCCESS)
	  Process: 12724 ExecStartPre=/usr/libexec/squid/cache_swap.sh (code=exited, status=0/SUCCESS)
	 Main PID: 12732 (squid)
	   CGroup: /system.slice/squid.service
	           ├─12732 /usr/sbin/squid -f /etc/squid/squid.conf
	           ├─12734 (squid-1) -f /etc/squid/squid.conf
	           └─12735 (logfile-daemon) /var/log/squid/access.log

	 1月 20 23:04:19 squid-proxy systemd[1]: Starting Squid caching proxy...
	 1月 20 23:04:19 squid-proxy systemd[1]: Started Squid caching proxy.
	 1月 20 23:04:19 squid-proxy squid[12732]: Squid Parent: will start 1 kids
	 1月 20 23:04:19 squid-proxy squid[12732]: Squid Parent: (squid-1) process 12734 started
```

**4) firewalld設定**
Squid使用Port 3128 を通すように設定

```shell-session
[root@squid-proxy ~]# firewall-cmd --permanent --add-port=3128/tcp
    success
[root@squid-proxy ~]# systemctl restart firewalld
```

# ■ Private Load Balancer構築
Proxy Serverの負荷分散および冗長化のため、Load Balancerを配置します

## ● Private Load Balancer作成

Load Balancer画面で[Create Load Balancer]ボタンをクリックし、以下情報を入力して作成

	・Listener Information
	    - Protocol:TCP
	    - PORT:3128

	・Backend Set Information
	    - IP Address: Squid Proxy ServerのPrivate IP Addressを登録
	    - Port：3128

	・Health Check 
	    - Protocol:TCP
	    - PORT:3128
![LB01.png](https://qiita-image-store.s3.amazonaws.com/0/109087/9b798dea-f4ca-45c1-5fa8-83b0c23ed678.png)


## ● Backend Sets Health確認
Backend Setが登録されProxy Serverと疎通できていることを確認
![LB02.png](https://qiita-image-store.s3.amazonaws.com/0/109087/ef066536-4cfa-86e1-ed13-6e822e08e577.png)



# ■ 動作確認
オンプレミスのインスタンスから直接objectストレージにアクセスできることを確認します
ここでは、OCI Command Line Interface (CLI)を使用してアクセスします

## ● proxy設定前確認：エラー出ること確認
Private Subnetから直接接続できないことを確認

```shell-session
[root@test-Inst01 ~]$ oci os bucket list --query 'data[*]."name"|[0]'
	Usage: oci os bucket list [OPTIONS]

	Error: Unable to retrieve namespace internally. Please provide the namespace using the option "--['namespace-name']".
```

## ● proxy 環境変数設定
Proxy経由するための設定
今回は、Load Barancerを使用していますので、Load BarancerのListener IP(10.0.0.8)を設定します

```shell-session
[root@test-Inst01 ~]$ export https_proxy="10.0.0.8:3128"
[root@test-Inst01 ~]$ env | grep proxy
	https_proxy=10.0.0.8:3128
```


## ● bucketアクセス確認
Proxy経由することでアクセスできることを確認

```shell-session
[root@test-Inst01 ~]$ oci os bucket list --query 'data[*]."name"|[0]'
	"Proxy-Bucket"
```

## ● proxyサーバー(Squid)経由でアクセスされていることを確認
Squid LOG確認しLoad BalancerのIPからobjectstorageへアクセスされていることを確認

```shell-session
[root@squid-proxy squid]# tail -f /var/log/squid/access.log


	1548078960.163    282 10.0.0.7 TCP_TUNNEL/200 4107 CONNECT objectstorage.us-ashburn-1.oraclecloud.com:443 - HIER_DIRECT/134.70.100.100 -
	1548078960.553    273 10.0.0.7 TCP_TUNNEL/200 4540 CONNECT objectstorage.us-ashburn-1.oraclecloud.com:443 - HIER_DIRECT/134.70.100.100 -
```

## ● テストファイル転送

```shell-session
[root@test-Inst01 ~]$ oci os object put  -bn Proxy-Bucket --file /tmp/test-file01.txt --name test-file01.txt --no-multipart
	{
	  "etag": "A1A66A5F1E975E053024",
	  "last-modified": "Mon, 21 Jan 2019 15:32:47 GMT",
	  "opc-content-md5": "2M2Y8AsgTpgAmY=="
	}
```

## ● テストファイル確認
	
```shell-session
[root@test-Inst01 ~]$ oci os object list -bn Proxy-Bucket --output table
    +---------------------+-----------------+------+----------------------------------+
	| md5                 | name            | size | time-created                     |
	+---------------------+-----------------+------+----------------------------------+
	| 2M2Y8AsgTpgAmY7Ph== | test-file01.txt | 0    | 2019-01-21T15:32:47.298000+00:00 |
	+---------------------+-----------------+------+----------------------------------+
	prefixes: []
```


# ■ 付録
## ● Load BalancerのIP確認
OCI の Private Load Balancer は透過的に Primary/Standby と Floating Private IP で構成されており、IPは自動採番され、tcpdump でも確認することができます。
Standby IP は、Backend Serversとなる Squid へ Poringしているので tcpdumpを取ることで確認できます。

```shell-session
[root@squid-proxy opc]# tcpdump -n -i ens3 port 3128
	tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
	listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
	01:19:23.588100 IP 10.0.0.6.50286 > 10.0.10.11.squid: Flags [S], seq 915959842, win 26880, options [mss 8960,sackOK,TS val 2815064024 ecr 0,nop,wscale 7], length 0
	01:19:23.588149 IP 10.0.10.11.squid > 10.0.0.6.50286: Flags [S.], seq 495790511, ack 915959843, win 26844, options [mss 8960,sackOK,TS val 322500794 ecr 2815064024,nop,wscale 7], length 0
	01:19:23.588250 IP 10.0.0.6.50286 > 10.0.10.11.squid: Flags [.], ack 1, win 210, options [nop,nop,TS val 2815064024 ecr 322500794], length 0
	01:19:23.588719 IP 10.0.0.6.50286 > 10.0.10.11.squid: Flags [F.], seq 1, ack 1, win 210, options [nop,nop,TS val 2815064024 ecr 322500794], length 0
	01:19:23.588777 IP 10.0.10.11.squid > 10.0.0.6.50286: Flags [F.], seq 1, ack 2, win 210, options [nop,nop,TS val 322500795 ecr 2815064024], length 0
	01:19:23.588874 IP 10.0.0.6.50286 > 10.0.10.11.squid: Flags [.], ack 2, win 210, options [nop,nop,TS val 2815064024 ecr 322500795], length 0
	01:19:25.019310 IP 10.0.0.7.50304 > 10.0.10.11.squid: Flags [S], seq 2132021857, win 26880, options [mss 8960,sackOK,TS val 2733706381 ecr 0,nop,wscale 7], length 0
	01:19:25.019349 IP 10.0.10.11.squid > 10.0.0.7.50304: Flags [S.], seq 117296909, ack 2132021858, win 26844, options [mss 8960,sackOK,TS val 1898647448 ecr 2733706381,nop,wscale 7], length 0
	01:19:25.019444 IP 10.0.0.7.50304 > 10.0.10.11.squid: Flags [.], ack 1, win 210, options [nop,nop,TS val 2733706382 ecr 1898647448], length 0
	01:19:25.020022 IP 10.0.0.7.50304 > 10.0.10.11.squid: Flags [F.], seq 1, ack 1, win 210, options [nop,nop,TS val 2733706382 ecr 1898647448], length 0
	01:19:25.020099 IP 10.0.10.11.squid > 10.0.0.7.50304: Flags [F.], seq 1, ack 2, win 210, options [nop,nop,TS val 1898647449 ecr 2733706382], length 0
	01:19:25.020189 IP 10.0.0.7.50304 > 10.0.10.11.squid: Flags [.], ack 2, win 210, options [nop,nop,TS val 2733706382 ecr 1898647449], length 0
```

上記実行結果により、以下がLBのIPとなります
```
　・Floating IP：10.0.0.8 (OCIコンソールから確認できるIP)
　・Primary IP ：10.0.0.7 (ClientからSquidにアクセスした/var/log/squid/access.logから確認できたIP)
　・Standby IP ：10.0.0.6 (Squidにポーリングしたtcpdumpから確認できたIP)
```