Cloudfrontを表と裏から見てみる
お世話になってます。aobataです。
最近はCDNの設定の日々が続き、設定をサーバ側から確認する事が多くなりました。
そこで、Cloudfrontをリクエストを受けるオリジンの目線や、
コマンドラインから見てみたいと思います。
検証環境
Client →①→ Cloudfront →②→ EC2といった、とてもシンプルな構成で確認してみようと思います。
暗号化されてしまうと確認ができないので②はHTTPでの通信にしています。
また、配下のEC2にはWordpressが入っています。
一旦Cloudfrontのヘッダは下記のみにし、確認していきます。
試しに一度接続してみます。
[root@kakunin1 ~]# curl -Ik https://route.akbassist.net/
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Date: Wed, 28 Jun 2023 04:23:07 GMT
Server: Apache/2.4.37 (AlmaLinux)
Link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Cache: Miss from cloudfront
Via: 1.1 c6fc54375aaf643cecdb06043574c032.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: NRT57-C1
X-Amz-Cf-Id: 6ubPLUkhhv7Moq10KC3syWAPO-lqd22g1US7_KKgLRPIqMMBEHtEnw==
キャッシュはMissとなります。
ログも流れました。
[root@orijin src]# tail -f /var/log/httpd/orijin.route.akbassist.net.access_log
XXX.XXX.XXX.238 - - [28/Jun/2023:13:23:07 +0900] "HEAD / HTTP/1.1" 200 - "-" "Amazon CloudFront""
もう一度接続してみます。
[root@kakunin1 ~]# curl -Ik https://route.akbassist.net/
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Date: Wed, 28 Jun 2023 04:23:07 GMT
Server: Apache/2.4.37 (AlmaLinux)
Link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Cache: Hit from cloudfront
Via: 1.1 878f50ebcd66e968500a90a109ee89ec.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: NRT57-C1
X-Amz-Cf-Id: 6CLAnWzWBbHpZ6JGWOY8ZutE7xBFEOKSD6btgvDftESGPWhi6auEZQ==
Age: 4
今度はキャッシュがHITしている事、
保持しているキャッシュが4秒経過している事が確認できます。
当然ログも先ほどの一つしかありません。
[root@orijin src]# tail -f /var/log/httpd/orijin.route.akbassist.net.access_log
XXX.XXX.XXX.238 - - [28/Jun/2023:13:23:07 +0900] "HEAD / HTTP/1.1" 200 - "-" "Amazon CloudFront""
これは皆さんも確認したことがあると思いますが、
色々と細かい設定が本当に適応されているのか、
サーバ再度やヘッダ情報から確認してみようと思います。
圧縮について
各ビヘイビアには、オブジェクトを自動的に圧縮する、という項目があります。
公式ドキュメントでは、圧縮対象Content-Typeは決まっているそうです。
gzipとbrをサポートしており、
Gzip と Brotli の両方をサポートしている場合、CloudFront は Brotli を優先、と書いてあります。
実際に確認してみましょう。
[root@kakunin1 ~]# curl -I -X GET -H 'Accept-Encoding: gzip' https://route.akbassist.net/wp-includes/js/wp-emoji-release.min.js
HTTP/1.1 200 OK
Content-Type: application/javascript
Transfer-Encoding: chunked
Connection: keep-alive
Date: Wed, 28 Jun 2023 05:41:23 GMT
Server: Apache/2.4.37 (AlmaLinux)
Last-Modified: Thu, 02 Feb 2023 00:53:25 GMT
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Encoding: gzip
Vary: Accept-Encoding
X-Cache: Miss from cloudfront
Via: 1.1 f509de8dab58b37f59931e5954b5eb66.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: NRT57-C1
X-Amz-Cf-Id: LVcSP6mRASm-_CpJ9EHznQDCf8Da2ISSOiWIcaJzD-81Vvmo_fANAQ==
コマンドラインでもContent-Encoding: gzipになっている事が確認できましたね。
HTTP2
さて、Cloudfrontの設定には、ディストリビューションのサポートされている HTTP バージョンから
HTTP2とHTTP3を設定する事が出来ます。
試しにHTTP2設定し、確認してみましょう。
[root@kakunin1 ~]# curl --http2 -I -XGET https://route.akbassist.net/
HTTP/2 200
content-type: text/html; charset=UTF-8
date: Wed, 28 Jun 2023 05:46:33 GMT
server: Apache/2.4.37 (AlmaLinux)
link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-cache: Miss from cloudfront
via: 1.1 0932afdcbb622a4425fd671f0d67863a.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT57-C1
alt-svc: h3=":443"; ma=86400
x-amz-cf-id: VqCxePbgnjwmzfVhyXUBQB6HeRxlVsY0lwedlChwN8grDu9-HSpvcQ==
HTTP/2 になったことが確認できました。
リモートIPアドレス
実際クライアントのIPアドレスを取るとき、どのように飛んできているか見てみます。
確認用サーバから接続してみます。
[root@orijin ~]# tcpdump -i eth0 -A port 80 -n
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:26:16.350703 IP 64.252.113.195.33820 > 172.31.34.27.http: Flags [S], seq 2556994942, win 26883, options [mss 1460,sackOK,TS val 2662276796 ecr 0,nop,wscale 9], length 0
E..<.%@...-.@.q..."....P.h.~......i..A.........
...........
18:26:16.350744 IP 172.31.34.27.http > 64.252.113.195.33820: Flags [S.], seq 3665289214, ack 2556994943, win 26847, options [mss 8961,sackOK,TS val 2885959154 ecr 2662276796,nop,wscale 7], length 0
E..<..@.@.....".@.q..P...w...h....h..(....#....
..=.........
18:26:16.351025 IP 64.252.113.195.33820 > 172.31.34.27.http: Flags [.], ack 1, win 53, options [nop,nop,TS val 2662276797 ecr 2885959154], length 0
E..4.&@...-.@.q..."....P.h...w.....5.^.....
......=.
18:26:16.351032 IP 64.252.113.195.33820 > 172.31.34.27.http: Flags [P.], seq 1:312, ack 1, win 53, options [nop,nop,TS val 2662276797 ecr 2885959154], length 311: HTTP: HEAD / HTTP/1.1
E..k.'@...,k@.q..."....P.h...w.....5.=.....
......=.HEAD / HTTP/1.1
Host: orijin.route.akbassist.net
User-Agent: Amazon CloudFront
X-Amz-Cf-Id: ks1PhPXatmqXMbTmOdslXjWq0Tt0ZsC0DA8JZlYXHHXxwdocXeVr4Q==
Connection: Keep-Alive
CloudFront-Forwarded-Proto: https
X-Forwarded-For: XXX.XXX.XXX.238
Via: 2.0 f3c5f4930da878ee6625af13df3ad240.cloudfront.net (CloudFront)
18:26:16.351052 IP 172.31.34.27.http > 64.252.113.195.33820: Flags [.], ack 312, win 219, options [nop,nop,TS val 2885959154 ecr 2662276797], length 0
E..4oF@.@.J...".@.q..P...w...h....... .....
..=.....
18:26:16.411657 IP 172.31.34.27.http > 64.252.113.195.33820: Flags [P.], seq 1:325, ack 312, win 219, options [nop,nop,TS val 2885959215 ecr 2662276797], length 324: HTTP: HTTP/1.1 200 OK
E..xoG@.@.I?..".@.q..P...w...h.......d.....
..>/....HTTP/1.1 200 OK
Date: Wed, 28 Jun 2023 09:26:16 GMT
Server: Apache/2.4.37 (AlmaLinux)
Link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Keep-Alive: timeout=3, max=60
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
18:26:16.411910 IP 64.252.113.195.33820 > 172.31.34.27.http: Flags [.], ack 325, win 55, options [nop,nop,TS val 2662276858 ecr 2885959215], length 0
E..4.(@...-.@.q..."....P.h...w.C...7.g.....
......>/
X-Forwarded-Forにちゃんと確認サーバのIPアドレスが入っていますね。
サーバ側でこちらの設定をすれば、リモートIPアドレスがちゃんとログに出るようになります。
ちなみに、X-Forwarded-Forはヘッダに入れなくともちゃんと運んできてくれます。
セキュリティポリシー
CLoudfrontのディストリビューションでTLSv1.2_2021を選択しています。
ちゃんと確認してみましょう。
[root@kakunin1 ~]# openssl s_client -connect 13.32.50.100:443 -servername route.akbassist.net -tls1_2 </dev/null 2>&1
CONNECTED(00000003)
depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
verify return:1
depth=1 C = US, O = Amazon, CN = Amazon RSA 2048 M02
verify return:1
depth=0 CN = *.route.akbassist.net
verify return:1
---
Certificate chain
0 s:CN = *.route.akbassist.net
i:C = US, O = Amazon, CN = Amazon RSA 2048 M02
1 s:C = US, O = Amazon, CN = Amazon RSA 2048 M02
i:C = US, O = Amazon, CN = Amazon Root CA 1
2 s:C = US, O = Amazon, CN = Amazon Root CA 1
i:C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2
3 s:C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2
i:C = US, O = "Starfield Technologies, Inc.", OU = Starfield Class 2 Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIF6jCCBNKgAwIBAgIQA07XABSUWsQMHw2lQcmBeDANBgkqhkiG9w0BAQsFADA8
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRwwGgYDVQQDExNBbWF6b24g
UlNBIDIwNDggTTAyMB4XDTIzMDUwMTAwMDAwMFoXDTI0MDUzMDIzNTk1OVowIDEe
MBwGA1UEAwwVKi5yb3V0ZS5ha2Jhc3Npc3QubmV0MIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEApvp5/M0J5vx5GrVoxsMZL+W68TUTEOd7sz2zmqBpqkz4
X4UY7v8CYYj7Zb4xP0PT/Y6xYu1BUxTont23xi6E+DCAHOAZW9MpvAK/46lXj4LR
ilbbDLVjZXbCs3PrRQ0ilT+jcvIjQ5M9wiK+NtStz0IEK6DQEt5v+hxx5KtopnUD
nqWfunSGPSjEx7qZ3zPcr/G5jzSuY8CjsrQSxtdkbzrmcakNutFJpIbJsGv2VBM7
FevgNNwnNboj3yQWf6jgUteToIgakurFx0WNCnemo/6jE2tlJcieJUW3Lhp2tOHB
ReZRdq8qOzbKrc5mDOOaBWDF9EK8DIe6zpaTxSCDbwIDAQABo4IDAjCCAv4wHwYD
VR0jBBgwFoAUwDFSzVpQw4J8dHHOy+mc+XrrguIwHQYDVR0OBBYEFB2UXNkKXZEm
WK7qcdB89s10DvpgMDUGA1UdEQQuMCyCFSoucm91dGUuYWtiYXNzaXN0Lm5ldIIT
cm91dGUuYWtiYXNzaXN0Lm5ldDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI
KwYBBQUHAwEGCCsGAQUFBwMCMDsGA1UdHwQ0MDIwMKAuoCyGKmh0dHA6Ly9jcmwu
cjJtMDIuYW1hem9udHJ1c3QuY29tL3IybTAyLmNybDATBgNVHSAEDDAKMAgGBmeB
DAECATB1BggrBgEFBQcBAQRpMGcwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vY3NwLnIy
bTAyLmFtYXpvbnRydXN0LmNvbTA2BggrBgEFBQcwAoYqaHR0cDovL2NydC5yMm0w
Mi5hbWF6b250cnVzdC5jb20vcjJtMDIuY2VyMAwGA1UdEwEB/wQCMAAwggF9Bgor
BgEEAdZ5AgQCBIIBbQSCAWkBZwB2AO7N0GTV2xrOxVy3nbTNE6Iyh0Z8vOzew1FI
WUZxH7WbAAABh9Uad+4AAAQDAEcwRQIgS4oEcfJl3QUvS706HYa+Fk23N9eU61Vd
yjZpzQN5nZICIQC3M0PBdipSomz/U0W67vva1VSW9JrnTHgB2LBufiiHYAB2AHPZ
nokbTJZ4oCB9R53mssYc0FFecRkqjGuAEHrBd3K1AAABh9UaeFEAAAQDAEcwRQIg
B1LlXD3W8ibtK1De4HVejy3KSLwcG/RovP3IKFk6a2QCIQDG1BYv8sMlqex/wlDr
PKBPm5ZHdjjZ1ZA/xwbDpEwuDwB1AEiw42vapkc0D+VqAvqdMOscUgHLVt0sgdm7
v6s52IRzAAABh9UaeCcAAAQDAEYwRAIgBYkYbBeIcRPcm3ld9QSZkhuN/0aTn9V2
sFa/0scCMYYCIFQQnFeqK3vLX/Akm9Uiy0meUCrrO28axbmxIqbyuYvtMA0GCSqG
SIb3DQEBCwUAA4IBAQBpuAdPGuVyl44d/jpip992jFud87DP8kNohLiDFGtgET64
9Wm84ETbSQd9VjiHE7N+uHyNqIPrNrDjAu3dyl2aJ/yz1CfZe220AFS50nnnVDiR
vQxoNU+2oB1FgtWOKt/CzcZDMat3rrjLNbIzSvjg5BEmheNglgM//VLwiA3hbciT
ERxWdlonAW4Ht/qg0V7sWtkZpMXFMiuj2hCb4CbH2MgG8b+j98KMSJgpea1gwyWm
s++/6BbWrmCuuCbSfwJsMO8StP4D3/yFkPUP8zhdCkZa9RUeONSq8zDw/UYtX3p7
sXIosWs6RC8vVgAoJYk1Pz1Zb+TQLYnHhfNjMOAN
-----END CERTIFICATE-----
subject=CN = *.route.akbassist.net
issuer=C = US, O = Amazon, CN = Amazon RSA 2048 M02
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 5572 bytes and written 313 bytes
Verification: OK
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: 20AB8C0CDF451F4E5C6B7FE442AD36C2ACC85A056A04F74CB1B1155DA523416B
Session-ID-ctx:
Master-Key: CB1B1FA4C73D7276D2C5BCE0E0028AC0B91F21BB0589A6C733A12825DDB3A7CD1D65ABB97EFEB8AA1FC6620B5C16BD36
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 86400 (seconds)
TLS session ticket:
0000 - 31 36 38 37 39 33 38 38-32 31 30 30 30 00 00 00 1687938821000...
0010 - a8 98 f9 26 e0 6c 6c 95-3f e8 27 64 f1 5c 28 a2 ...&.ll.?.'d.\(.
0020 - 5a 79 40 e3 75 aa b8 24-09 bd fb c1 a4 b6 90 5a Zy@.u..$.......Z
0030 - 3a b7 1c e7 b8 b3 bf 3d-04 03 e3 94 fd 9a 73 de :......=......s.
0040 - 44 60 df 89 1f 92 7d 01-2b 22 de 24 66 dd 56 3f D`....}.+".$f.V?
0050 - 18 1c c1 5b 2e ca 8b 32-18 02 ff 5d 2b c8 fa 66 ...[...2...]+..f
0060 - e7 bb 8c 0f 93 12 34 23-bb ......4#.
Start Time: 1687944876
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: yes
---
ちゃんと返ってきますね。
試しに、低いバージョンで接続してみます。
[root@kakunin1 ~]# openssl s_client -connect 13.32.50.100:443 -servername route.akbassist.net -tls1_1 </dev/null 2>&1
CONNECTED(00000003)
139766356379456:error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:ssl/record/rec_layer_s3.c:1544:SSL alert number 70
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 132 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.1
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1687944856
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
---
ちゃんとエラーになってくれている事が確認できました。
Basic認証
ベーシック認証がかかっている部分をキャッシュする場合、ヘッダの追加が必要になります。
試しにオリジンへ直接接続し、何が行われているか見てみましょう。
[root@kakunin1 ~]# curl -u blog:test -Ik http://orijin.route.akbassist.net/basic/ -L
HTTP/1.1 200 OK
Date: Wed, 28 Jun 2023 09:45:50 GMT
Server: Apache/2.4.37 (AlmaLinux)
Last-Modified: Wed, 28 Jun 2023 08:01:33 GMT
Accept-Ranges: bytes
Content-Length: 8
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=UTF-8
オリジンから見た場合
[root@orijin ~]# tcpdump -i eth0 -A port 80 -n
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:47:03.067423 IP XXX.XXX.XXX.238.41118 > 172.31.34.27.http: Flags [S], seq 4274866621, win 29200, options [mss 1460,sackOK,TS val 3561057141 ecr 0,nop,wscale 7], length 0
E..<..@.)..M.+...."....P..I.......r.zj.........
.Aku........
18:47:03.067464 IP 172.31.34.27.http > XXX.XXX.XXX.238.41118: Flags [S.], seq 2276790325, ack 4274866622, win 26847, options [mss 8961,sackOK,TS val 425109710 ecr 3561057141,nop,wscale 7], length 0
E..<..@.@..h.."..+...P.....5..I...h.2.....#....
.V...Aku....
18:47:03.071649 IP XXX.XXX.XXX.238.41118 > 172.31.34.27.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 3561057145 ecr 425109710], length 0
E..4..@.)..T.+...."....P..I....6.....=.....
.Aky.V..
18:47:03.071687 IP XXX.XXX.XXX.238.41118 > 172.31.34.27.http: Flags [P.], seq 1:133, ack 1, win 229, options [nop,nop,TS val 3561057145 ecr 425109710], length 132: HTTP: HEAD /basic/ HTTP/1.1
E.....@.)....+...."....P..I....6....{......
.Aky.V..HEAD /basic/ HTTP/1.1
Host: orijin.route.akbassist.net
Authorization: Basic YmxvZzp0ZXN0
User-Agent: curl/7.61.1
Accept: */*
18:47:03.071714 IP 172.31.34.27.http > XXX.XXX.XXX.238.41118: Flags [.], ack 133, win 219, options [nop,nop,TS val 425109715 ecr 3561057145], length 0
E..4y#@.@..L.."..+...P.....6..JB....2{.....
.V...Aky
18:47:03.072475 IP 172.31.34.27.http > XXX.XXX.XXX.238.41118: Flags [P.], seq 1:285, ack 133, win 219, options [nop,nop,TS val 425109715 ecr 3561057145], length 284: HTTP: HTTP/1.1 200 OK
E..Py$@.@../.."..+...P.....6..JB....3......
.V...AkyHTTP/1.1 200 OK
Date: Wed, 28 Jun 2023 09:47:03 GMT
Server: Apache/2.4.37 (AlmaLinux)
Last-Modified: Wed, 28 Jun 2023 08:01:33 GMT
Accept-Ranges: bytes
Content-Length: 8
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=UTF-8
18:47:03.075381 IP XXX.XXX.XXX.238.41118 > 172.31.34.27.http: Flags [.], ack 285, win 237, options [nop,nop,TS val 3561057149 ecr 425109715], length 0
E..4..@.)..R.+...."....P..JB...R...........
.Ak}.V..
18:47:03.075476 IP XXX.XXX.XXX.238.41118 > 172.31.34.27.http: Flags [F.], seq 133, ack 285, win 237, options [nop,nop,TS val 3561057149 ecr 425109715], length 0
E..4..@.)..Q.+...."....P..JB...R...........
.Ak}.V..
18:47:03.075571 IP 172.31.34.27.http > XXX.XXX.XXX.238.41118: Flags [F.], seq 285, ack 134, win 219, options [nop,nop,TS val 425109719 ecr 3561057149], length 0
E..4y%@.@..J.."..+...P.....R..JC....2{.....
.V...Ak}
18:47:03.077856 IP XXX.XXX.XXX.238.41118 > 172.31.34.27.http: Flags [.], ack 286, win 237, options [nop,nop,TS val 3561057151 ecr 425109719], length 0
E..4..@.)..P.+...."....P..JC...S...........
.Ak..V..
Authorizationヘッダに情報が飛んできていますね
では、ヘッダを入れない状態で接続してみます。
[root@kakunin1 ~]# curl -u blog:test -Ik http://route.akbassist.net/basic/ -L
HTTP/1.1 301 Moved Permanently
Server: CloudFront
Date: Wed, 28 Jun 2023 09:49:52 GMT
Content-Type: text/html
Content-Length: 167
Connection: keep-alive
Location: https://route.akbassist.net/basic/
X-Cache: Redirect from cloudfront
Via: 1.1 2f2cf39e75c120f26131abff835e3548.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: NRT57-C1
Alt-Svc: h3=":443"; ma=86400
X-Amz-Cf-Id: 3TlpOd7T09xQr5sR8q_aBi1UIz6r5f4OV1Lxl2dpzuoEo_MQCky8sg==
HTTP/2 401
content-type: text/html; charset=iso-8859-1
date: Wed, 28 Jun 2023 09:49:53 GMT
server: Apache/2.4.37 (AlmaLinux)
www-authenticate: Basic realm="Please enter your ID and password"
x-cache: Error from cloudfront
via: 1.1 70e24e789a7f5c3f75693b4d637a2d22.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT57-C1
alt-svc: h3=":443"; ma=86400
x-amz-cf-id: BVpMTLHgOp_1DFLPhIrHD1GM1rzHPFTiAvkOcWUCqQEBUTrDKQusPg==
401になり認証が通りません。
サーバ側も見てみます。
[root@orijin ~]# tcpdump -i eth0 -A port 80 -n
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:49:53.060173 IP 64.252.113.57.30634 > 172.31.34.27.http: Flags [S], seq 1983801115, win 26883, options [mss 1460,sackOK,TS val 2901900057 ecr 0,nop,wscale 9], length 0
E..<G.@.....@.q9..".w..Pv>g.......i..%.........
..{........
18:49:53.060218 IP 172.31.34.27.http > 64.252.113.57.30634: Flags [S.], seq 2469053904, ack 1983801116, win 26847, options [mss 8961,sackOK,TS val 3738086118 ecr 2901900057,nop,wscale 7], length 0
E..<..@.@..L..".@.q9.Pw..*..v>g...h.......#....
......{.....
18:49:53.062127 IP 64.252.113.57.30634 > 172.31.34.27.http: Flags [.], ack 1, win 53, options [nop,nop,TS val 2901900059 ecr 3738086118], length 0
E..4G.@.....@.q9..".w..Pv>g..*.....5.......
..{.....
18:49:53.062156 IP 64.252.113.57.30634 > 172.31.34.27.http: Flags [P.], seq 1:325, ack 1, win 53, options [nop,nop,TS val 2901900059 ecr 3738086118], length 324: HTTP: HEAD /basic/ HTTP/1.1
E..xG.@....d@.q9..".w..Pv>g..*.....5\......
..{.....HEAD /basic/ HTTP/1.1
Host: orijin.route.akbassist.net
User-Agent: Amazon CloudFront
X-Amz-Cf-Id: BVpMTLHgOp_1DFLPhIrHD1GM1rzHPFTiAvkOcWUCqQEBUTrDKQusPg==
Connection: Keep-Alive
CloudFront-Forwarded-Proto: https
X-Forwarded-For: XXX.XXX.XXX.238
Via: 2.0 70e24e789a7f5c3f75693b4d637a2d22.cloudfront.net (CloudFront)
18:49:53.062179 IP 172.31.34.27.http > 64.252.113.57.30634: Flags [.], ack 325, win 219, options [nop,nop,TS val 3738086120 ecr 2901900059], length 0
E..4}B@.@.=...".@.q9.Pw..*..v>h`...........
......{.
18:49:53.062706 IP 172.31.34.27.http > 64.252.113.57.30634: Flags [P.], seq 1:269, ack 325, win 219, options [nop,nop,TS val 3738086121 ecr 2901900059], length 268: HTTP: HTTP/1.1 401 Unauthorized
E..@}C@.@.<...".@.q9.Pw..*..v>h`...........
......{.HTTP/1.1 401 Unauthorized
Date: Wed, 28 Jun 2023 09:49:53 GMT
Server: Apache/2.4.37 (AlmaLinux)
WWW-Authenticate: Basic realm="Please enter your ID and password"
Keep-Alive: timeout=3, max=60
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
18:49:53.064626 IP 64.252.113.57.30634 > 172.31.34.27.http: Flags [.], ack 269, win 55, options [nop,nop,TS val 2901900062 ecr 3738086121], length 0
E..4G.@.....@.q9..".w..Pv>h`.*.....7.......
..{.....
Authenticationヘッダがオリジンまで届いていませんね。
ここで、ヘッダを新たに追加してみます。
改めてCloudfront越しに接続してみます。
[root@kakunin1 ~]# curl -u blog:test -Ik https://route.akbassist.net/basic/
HTTP/2 200
content-type: text/html; charset=UTF-8
content-length: 8
date: Wed, 28 Jun 2023 09:55:55 GMT
server: Apache/2.4.37 (AlmaLinux)
last-modified: Wed, 28 Jun 2023 08:01:33 GMT
accept-ranges: bytes
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-cache: Miss from cloudfront
via: 1.1 2f2cf39e75c120f26131abff835e3548.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT57-C1
alt-svc: h3=":443"; ma=86400
x-amz-cf-id: -ABY9GM6O98-0VT-PNAAx1SnnoxlbjBHN-hfD-QqVKHmBXZkEI0yhA==
サーバ側も改めてみてみましょう。
[root@orijin ~]# tcpdump -i eth0 -A port 80 -n
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:55:55.261120 IP 64.252.113.57.20578 > 172.31.34.27.http: Flags [S], seq 621845264, win 26883, options [mss 1460,sackOK,TS val 2902262259 ecr 0,nop,wscale 9], length 0
E..<.p@.....@.q9..".Pb.P%.........i............
...........
18:55:55.261161 IP 172.31.34.27.http > 64.252.113.57.20578: Flags [S.], seq 351417123, ack 621845265, win 26847, options [mss 8961,sackOK,TS val 3738448319 ecr 2902262259,nop,wscale 7], length 0
E..<..@.@..L..".@.q9.PPb..3#%.....h.......#....
..1.........
18:55:55.263132 IP 64.252.113.57.20578 > 172.31.34.27.http: Flags [.], ack 1, win 53, options [nop,nop,TS val 2902262261 ecr 3738448319], length 0
E..4.q@.....@.q9..".Pb.P%.....3$...5.......
......1.
18:55:55.263162 IP 64.252.113.57.20578 > 172.31.34.27.http: Flags [P.], seq 1:360, ack 1, win 53, options [nop,nop,TS val 2902262261 ecr 3738448319], length 359: HTTP: HEAD /basic/ HTTP/1.1
E....r@....z@.q9..".Pb.P%.....3$...5(......
......1.HEAD /basic/ HTTP/1.1
Host: orijin.route.akbassist.net
User-Agent: Amazon CloudFront
Authorization: Basic YmxvZzp0ZXN0
X-Amz-Cf-Id: -ABY9GM6O98-0VT-PNAAx1SnnoxlbjBHN-hfD-QqVKHmBXZkEI0yhA==
Connection: Keep-Alive
CloudFront-Forwarded-Proto: https
X-Forwarded-For: XXX.XXX.XXX.238
Via: 2.0 2f2cf39e75c120f26131abff835e3548.cloudfront.net (CloudFront)
18:55:55.263184 IP 172.31.34.27.http > 64.252.113.57.20578: Flags [.], ack 360, win 219, options [nop,nop,TS val 3738448321 ecr 2902262261], length 0
E..4&.@.@.....".@.q9.PPb..3$%..x...........
..1.....
18:55:55.263992 IP 172.31.34.27.http > 64.252.113.57.20578: Flags [P.], seq 1:340, ack 360, win 219, options [nop,nop,TS val 3738448322 ecr 2902262261], length 339: HTTP: HTTP/1.1 200 OK
E...&.@.@..A..".@.q9.PPb..3$%..x...........
..1.....HTTP/1.1 200 OK
Date: Wed, 28 Jun 2023 09:55:55 GMT
Server: Apache/2.4.37 (AlmaLinux)
Last-Modified: Wed, 28 Jun 2023 08:01:33 GMT
Accept-Ranges: bytes
Content-Length: 8
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Keep-Alive: timeout=3, max=60
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
18:55:55.265975 IP 64.252.113.57.20578 > 172.31.34.27.http: Flags [.], ack 340, win 55, options [nop,nop,TS val 2902262264 ecr 3738448322], length 0
E..4.s@.....@.q9..".Pb.P%..x..4w...7.......
Authorizationヘッダが無事登場し、アクセスが通るようになったことが確認できました。
クエリ
今度はクエリのありなしについて確認してみましょう。
今回はレガシ―のポリシーで設定していますが、クエリを含む含まないの違いがどんな時に使うか、
キャッシュヒット率を上げたいパスの際に利用する場合などをご説明します。
現在はクエリを全て、としています。
その場合、クエリが違うと別のものとしてキャッシュを分けてくれます。
試しに、2種類のリクエストを2回ずつリクエストしてみます。
①https://route.akbassist.net
②https://route.akbassist.net?netassist (クエリを含むアクセス)
それでは、接続してみましょう。
①https://route.akbassist.net
[root@kakunin1 ~]# curl -Ik -X GET https://route.akbassist.net
HTTP/2 200
content-type: text/html; charset=UTF-8
date: Wed, 28 Jun 2023 10:20:08 GMT
server: Apache/2.4.37 (AlmaLinux)
link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-cache: Miss from cloudfront
via: 1.1 0af10446b4e7648a125872be7e79f010.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX50-P2
alt-svc: h3=":443"; ma=86400
x-amz-cf-id: ggt2vZtRItineqCIRyQf7_6p5GICmLq8upzeatAyDJYhXMh-VLyCow==
[root@kakunin1 ~]# curl -Ik -X GET https://route.akbassist.net
HTTP/2 200
content-type: text/html; charset=UTF-8
date: Wed, 28 Jun 2023 10:20:08 GMT
server: Apache/2.4.37 (AlmaLinux)
link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-cache: Hit from cloudfront
via: 1.1 769ececd301a8fdf4e59dcad8dd8089a.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX50-P2
alt-svc: h3=":443"; ma=86400
x-amz-cf-id: PTYYhn4c2X1AKHFHeIHynAMRTVh1IeXhAzhURt0JhwDh7aDIY_EhXA==
age: 1
[root@kakunin1 ~]#
先ほどと同じように2回目のアクセスでキャッシュされました。
これでキャッシュを持ってくれているはずです。
②https://route.akbassist.net?netassist (クエリを含むアクセス)
[root@kakunin1 ~]# curl -Ik -X GET https://route.akbassist.net?netassist
HTTP/2 200
content-type: text/html; charset=UTF-8
date: Wed, 28 Jun 2023 10:20:23 GMT
server: Apache/2.4.37 (AlmaLinux)
link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-cache: Miss from cloudfront
via: 1.1 b7c5552ba41ac3213096b94bdb00200a.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX50-P2
alt-svc: h3=":443"; ma=86400
x-amz-cf-id: 3tVnCaWd4dKp1goxfG3bfL0CDakwd25oaaCIOesfyf8_ltHCgyzp_A==
先ほどすぐにアクセスしたはずなのに、キャッシュされていません。
改めてアクセスすると、同じとみなされます。
[root@kakunin1 ~]# curl -Ik -X GET https://route.akbassist.net?netassist
HTTP/2 200
content-type: text/html; charset=UTF-8
date: Wed, 28 Jun 2023 10:20:23 GMT
server: Apache/2.4.37 (AlmaLinux)
link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-cache: Hit from cloudfront
via: 1.1 b7c5552ba41ac3213096b94bdb00200a.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX50-P2
alt-svc: h3=":443"; ma=86400
x-amz-cf-id: WoYNUNn4cis7Of4a4ww38rhLLBptsv5D-wLa79FQzus8MUZ8cQNq5w==
age: 2
では、アクセスログを見てみましょう。
[root@orijin ~]# tail -f /var/log/httpd/orijin.route.akbassist.net.access_log
XXX.XXX.XXX.238 - - [28/Jun/2023:19:20:08 +0900] "GET / HTTP/1.1" 200 54218 "-" "Amazon CloudFront"
XXX.XXX.XXX.238 - - [28/Jun/2023:19:20:23 +0900] "GET /?netassist HTTP/1.1" 200 54218 "-" "Amazon CloudFront"
①と②のアクセスは2回目はキャッシュされているので、ログはそれぞれ初回のみですね。
また、クエリパラメータがちゃんと出ている事がわかります。
クエリは大変重要です。
もしクエリをキャッシュキーとして含まない場合、最初に検索ページで入力した値が残り、
次の人が検索すると前の結果がキャッシュされてこちらに返ってきたりします。
ですが、キャッシュヒット率を上げたいキャッシュパラメータが不要なページなどは
効果があります。
使い方を間違えなければとても効果的です。
それではクエリを含まない場合も試してみましょう。
もう一度リクエストしてみますが、
今度はアクセス順を逆にしてみます。
②https://route.akbassist.net?netassist (クエリを含むアクセス)
[root@kakunin1 ~]# curl -Ik -X GET https://route.akbassist.net?netassist
HTTP/2 200
content-type: text/html; charset=UTF-8
date: Wed, 28 Jun 2023 10:23:02 GMT
server: Apache/2.4.37 (AlmaLinux)
link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-cache: Miss from cloudfront
via: 1.1 9bd7c2eb9edb3030488f847c2b13f76c.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX50-P2
alt-svc: h3=":443"; ma=86400
x-amz-cf-id: kPa_OI7EPyEmgZx7Ak0QhIVIo3rZqDPZ2mKdwmKR_Fob8um3kjwxoA==
[root@kakunin1 ~]# curl -Ik -X GET https://route.akbassist.net?netassist
HTTP/2 200
content-type: text/html; charset=UTF-8
date: Wed, 28 Jun 2023 10:23:02 GMT
server: Apache/2.4.37 (AlmaLinux)
link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-cache: Hit from cloudfront
via: 1.1 9c68af4e3a031ddc310a022bc156324a.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX50-P2
alt-svc: h3=":443"; ma=86400
x-amz-cf-id: P3ORoS5ZXkPopMjWcpLinKVTldiaoMqIh_XYJXbG2LkhoEIYXLbRfw==
age: 2
キャッシュされましたね。
さて、こちらにて次はパラメータ無いものを接続してみます。
①https://route.akbassist.net
[root@kakunin1 ~]# curl -Ik -X GET https://route.akbassist.net
HTTP/2 200
content-type: text/html; charset=UTF-8
date: Wed, 28 Jun 2023 10:23:02 GMT
server: Apache/2.4.37 (AlmaLinux)
link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-cache: Hit from cloudfront
via: 1.1 8d023a05e24575432ccd30e463a47d62.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX50-P2
alt-svc: h3=":443"; ma=86400
x-amz-cf-id: EFx-BjndC8fbVNVC99QNBHqqoGf6lNjVrvLaQ-eUTHvru-q4dXdFkQ==
age: 11
今度は共通のものとしてキャッシュされてましたね。
これでクエリは関係なくキャッシュしてくれるので、ヒット率が上がるようになります。
アクセスログを見てみましょう。
[root@orijin ~]# tail -f /var/log/httpd/orijin.route.akbassist.net.access_log
XXX.XXX.XXX.238 - - [28/Jun/2023:19:18:28 +0900] "HEAD / HTTP/1.1" 200 - "-" "Amazon CloudFront"
最初にクエリ有で接続したのにもかかわらず、クエリパラメータが含まれていませんね。
Cloudfrontにてクエリを削除しているので、サーバ側にも届いていません。
また、3回の接続でしたがキャッシュされているのでログは1行しか増えていません。
Host
検証サーバは単一ドメインですのできちんと受けてくれますし、
サーバのServerNameはオリジンで受けるドメイン、
ServerAliasにCloudfrontの本来使用したいドメインを入れているため、表示してくれています。
ですが、オリジンへのホストヘッダは届いていませんので、
コンテンツに不具合が出てしまうかもしれません。
一度追加してみましょう。
さて、サーバ側から接続を見てみましょう。
[root@orijin ~]# tcpdump -i eth0 -A port 80 -n
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
19:31:46.011246 IP 64.252.113.57.60316 > 172.31.34.27.http: Flags [S], seq 3174234044, win 26883, options [mss 1460,sackOK,TS val 2904413017 ecr 0,nop,wscale 9], length 0
E..<.s@...i.@.q9.."....P.2........i.=7.........
...Y.......
19:31:46.011291 IP 172.31.34.27.http > 64.252.113.57.60316: Flags [S.], seq 439284973, ack 3174234045, win 26847, options [mss 8961,sackOK,TS val 3740599069 ecr 2904413017,nop,wscale 7], length 0
E..<..@.@..L..".@.q9.P.......2....h.......#....
.......Y....
19:31:46.013260 IP 64.252.113.57.60316 > 172.31.34.27.http: Flags [.], ack 1, win 53, options [nop,nop,TS val 2904413019 ecr 3740599069], length 0
E..4.t@...i.@.q9.."....P.2.........5.......
...[....
19:31:46.013356 IP 64.252.113.57.60316 > 172.31.34.27.http: Flags [P.], seq 1:312, ack 1, win 53, options [nop,nop,TS val 2904413019 ecr 3740599069], length 311: HTTP: HEAD / HTTP/1.1
E..k.u@...h.@.q9.."....P.2.........5G......
...[....HEAD / HTTP/1.1
Host: route.akbassist.net
User-Agent: Amazon CloudFront
X-Amz-Cf-Id: 1kBP-bgTooGIzmpFvn3ZWj5zA2Sb5eV2hBlOsqKsIaxGoOKvD5Er2Q==
Connection: Keep-Alive
CloudFront-Forwarded-Proto: https
X-Forwarded-For: XXX.XXX.XXX.238
Via: 2.0 033e04998ec3702ff24075621b897ecc.cloudfront.net (CloudFront)
19:31:46.013388 IP 172.31.34.27.http > 64.252.113.57.60316: Flags [.], ack 312, win 219, options [nop,nop,TS val 3740599071 ecr 2904413019], length 0
E..4..@.@.....".@.q9.P.......2.............
.......[
19:31:46.085790 IP 172.31.34.27.http > 64.252.113.57.60316: Flags [P.], seq 1:325, ack 312, win 219, options [nop,nop,TS val 3740599144 ecr 2904413019], length 324: HTTP: HTTP/1.1 200 OK
E..x..@.@..x..".@.q9.P.......2.............
...h...[HTTP/1.1 200 OK
Date: Wed, 28 Jun 2023 10:31:46 GMT
Server: Apache/2.4.37 (AlmaLinux)
Link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Keep-Alive: timeout=3, max=60
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
19:31:46.087800 IP 64.252.113.57.60316 > 172.31.34.27.http: Flags [.], ack 325, win 55, options [nop,nop,TS val 2904413094 ecr 3740599144], length 0
E..4.v@...i.@.q9.."....P.2.....2...7.~.....
.......h
ちゃんとHost: route.akbassist.netになっていますね。
これで本来のホストヘッダが飛んでいる事を確認できました。
User-Agent
エンドユーザの方がスマートフォンなのか、PCなのかで表示を変えるサイトもあります。
Cloudfrontの場合は実は専用のヘッダが用意されており、Cloudfront側で判別する事が可能です。
CloudFront-Is-Android-Viewer
CloudFront-Is-IOS-Viewer
CloudFront-Is-Mobile-Viewer
CloudFront-Is-SmartTV-Viewer
CloudFront-Is-Tablet-Viewer
コンテンツを対応させるためには、コンテンツ側を合わせて変更する必要があります。
今はUser-Agent: Amazon CloudFrontとなっています。
まとめてすべてのユーザの端末情報を出したい場合は、User-Agentヘッダを含むとオリジン側にリクエストヘッダが届きます。
試しにCloudFront-Is-IOS-Viewerを入れてiPhoneから接続してみます。
長いので少し省略します。
Host: route.akbassist.net
User-Agent: Amazon CloudFront
X-Amz-Cf-Id: SstXyX7JUGpGj0n-C00tAY73IbvxRXXHB2HaNYSgMxRT1LqCq6pI3g==
Connection: Keep-Alive
CloudFront-Is-IOS-Viewer: true
CloudFront-Forwarded-Proto: https
X-Forwarded-For: XXX.XXX.XXX.XXX
Via: 2.0 541ec8013f12d2a9d4abdbdb1647af30.cloudfront.net (CloudFront)
Accept-Encoding: gzip
19:38:20.440709 IP 172.31.34.27.http > 64.252.113.195.20860: Flags [.], ack 364, win 219, options [nop,nop,TS val 2890283244 ecr 2666600918], length 0
E..4.^@.@..k..".@.q..PQ|..=...i...... .....
.F8.....
19:38:20.528544 IP 172.31.34.27.http > 64.252.113.195.20860: Flags [.], seq 1:7241, ack 364, win 219, options [nop,nop,TS val 2890283332 ecr 2666600918], length 7240: HTTP: HTTP/1.1 200 OK
E..|._@.@.."..".@.q..PQ|..=...i......h.....
.F9D....HTTP/1.1 200 OK
Date: Wed, 28 Jun 2023 10:38:20 GMT
Server: Apache/2.4.37 (AlmaLinux)
Link: <https://route.akbassist.net/wp-json/>; rel="https://api.w.org/"
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Keep-Alive: timeout=3, max=60
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
1f86
<!DOCTYPE html>
<html lang="ja">
<head>
CloudFront-Is-IOS-Viewer: trueになってちゃんと判別してくれていますね
User-Agentを入れれば、それのAgentヘッダを送ってくれます。
ユーザの仕様端末によってコンテンツの表示を切り替える事が可能になります。
まとめ
ほかにも大量の設定がありますが、今回はここまでにしておこうと思います。
いかがだったでしょうか。
CloudfrontがGUIから接続するだけで設定ができますが、
実際どんな通信が行われてちゃんと必要なヘッダが流れているのか、
ログだけでなく、パケットの確認も必要に迫られたのでブログに書いてみました。
うまく動作しないときは、試してみてください。