💻

LXDのproxy機能でNATする
April 05, 2021February 19, 2024
#Develop#LXD#Network

このブログのサーバーを構築する際に 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 で利用できるキーです。

KeyTypeDefaultRequired
listenstring-yes
connectstring-yes
bindstringhostno
uidint0no
gidint0no
modeint0644no
natboolfalseno
proxy_protocolboolfalseno
security.uidint0no
security.gidint0no

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 が入るようになった。

参考サイト

インスタンス

インスタンスについて, インスタンスの作成, インスタンスの管理, インスタンスの設定, スナップショットの作成, プロファイルの使用, cloud-initの使用, コマンドの実行, コンソールへのアクセス, ファイルへのアクセス, エラーのトラブルシューティング, インスタンスの設定-., コンテナ実行環境.

LXD documentation

インスタンス

おしまい



gatsby-blogに公開フラグを追加する
April 03, 2021April 17, 2023

記事の作成中に公開されないようにしたり、公開タイミングを選べるようにするため gatsby-blog に公開フラグを追加した。 記事の Front-matter で公開設定する 非公開記事があっても URL は変わらない console に記事の公開情報を出力する。 gatsby-node.js front…

Continue reading...
sakakinox

Written by sakakinox
Server enginier

Copyright © sakakinox.net 2021-2024.