OCI NLBのプロキシプロトコルv2 (PPv2)を有効にしてパケットキャプチャで観察してみた


# 目次



- [プロキシプロトコルv2とは（以下PPv2）](#プロキシプロトコルv2とは以下ppv2)

- [構成](#構成)

- [インスタンスx2の作成](#インスタンスx2の作成)

- [NLBの作成](#nlbの作成)

- [Apacheサーバの作成](#apacheサーバの作成)

- [NLBでPPv2を有効、Webサーバ側がPPv2に対応していない時の挙動](#nlbでppv2を有効webサーバ側がppv2に対応していない時の挙動)

- [ApacheサーバでPPv2を処理するためのパッケージをインストール](#apacheサーバでppv2を処理するためのパッケージをインストール)

- [PPv2にApacheが対応した時の挙動](#ppv2にapacheが対応した時の挙動)





## プロキシプロトコルv2とは（以下PPv2）
プロキシプロトコルとはざっくりいうとプロキシを挟んだときに送信元IPを知るためのプロトコルで、HTTPでのX-Forwarded-forのようなものです。

![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/99d6dfbb-6c1f-be8b-5184-86af56f46701.png)
[画像：OCIドキュメント NLBのプロキシプロトコルより](https://docs.oracle.com/ja-jp/iaas/Content/NetworkLoadBalancer/NetworkLoadBalancers/network-load-balancer-management.htm#proxy-protocol)
ドキュメントを見てみると3-way handshakingの後に何やらPPv2というパケットを送ってクライアントのIPをバックエンドサーバへ伝えているようですね。

<br>
OCIのNLBには複数のモードがあります。

- NATモード★    ・・・NLBで送信元IPと宛先IPがNATされるモード
- ソース保持モード  ・・・送信元IP（ソースIP）をそのままバックエンドサーバに伝えるモード  
- 透過モード    ・・・パケットがNLBを通過しても送信元IPも宛先IPも変わらない（透き通る）モード

[OCIドキュメント：ネットワーク・ロード・バランサ 操作のモード](https://docs.oracle.com/ja-jp/iaas/Content/NetworkLoadBalancer/introducton.htm#modes-operation)

PPv2は透過モードでは使用できません。
今回はNLBの★印であるNATモードでPPv2を有効にして送信元のIPを確認していきます。
<br>（送信元IPを知るのであればソース保持モードや透過モードを使えばいいのでは？という声が聞こえてきますが、今回はPPv2の挙動やパケットキャプチャしてパケットの気持ちを知ることに主眼を置きたいと思います）

## 構成
VCN内にクライアント用とWebサーバ用のインスタンス、PPv2を有効にしたNLBを作成します。<br>
以下が構成例です。<br>
![image-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/a4439817-bb84-18d4-82ef-01fde80bb08e.png)


## インスタンスx2の作成
クライアントとWebサーバ用のインスタンスを作成します。
OSはどちらもOracle Linux8にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/e4c95222-d3cb-9aff-e2be-563a955a4e23.png)


## NLBの作成
### 詳細の追加
ソース/宛先ヘッダーの保持のチェックボックスはつけない。
![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/716e3b22-54fa-53fa-b596-3e322a5d9bed.png)

### リスナーの構成
PPv2の有効にチェックボックスをつけます。
![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/6895457f-6cc2-52c9-3f39-e62c433c11dd.png)

### バックエンドの選択
NATモードにしたいので、バックエンドの選択で「ソースIPの保持」にチェックボックスをつけない
![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/ed1ca5a5-cf3e-4121-a982-f9b35bdeec15.png)


### ヘルスチェックポリシーの指定
パケットキャプチャを行うときにヘルスチェックのパケットを取得したくないので、ヘルスチェックを長めにします。また、ヘルスチェックを機能させないので「フェイルオープン」のチェックボックスをつけておきます。
![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/0910307a-5bce-4849-088f-b2e50ce550c1.png)

## Apacheサーバの作成
Apacheのインストールやファイアウォールを開けておきます。
```text:Apacheのインストールなどのログ
sudo yum update -y
sudo yum -y install httpd
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --reload
sudo systemctl enable httpd
sudo systemctl start httpd
sudo sh -c 'echo "This is Web Server (host:`hostname`)" > /var/www/html/index.html'

[opc@ol8-webserver ~]$ curl 10.1.0.232
[opc@ol8-webserver ~]$ This is Web Server (host:ol8-webserver)
```



## NLBでPPv2を有効、Webサーバ側がPPv2に対応していない時の挙動
本来であれば、Webサーバ側でPPv2を処理をする設定が必要ですが、あえてPPv2に対応させずエラーの挙動を確認します。<br>
折りたたんでいるので興味のある方は展開して確認してください。

<details><summary> (展開ください) curlの結果 </summary>
[opc@ol8-2 ~]$ curl 10.1.2.4 
<br>&lt;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"&gt;  
<br>&lt;html&gt;&lt;head&gt;  
<br>&lt;title&gt;400 Bad Request&lt;/title&gt;  
<br>&lt;/head&gt;&lt;body&gt;  
<br>&lt;h1&gt;Bad Request&lt;/h1&gt;  
<br>&lt;p&gt;Your browser sent a request that this server could not understand.&lt;br /&gt;  
<br>&lt;/p&gt;  
<br>&lt;/body&gt;&lt;/html&gt;
<br>
</details>

<details><summary> (展開ください) Webサーバ側のパケットキャプチャ </summary>

<pre>
[root@ol8-webserver ~]# tcpdump -i ens3 '(src net 10.1.0.0/16 and dst net 10.1.0.0/16) or (src net 10.1.0.0/16 and dst net 10.1.0.0/16)' and not arp -nn
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
04:24:22.645323 IP 10.1.2.4.4203 > 10.1.0.232.80: Flags [S], seq 3538015914, win 62720, options [mss 8960,sackOK,TS val 2061492763 ecr 0,nop,wscale 7], length 0
04:24:22.645418 IP 10.1.0.232.80 > 10.1.2.4.4203: Flags [S.], seq 2328046224, ack 3538015915, win 62636, options [mss 8960,sackOK,TS val 394643730 ecr 2061492763,nop,wscale 7], length 0
04:24:22.645794 IP 10.1.2.4.4203 > 10.1.0.232.80: Flags [P.], seq 1:29, ack 1, win 490, options [nop,nop,TS val 2061492764 ecr 394643730], length 28: HTTP
04:24:22.645834 IP 10.1.0.232.80 > 10.1.2.4.4203: Flags [.], ack 29, win 490, options [nop,nop,TS val 394643730 ecr 2061492764], length 0
04:24:22.645886 IP 10.1.2.4.4203 > 10.1.0.232.80: Flags [P.], seq 1:101, ack 1, win 490, options [nop,nop,TS val 2061492764 ecr 394643730], length 100: HTTP
04:24:22.645899 IP 10.1.0.232.80 > 10.1.2.4.4203: Flags [.], ack 101, win 490, options [nop,nop,TS val 394643730 ecr 2061492764,nop,nop,sack 1 {1:29}], length 0
04:24:22.646118 IP 10.1.0.232.80 > 10.1.2.4.4203: Flags [P.], seq 1:422, ack 101, win 490, options [nop,nop,TS val 394643730 ecr 2061492764], length 421: HTTP: HTTP/1.1 400 Bad Request
04:24:22.646233 IP 10.1.0.232.80 > 10.1.2.4.4203: Flags [F.], seq 422, ack 101, win 490, options [nop,nop,TS val 394643730 ecr 2061492764], length 0
04:24:22.646402 IP 10.1.2.4.4203 > 10.1.0.232.80: Flags [.], ack 422, win 487, options [nop,nop,TS val 2061492764 ecr 394643730], length 0
04:24:22.646622 IP 10.1.2.4.4203 > 10.1.0.232.80: Flags [F.], seq 101, ack 422, win 487, options [nop,nop,TS val 2061492765 ecr 394643730], length 0
04:24:22.646639 IP 10.1.0.232.80 > 10.1.2.4.4203: Flags [.], ack 102, win 490, options [nop,nop,TS val 394643731 ecr 2061492765], length 0
04:24:22.646663 IP 10.1.2.4.4203 > 10.1.0.232.80: Flags [.], ack 423, win 487, options [nop,nop,TS val 2061492765 ecr 394643730], length 0
</pre>
</details>

<details><summary> (展開ください) クライアント側のパケットキャプチャ </summary>
<pre>
[root@ol8-2 ~]# tcpdump -i enp0s5 '(src net 10.1.0.0/16 and dst net 10.1.0.0/16) or (src net 10.1.0.0/16 and dst net 10.1.0.0/16)' and not arp -nn
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s5, link-type EN10MB (Ethernet), capture size 262144 bytes
04:24:22.644594 IP 10.1.0.45.38786 > 10.1.2.4.80: Flags [S], seq 3538015942, win 62720, options [mss 8960,sackOK,TS val 2061492763 ecr 0,nop,wscale 7], length 0
04:24:22.645657 IP 10.1.2.4.80 > 10.1.0.45.38786: Flags [S.], seq 2328046224, ack 3538015943, win 62636, options [mss 8932,sackOK,TS val 394643730 ecr 2061492763,nop,wscale 7], length 0
04:24:22.645681 IP 10.1.0.45.38786 > 10.1.2.4.80: Flags [.], ack 1, win 490, options [nop,nop,TS val 2061492764 ecr 394643730], length 0
04:24:22.645715 IP 10.1.0.45.38786 > 10.1.2.4.80: Flags [P.], seq 1:73, ack 1, win 490, options [nop,nop,TS val 2061492764 ecr 394643730], length 72: HTTP: GET / HTTP/1.1
04:24:22.646045 IP 10.1.2.4.80 > 10.1.0.45.38786: Flags [.], ack 1, win 490, options [nop,nop,TS val 394643730 ecr 2061492764], length 0
04:24:22.646095 IP 10.1.2.4.80 > 10.1.0.45.38786: Flags [.], ack 73, win 490, options [nop,nop,TS val 394643730 ecr 2061492764,nop,nop,sack 1 {4294967269:1}], length 0
04:24:22.646283 IP 10.1.2.4.80 > 10.1.0.45.38786: Flags [P.], seq 1:422, ack 73, win 490, options [nop,nop,TS val 394643730 ecr 2061492764], length 421: HTTP: HTTP/1.1 400 Bad Request
04:24:22.646290 IP 10.1.0.45.38786 > 10.1.2.4.80: Flags [.], ack 422, win 487, options [nop,nop,TS val 2061492764 ecr 394643730], length 0
04:24:22.646506 IP 10.1.2.4.80 > 10.1.0.45.38786: Flags [F.], seq 422, ack 73, win 490, options [nop,nop,TS val 394643730 ecr 2061492764], length 0
04:24:22.646510 IP 10.1.0.45.38786 > 10.1.2.4.80: Flags [F.], seq 73, ack 422, win 487, options [nop,nop,TS val 2061492765 ecr 394643730], length 0
04:24:22.646520 IP 10.1.0.45.38786 > 10.1.2.4.80: Flags [.], ack 423, win 487, options [nop,nop,TS val 2061492765 ecr 394643730], length 0
04:24:22.646802 IP 10.1.2.4.80 > 10.1.0.45.38786: Flags [.], ack 74, win 490, options [nop,nop,TS val 394643731 ecr 2061492765], length 0
</pre>
</details>

注目してほしいところはWebサーバ側のパケットキャプチャです。NLBからWebサーバへPushフラグを二回送り、WebサーバはPPv2を解釈できずエラーを返しています。
```text:Webサーバ側のパケット抜粋
04:24:22.645794 IP 10.1.2.4.4203 > 10.1.0.232.80: Flags [P.], seq 1:29, ack 1, win 490, options [nop,nop,TS val 2061492764 ecr 394643730], length 28: HTTP
04:24:22.645834 IP 10.1.0.232.80 > 10.1.2.4.4203: Flags [.], ack 29, win 490, options [nop,nop,TS val 394643730 ecr 2061492764], length 0
04:24:22.645886 IP 10.1.2.4.4203 > 10.1.0.232.80: Flags [P.], seq 1:101, ack 1, win 490, options [nop,nop,TS val 2061492764 ecr 394643730], length 100: HTTP
04:24:22.645899 IP 10.1.0.232.80 > 10.1.2.4.4203: Flags [.], ack 101, win 490, options [nop,nop,TS val 394643730 ecr 2061492764,nop,nop,sack 1 {1:29}], length 0
04:24:22.646118 IP 10.1.0.232.80 > 10.1.2.4.4203: Flags [P.], seq 1:422, ack 101, win 490, options [nop,nop,TS val 394643730 ecr 2061492764], length 421: HTTP: HTTP/1.1 400 Bad Request
```

## ApacheサーバでPPv2を処理するためのパッケージをインストール
自分の作業メモとしても残しておきたいので、ログをそのまま載せます。<br>

### 参考ページ
- [Apache Module mod_proxy_protocol](https://roadrunner2.github.io/mod-proxy-protocol/mod_proxy_protocol.html)
- [Apache Proxy Protocol Module](https://github.com/roadrunner2/mod-proxy-protocol)


### httpd-develパッケージのインストールしてモジュールの構成

```text:httpd-develパッケージのインストール
[opc@ol8-webserver ~]$ rpm -q httpd-devel
package httpd-devel is not installed
[opc@ol8-webserver ~]$ sudo dnf install httpd-devel
[opc@ol8-webserver ~]$ rpm -q httpd-devel
httpd-devel-2.4.37-65.0.1.module+el8.10.0+90430+1ba508be.2.x86_64
```

```text:gitのインストール
[opc@ol8-webserver ~]$ sudo dnf install git -y
[opc@ol8-webserver ~]$ git --version
git version 2.43.5
```

```text:Apache Proxy Protocol Moduleの構成
[opc@ol8-webserver ~]$ git clone https://github.com/roadrunner2/mod-proxy-protocol.git
[opc@ol8-webserver mod-proxy-protocol]$ sudo dnf install redhat-rpm-config
[opc@ol8-webserver mod-proxy-protocol]$ make
[opc@ol8-webserver mod-proxy-protocol]$ sudo cp .libs/mod_proxy_protocol.so /etc/httpd/modules/
```

:::note warn
redhat-rpm-config をインストールしないと出るエラー
<details><summary> (展開ください) </summary>
<pre>[opc@ol8-webserver mod-proxy-protocol]$ make
apxs -c -Wc,-Wall mod_proxy_protocol.c
/usr/lib64/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection  -DLINUX -D_REENTRANT -D_GNU_SOURCE -pthread -I/usr/include/httpd  -I/usr/include/apr-1   -I/usr/include/apr-1  -Wall  -c -o mod_proxy_protocol.lo mod_proxy_protocol.c && touch mod_proxy_protocol.slo
gcc: error: /usr/lib/rpm/redhat/redhat-hardened-cc1: No such file or directory
apxs:Error: Command failed with rc=65536
.
make: *** [Makefile:15: .libs/mod_proxy_protocol.so] Error 1
</pre>
</details>
:::

### 新しい設定ファイルの作成
```text:
[opc@ol8-webserver ~]$ sudo vi /etc/httpd/conf.d/proxy_protocol.conf
LoadModule proxy_protocol_module modules/mod_proxy_protocol.so
<VirtualHost *:80>
    DocumentRoot /var/www/html
    ProxyProtocol On
</VirtualHost>
[opc@ol8-webserver ~]$ sudo apachectl configtest
Syntax OK
```
### ログフォーマットの編集
```diff_shell:/etc/httpd/conf/httpd.conf
[opc@ol8-webserver ~]$ sudo vi /etc/httpd/conf/httpd.conf
#末尾に追記
+ LogFormat "%a %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined_proxy
+ CustomLog logs/access_log combined_proxy
[opc@ol8-webserver ~]$ sudo systemctl restart httpd
```

## PPv2にApacheが対応した時の挙動

```text:curlでアクセス
[opc@ol8-2 ~]$ curl 10.1.2.4
This is Web Server (host:ol8-webserver)
```

```text:Webサーバのアクセスログ
[opc@ol8-webserver ~]$ sudo tail -f /var/log/httpd/access_log
10.1.2.4 - - [04/Dec/2024:05:25:24 +0000] "GET / HTTP/1.1" 200 40 "-" "curl/7.61.1"
10.1.0.45 10.1.2.4 - - [04/Dec/2024:05:25:24 +0000] "GET / HTTP/1.1" 200 40 "-" "curl/7.61.1"


10.1.0.45：クライアントのIPアドレス
10.1.2.4：NLBのIPアドレス
```

無事WebサーバがPPv2を処理することができ、クライアントIPをWebサーバのログに記録することができました！
<br>

<details><summary> (展開ください) Webサーバ側のパケットキャプチャ </summary>
```text:Webサーバ側のパケットキャプチャ
<pre>
[root@ol8-webserver ~]# tcpdump -i ens3 '(src net 10.1.0.0/16 and dst net 10.1.0.0/16) or (src net 10.1.0.0/16 and dst net 10.1.0.0/16)' and not arp -nn
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
05:29:43.940946 IP 10.1.2.4.11785 > 10.1.0.232.80: Flags [S], seq 229830573, win 62720, options [mss 8960,sackOK,TS val 2065414058 ecr 0,nop,wscale 7], length 0
05:29:43.941043 IP 10.1.0.232.80 > 10.1.2.4.11785: Flags [S.], seq 457670421, ack 229830574, win 62636, options [mss 8960,sackOK,TS val 398565025 ecr 2065414058,nop,wscale 7], length 0
05:29:43.941520 IP 10.1.2.4.11785 > 10.1.0.232.80: Flags [P.], seq 1:29, ack 1, win 490, options [nop,nop,TS val 2065414059 ecr 398565025], length 28: HTTP
05:29:43.941569 IP 10.1.0.232.80 > 10.1.2.4.11785: Flags [.], ack 29, win 490, options [nop,nop,TS val 398565026 ecr 2065414059], length 0
05:29:43.941850 IP 10.1.2.4.11785 > 10.1.0.232.80: Flags [P.], seq 1:101, ack 1, win 490, options [nop,nop,TS val 2065414059 ecr 398565025], length 100: HTTP
05:29:43.941873 IP 10.1.0.232.80 > 10.1.2.4.11785: Flags [.], ack 101, win 490, options [nop,nop,TS val 398565026 ecr 2065414059,nop,nop,sack 1 {1:29}], length 0
05:29:43.942157 IP 10.1.0.232.80 > 10.1.2.4.11785: Flags [P.], seq 1:296, ack 101, win 490, options [nop,nop,TS val 398565026 ecr 2065414059], length 295: HTTP: HTTP/1.1 200 OK
05:29:43.942523 IP 10.1.2.4.11785 > 10.1.0.232.80: Flags [.], ack 296, win 488, options [nop,nop,TS val 2065414060 ecr 398565026], length 0
05:29:43.942652 IP 10.1.2.4.11785 > 10.1.0.232.80: Flags [F.], seq 101, ack 296, win 488, options [nop,nop,TS val 2065414060 ecr 398565026], length 0
05:29:43.942714 IP 10.1.0.232.80 > 10.1.2.4.11785: Flags [F.], seq 296, ack 102, win 490, options [nop,nop,TS val 398565027 ecr 2065414060], length 0
05:29:43.943009 IP 10.1.2.4.11785 > 10.1.0.232.80: Flags [.], ack 297, win 488, options [nop,nop,TS val 2065414061 ecr 398565027], length 0
</pre>
```
</details>

<details><summary> (展開ください) クライアント側のパケットキャプチャ
</summary>
```text:
<pre>
[root@ol8-2 ~]# tcpdump -i enp0s5 '(src net 10.1.0.0/16 and dst net 10.1.0.0/16) or (src net 10.1.0.0/16 and dst net 10.1.0.0/16)' and not arp -nn
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s5, link-type EN10MB (Ethernet), capture size 262144 bytes
05:29:43.940308 IP 10.1.0.45.46208 > 10.1.2.4.80: Flags [S], seq 229830601, win 62720, options [mss 8960,sackOK,TS val 2065414058 ecr 0,nop,wscale 7], length 0
05:29:43.941258 IP 10.1.2.4.80 > 10.1.0.45.46208: Flags [S.], seq 457670421, ack 229830602, win 62636, options [mss 8932,sackOK,TS val 398565025 ecr 2065414058,nop,wscale 7], length 0
05:29:43.941282 IP 10.1.0.45.46208 > 10.1.2.4.80: Flags [.], ack 1, win 490, options [nop,nop,TS val 2065414059 ecr 398565025], length 0
05:29:43.941315 IP 10.1.0.45.46208 > 10.1.2.4.80: Flags [P.], seq 1:73, ack 1, win 490, options [nop,nop,TS val 2065414059 ecr 398565025], length 72: HTTP: GET / HTTP/1.1
05:29:43.941856 IP 10.1.2.4.80 > 10.1.0.45.46208: Flags [.], ack 1, win 490, options [nop,nop,TS val 398565026 ecr 2065414059], length 0
05:29:43.941972 IP 10.1.2.4.80 > 10.1.0.45.46208: Flags [.], ack 73, win 490, options [nop,nop,TS val 398565026 ecr 2065414059,nop,nop,sack 1 {4294967269:1}], length 0
05:29:43.942206 IP 10.1.2.4.80 > 10.1.0.45.46208: Flags [P.], seq 1:296, ack 73, win 490, options [nop,nop,TS val 398565026 ecr 2065414059], length 295: HTTP: HTTP/1.1 200 OK
05:29:43.942213 IP 10.1.0.45.46208 > 10.1.2.4.80: Flags [.], ack 296, win 488, options [nop,nop,TS val 2065414060 ecr 398565026], length 0
05:29:43.942326 IP 10.1.0.45.46208 > 10.1.2.4.80: Flags [F.], seq 73, ack 296, win 488, options [nop,nop,TS val 2065414060 ecr 398565026], length 0
05:29:43.942754 IP 10.1.2.4.80 > 10.1.0.45.46208: Flags [F.], seq 296, ack 74, win 490, options [nop,nop,TS val 398565027 ecr 2065414060], length 0
05:29:43.942765 IP 10.1.0.45.46208 > 10.1.2.4.80: Flags [.], ack 297, win 488, options [nop,nop,TS val 2065414061 ecr 398565027], length 0
</pre>
```
</details>

<details><summary> (展開ください) Webサーバ側での詳細なパケットキャプチャ</summary>
```text:Webサーバ側での詳細なパケットキャプチャ
<pre>
[root@ol8-webserver ~]# tcpdump -i ens3 '(src net 10.1.0.0/16 and dst net 10.1.0.0/16) or (src net 10.1.0.0/16 and dst net 10.1.0.0/16)' and not arp -nn -w serverpacket.pcap
一度アクセスした後ctrl+c

[root@ol8-webserver ~]# tcpdump -nn -X -r serverpacket.pcap
reading from file serverpacket.pcap, link-type EN10MB (Ethernet)
dropped privs to tcpdump
05:34:07.537062 IP 10.1.2.4.3361 > 10.1.0.232.80: Flags [S], seq 3357417000, win 62720, options [mss 8960,sackOK,TS val 2065677654 ecr 0,nop,wscale 7], length 0
        0x0000:  4500 003c 2bed 4000 4006 f7e1 0a01 0204  E..<+.@.@.......
        0x0010:  0a01 00e8 0d21 0050 c81e 1e28 0000 0000  .....!.P...(....
        0x0020:  a002 f500 f297 0000 0204 2300 0402 080a  ..........#.....
        0x0030:  7b1f bd56 0000 0000 0103 0307            {..V........
05:34:07.537143 IP 10.1.0.232.80 > 10.1.2.4.3361: Flags [S.], seq 3437136443, ack 3357417001, win 62636, options [mss 8960,sackOK,TS val 398828621 ecr 2065677654,nop,wscale 7], length 0
        0x0000:  4500 003c 0000 4000 4006 23cf 0a01 00e8  E..<..@.@.#.....
        0x0010:  0a01 0204 0050 0d21 ccde 8a3b c81e 1e29  .....P.!...;...)
        0x0020:  a012 f4ac 171c 0000 0204 2300 0402 080a  ..........#.....
        0x0030:  17c5 a44d 7b1f bd56 0103 0307            ...M{..V....
05:34:07.537509 IP 10.1.2.4.3361 > 10.1.0.232.80: Flags [P.], seq 1:29, ack 1, win 490, options [nop,nop,TS val 2065677655 ecr 398828621], length 28: HTTP
        0x0000:  4500 0050 2bee 4000 4006 f7cc 0a01 0204  E..P+.@.@.......
        0x0010:  0a01 00e8 0d21 0050 c81e 1e29 ccde 8a3c  .....!.P...)...<
        0x0020:  8018 01ea 3a1f 0000 0101 080a 7b1f bd57  ....:.......{..W
        0x0030:  17c5 a44d 0d0a 0d0a 000d 0a51 5549 540a  ...M.......QUIT.
        0x0040:  2111 000c 0a01 002d 0a01 0204 dede 0050  !......-.......P
05:34:07.537542 IP 10.1.0.232.80 > 10.1.2.4.3361: Flags [.], ack 29, win 490, options [nop,nop,TS val 398828622 ecr 2065677655], length 0
        0x0000:  4500 0034 6ccc 4000 4006 b70a 0a01 00e8  E..4l.@.@.......
        0x0010:  0a01 0204 0050 0d21 ccde 8a3c c81e 1e45  .....P.!...<...E
        0x0020:  8010 01ea 1714 0000 0101 080a 17c5 a44e  ...............N
        0x0030:  7b1f bd57                                {..W
05:34:07.537576 IP 10.1.2.4.3361 > 10.1.0.232.80: Flags [P.], seq 1:101, ack 1, win 490, options [nop,nop,TS val 2065677655 ecr 398828621], length 100: HTTP
        0x0000:  4500 0098 2bef 4000 4006 f783 0a01 0204  E...+.@.@.......
        0x0010:  0a01 00e8 0d21 0050 c81e 1e29 ccde 8a3c  .....!.P...)...<
        0x0020:  8018 01ea 6b07 0000 0101 080a 7b1f bd57  ....k.......{..W
        0x0030:  17c5 a44d 0d0a 0d0a 000d 0a51 5549 540a  ...M.......QUIT.
        0x0040:  2111 000c 0a01 002d 0a01 0204 dede 0050  !......-.......P
        0x0050:  4745 5420 2f20 4854 5450 2f31 2e31 0d0a  GET./.HTTP/1.1..
        0x0060:  486f 7374 3a20 3130 2e31 2e32 2e34 0d0a  Host:.10.1.2.4..
        0x0070:  5573 6572 2d41 6765 6e74 3a20 6375 726c  User-Agent:.curl
        0x0080:  2f37 2e36 312e 310d 0a41 6363 6570 743a  /7.61.1..Accept:
        0x0090:  202a 2f2a 0d0a 0d0a                      .*/*....
05:34:07.537587 IP 10.1.0.232.80 > 10.1.2.4.3361: Flags [.], ack 101, win 490, options [nop,nop,TS val 398828622 ecr 2065677655,nop,nop,sack 1 {1:29}], length 0
        0x0000:  4500 0040 6ccd 4000 4006 b6fd 0a01 00e8  E..@l.@.@.......
        0x0010:  0a01 0204 0050 0d21 ccde 8a3c c81e 1e8d  .....P.!...<....
        0x0020:  b010 01ea 1720 0000 0101 080a 17c5 a44e  ...............N
        0x0030:  7b1f bd57 0101 050a c81e 1e29 c81e 1e45  {..W.......)...E
05:34:07.537966 IP 10.1.0.232.80 > 10.1.2.4.3361: Flags [P.], seq 1:296, ack 101, win 490, options [nop,nop,TS val 398828622 ecr 2065677655], length 295: HTTP: HTTP/1.1 200 OK
        0x0000:  4500 015b 6cce 4000 4006 b5e1 0a01 00e8  E..[l.@.@.......
        0x0010:  0a01 0204 0050 0d21 ccde 8a3c c81e 1e8d  .....P.!...<....
        0x0020:  8018 01ea 183b 0000 0101 080a 17c5 a44e  .....;.........N
        0x0030:  7b1f bd57 4854 5450 2f31 2e31 2032 3030  {..WHTTP/1.1.200
        0x0040:  204f 4b0d 0a44 6174 653a 2057 6564 2c20  .OK..Date:.Wed,.
        0x0050:  3034 2044 6563 2032 3032 3420 3035 3a33  04.Dec.2024.05:3
        0x0060:  343a 3037 2047 4d54 0d0a 5365 7276 6572  4:07.GMT..Server
        0x0070:  3a20 4170 6163 6865 2f32 2e34 2e33 3720  :.Apache/2.4.37.
        0x0080:  284f 7261 636c 6520 4c69 6e75 7820 5365  (Oracle.Linux.Se
        0x0090:  7276 6572 290d 0a4c 6173 742d 4d6f 6469  rver)..Last-Modi
        0x00a0:  6669 6564 3a20 5765 642c 2030 3420 4465  fied:.Wed,.04.De
        0x00b0:  6320 3230 3234 2030 333a 3432 3a32 3120  c.2024.03:42:21.
        0x00c0:  474d 540d 0a45 5461 673a 2022 3238 2d36  GMT..ETag:."28-6
        0x00d0:  3238 3639 3931 6232 3437 6130 220d 0a41  286991b247a0"..A
        0x00e0:  6363 6570 742d 5261 6e67 6573 3a20 6279  ccept-Ranges:.by
        0x00f0:  7465 730d 0a43 6f6e 7465 6e74 2d4c 656e  tes..Content-Len
        0x0100:  6774 683a 2034 300d 0a43 6f6e 7465 6e74  gth:.40..Content
        0x0110:  2d54 7970 653a 2074 6578 742f 6874 6d6c  -Type:.text/html
        0x0120:  3b20 6368 6172 7365 743d 5554 462d 380d  ;.charset=UTF-8.
        0x0130:  0a0d 0a54 6869 7320 6973 2057 6562 2053  ...This.is.Web.S
        0x0140:  6572 7665 7220 2868 6f73 743a 6f6c 382d  erver.(host:ol8-
        0x0150:  7765 6273 6572 7665 7229 0a              webserver).
05:34:07.538358 IP 10.1.2.4.3361 > 10.1.0.232.80: Flags [.], ack 296, win 488, options [nop,nop,TS val 2065677656 ecr 398828622], length 0
        0x0000:  4500 0034 2bf0 4000 4006 f7e6 0a01 0204  E..4+.@.@.......
        0x0010:  0a01 00e8 0d21 0050 c81e 1e8d ccde 8b63  .....!.P.......c
        0x0020:  8010 01e8 1cfd 0000 0101 080a 7b1f bd58  ............{..X
        0x0030:  17c5 a44e                                ...N
05:34:07.538359 IP 10.1.2.4.3361 > 10.1.0.232.80: Flags [F.], seq 101, ack 296, win 488, options [nop,nop,TS val 2065677656 ecr 398828622], length 0
        0x0000:  4500 0034 2bf1 4000 4006 f7e5 0a01 0204  E..4+.@.@.......
        0x0010:  0a01 00e8 0d21 0050 c81e 1e8d ccde 8b63  .....!.P.......c
        0x0020:  8011 01e8 1cfc 0000 0101 080a 7b1f bd58  ............{..X
        0x0030:  17c5 a44e                                ...N
05:34:07.538424 IP 10.1.0.232.80 > 10.1.2.4.3361: Flags [F.], seq 296, ack 102, win 490, options [nop,nop,TS val 398828623 ecr 2065677656], length 0
        0x0000:  4500 0034 6ccf 4000 4006 b707 0a01 00e8  E..4l.@.@.......
        0x0010:  0a01 0204 0050 0d21 ccde 8b63 c81e 1e8e  .....P.!...c....
        0x0020:  8011 01ea 1714 0000 0101 080a 17c5 a44f  ...............O
        0x0030:  7b1f bd58                                {..X
05:34:07.538735 IP 10.1.2.4.3361 > 10.1.0.232.80: Flags [.], ack 297, win 488, options [nop,nop,TS val 2065677657 ecr 398828623], length 0
        0x0000:  4500 0034 2bf2 4000 4006 f7e4 0a01 0204  E..4+.@.@.......
        0x0010:  0a01 00e8 0d21 0050 c81e 1e8e ccde 8b64  .....!.P.......d
        0x0020:  8010 01e8 1cf9 0000 0101 080a 7b1f bd59  ............{..Y
        0x0030:  17c5 a44f                                ...O

</pre>
```
</details>

Webサーバ側での詳細なパケットキャプチャ内の**0d0a 0d0a 000d 0a51 5549 540a** がProxy Protocol v2 の protocol signatureという印らしいです。

:::note info

[The PROXY protocol Versions 1 & 2](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt)
<pre>The binary header format starts with a constant 12 bytes block containing the
protocol signature :
\x0D \x0A \x0D \x0A \x00 \x0D \x0A \x51 \x55 \x49 \x54 \x0A
</pre>
:::

以上で終わりです。




## 参考：NLBでPPv2を無効、バックエンドサーバ側もPPv2に対応させていない時のパケットキャプチャ
- クライアント（10.1.0.45）
- NLB（10.1.1.179）
- Webサーバ（10.1.0.232）
```text:Curlの結果
[opc@ol8-2 ~]$ curl 10.1.1.179
This is Web Server (host:ol8-webserver)
```

<details><summary> (展開ください) Webサーバ側のパケットキャプチャ </summary>
<pre>
04:28:23.923432 IP 10.1.1.179.9945 > 10.1.0.232.80: Flags [S], seq 1182372357, win 62720, options [mss 8960,sackOK,TS val 2026984796 ecr 0,nop,wscale 7], length 0
04:28:23.923526 IP 10.1.0.232.80 > 10.1.1.179.9945: Flags [S.], seq 799665047, ack 1182372358, win 62636, options [mss 8960,sackOK,TS val 2388392010 ecr 2026984796,nop,wscale 7], length 0
04:28:23.923876 IP 10.1.1.179.9945 > 10.1.0.232.80: Flags [.], ack 1, win 490, options [nop,nop,TS val 2026984797 ecr 2388392010], length 0
04:28:23.923909 IP 10.1.1.179.9945 > 10.1.0.232.80: Flags [P.], seq 1:75, ack 1, win 490, options [nop,nop,TS val 2026984797 ecr 2388392010], length 74: HTTP: GET / HTTP/1.1
04:28:23.923932 IP 10.1.0.232.80 > 10.1.1.179.9945: Flags [.], ack 75, win 489, options [nop,nop,TS val 2388392010 ecr 2026984797], length 0
04:28:23.924480 IP 10.1.0.232.80 > 10.1.1.179.9945: Flags [P.], seq 1:296, ack 75, win 489, options [nop,nop,TS val 2388392011 ecr 2026984797], length 295: HTTP: HTTP/1.1 200 OK
04:28:23.924778 IP 10.1.1.179.9945 > 10.1.0.232.80: Flags [.], ack 296, win 488, options [nop,nop,TS val 2026984798 ecr 2388392011], length 0
04:28:23.924967 IP 10.1.1.179.9945 > 10.1.0.232.80: Flags [F.], seq 75, ack 296, win 488, options [nop,nop,TS val 2026984798 ecr 2388392011], length 0
04:28:23.925043 IP 10.1.0.232.80 > 10.1.1.179.9945: Flags [F.], seq 296, ack 76, win 489, options [nop,nop,TS val 2388392011 ecr 2026984798], length 0
04:28:23.925345 IP 10.1.1.179.9945 > 10.1.0.232.80: Flags [.], ack 297, win 488, options [nop,nop,TS val 2026984798 ecr 2388392011], length 0
</pre>
</details>


<details><summary> (展開ください) クライアント側のパケットキャプチャ </summary>
<pre>
04:28:23.922914 IP 10.1.0.45.51738 > 10.1.1.179.80: Flags [S], seq 1182372357, win 62720, options [mss 8960,sackOK,TS val 2026984796 ecr 0,nop,wscale 7], length 0
04:28:23.923746 IP 10.1.1.179.80 > 10.1.0.45.51738: Flags [S.], seq 799665047, ack 1182372358, win 62636, options [mss 8960,sackOK,TS val 2388392010 ecr 2026984796,nop,wscale 7], length 0
04:28:23.923770 IP 10.1.0.45.51738 > 10.1.1.179.80: Flags [.], ack 1, win 490, options [nop,nop,TS val 2026984797 ecr 2388392010], length 0
04:28:23.923809 IP 10.1.0.45.51738 > 10.1.1.179.80: Flags [P.], seq 1:75, ack 1, win 490, options [nop,nop,TS val 2026984797 ecr 2388392010], length 74: HTTP: GET / HTTP/1.1
04:28:23.924091 IP 10.1.1.179.80 > 10.1.0.45.51738: Flags [.], ack 75, win 489, options [nop,nop,TS val 2388392010 ecr 2026984797], length 0
04:28:23.924669 IP 10.1.1.179.80 > 10.1.0.45.51738: Flags [P.], seq 1:296, ack 75, win 489, options [nop,nop,TS val 2388392011 ecr 2026984797], length 295: HTTP: HTTP/1.1 200 OK
04:28:23.924677 IP 10.1.0.45.51738 > 10.1.1.179.80: Flags [.], ack 296, win 488, options [nop,nop,TS val 2026984798 ecr 2388392011], length 0
04:28:23.924757 IP 10.1.0.45.51738 > 10.1.1.179.80: Flags [F.], seq 75, ack 296, win 488, options [nop,nop,TS val 2026984798 ecr 2388392011], length 0
04:28:23.925227 IP 10.1.1.179.80 > 10.1.0.45.51738: Flags [F.], seq 296, ack 76, win 489, options [nop,nop,TS val 2388392011 ecr 2026984798], length 0
04:28:23.925239 IP 10.1.0.45.51738 > 10.1.1.179.80: Flags [.], ack 297, win 488, options [nop,nop,TS val 2026984798 ecr 2388392011], length 0
</pre>
</details>
<br>