このブログのサーバーを構築する際に lxd を利用しています。
lxd はもともとポートフォワーディングする機能がついていなかったので iptables 等でポートフォワードしていましたが
LXD>=3.0 以降に proxy デバイスが追加され lxd でポートフォワーディングを実現できるようになり利用していました。
lxd の proxy 機能でポートフォワーディングする
lxc config device add nginx http proxy listen=tcp:150.*.*.**:80 connect=tcp:10.11.*.**:80 bind=host
lxc config device add nginx https proxy listen=tcp:150.*.*.**:443 connect=tcp:10.11.*.**:443 bind=host
インスタンスに proxy タイプのデバイスを追加
この設定では nginx のログに記載される IP がインスタンスの IP となってしまう。
10.11.*.** - - [02/Apr/2021:05:47:53 +0000] "GET / HTTP/1.1" 301 185 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
10.11.*.** - - [02/Apr/2021:06:16:39 +0000] "GET / HTTP/1.1" 301 185 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
10.11.*.** - - [02/Apr/2021:06:16:41 +0000] "GET / HTTP/1.1" 200 50141 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
10.11.*.** - - [02/Apr/2021:06:16:42 +0000] "GET / HTTP/1.1" 200 50141 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
nginx のログでアクセス元 IP を取得したい
今のままだとアクセス元がどこだかわからないので、アクセス元 IP を取得する方法を考えます。
以下は proxytype で利用できるキーです。
Key | Type | Default | Required |
---|---|---|---|
listen | string | - | yes |
connect | string | - | yes |
bind | string | host | no |
uid | int | 0 | no |
gid | int | 0 | no |
mode | int | 0644 | no |
nat | bool | false | no |
proxy_protocol | bool | false | no |
security.uid | int | 0 | no |
security.gid | int | 0 | no |
nat するか proxy_protocol を利用すると取得できそうです。
結論としては nat を利用することにしました。
proxy_protocol は nginx で一度 proxy_protocol で受けてそこからさらに nginx で web サーバー処理する必要があり
なんとも冗長な感じです。
nat 設定でエラー
lxc config device add nginx http proxy listen=tcp:150.*.*.**:80 connect=tcp:10.11.*.**:80 bind=host nat=true
Error: Failed to start device "http": Proxy connect IP cannot be used with any of the instance NICs static IPs
nat するためにはインスタンスに staticIP を割り当てる必要があります。
lxc config device set nginx eth0 ipv4.address=10.11.*.**
Error: The device doesn't exist
eth0 がないと言われます。
実在して IP アドレスも割り当てられてて通信もできているのに意味不明です。
lxc config show nginx
architecture: x86_64
config:
image.architecture: amd64
image.description: Centos 8 amd64 (2020xxxx)
image.os: Centos
image.release: "8"
image.serial: "2020xxxx"
image.type: squashfs
image.variant: default
security.privileged: "true"
volatile.base_image: 55cb261b14932ece19***...
volatile.eth0.host_name: vethe***
volatile.eth0.hwaddr: 00:16:3e:**:**
volatile.idmap.base: "0"
volatile.idmap.current: '[]'
volatile.idmap.next: '[]'
volatile.last_state.idmap: '[]'
volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""
eth0 device を作成する必要がある
lxc network attach lxdbr0 nginx eth0
lxc config device set nginx eth0 ipv4.address=10.11.*.**
lxc config device add nginx http proxy listen=tcp:150.*.*.**:80 connect=tcp:0.0.0.0:80 bind=host nat=true
既に作成されてるけど、network attach する必要があった。
これで nginx の remote_ip にちゃんと接続もと IP が入るようになった。
参考サイト
おしまい