ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
仮想化・ホストサーバー

Proxmox VE NATネットワーク設定:vmbr1プライベートサブネット・iptables MASQUERADE・ポートフォワード

6 ステップ 12 分で読めます 4 回閲覧 0
目次

専用サーバーのパブリックIPが足りない場合や、データベース・社内検証用・ビルド用など外部公開が不要な仮想マシンには、Proxmox VE の NAT ネットワークが便利です。物理NICに接続しない vmbr1 ブリッジをプライベートサブネットとして作成し、ホスト側の iptables MASQUERADE でVMの通信をホストのパブリックIPに集約、必要なポートだけ DNAT のポートフォワードで公開します。対象は Proxmox VE 7.x / 8.x(Debian ベース)で、ゲストOSは Debian/Ubuntu と CentOS/Rocky/AlmaLinux の例を掲載しています。

前提:パブリック側ブリッジは vmbr0(PVE の標準)、プライベートサブネットは 10.10.10.0/24、ホストの内部アドレスは 10.10.10.1 とします。ブリッジ名が異なる場合は読み替えてください。PVE のインストールやVMへのパブリックIP割り当ては、ヘルプセンターの「PVE のインストール」「PVE 仮想マシンへのIP割り当て」をご覧ください。

ステップ1:Proxmox ネットワーク設定のバックアップとパブリックブリッジの確認

/etc/network/interfaces をバックアップし、デフォルトルートがどのブリッジを通っているか確認します。設定ミスでリモート接続が切れることがあるため、IPMI/KVM コンソールを用意するか、サポートにご相談ください。

cp /etc/network/interfaces /etc/network/interfaces.bak.$(date +%F)
ip -br addr
ip route | grep default

ステップ2:vmbr1 NAT ブリッジの作成と iptables MASQUERADE の設定

/etc/network/interfaces の末尾に以下を追記します。bridge-ports none は物理NICに接続しない内部専用スイッチを意味し、post-up で IPv4 転送を有効にして 10.10.10.0/24 から vmbr0 へ出る通信をマスカレードします。

auto vmbr1
iface vmbr1 inet static
    address 10.10.10.1/24
    bridge-ports none
    bridge-stp off
    bridge-fd 0
    post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
    post-up   iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o vmbr0 -j MASQUERADE
    post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o vmbr0 -j MASQUERADE

設定を反映し、再起動後もIP転送が有効になるよう sysctl に書き込みます。

ifreload -a
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-ip-forward.conf
sysctl --system
ip addr show vmbr1
iptables -t nat -S POSTROUTING

Web 管理画面の「ノード → システム → ネットワーク → 作成 → Linux Bridge」からも vmbr1 を追加できますが、MASQUERADE ルールはファイルに手動で追記する必要があります。

ステップ3:VMを NAT ネットワークに接続し内部IPを設定

VM の「ハードウェア → ネットワークデバイス」でブリッジを vmbr1 に変更(または vmbr1 のNICを追加)し、ゲストOS内で 10.10.10.x の固定IPとゲートウェイ 10.10.10.1 を設定します。

# Debian (/etc/network/interfaces inside the VM)
auto ens18
iface ens18 inet static
    address 10.10.10.101/24
    gateway 10.10.10.1
    dns-nameservers 1.1.1.1 8.8.8.8

# Ubuntu (/etc/netplan/50-nat.yaml, then: netplan apply)
network:
  version: 2
  ethernets:
    ens18:
      addresses: [10.10.10.102/24]
      routes:
        - to: default
          via: 10.10.10.1
      nameservers:
        addresses: [1.1.1.1, 8.8.8.8]

# CentOS / Rocky / AlmaLinux 8/9
nmcli con mod ens18 ipv4.method manual ipv4.addresses 10.10.10.103/24 \
  ipv4.gateway 10.10.10.1 ipv4.dns "1.1.1.1 8.8.8.8"
nmcli con up ens18

# test from the VM
ping -c 3 10.10.10.1
ping -c 3 1.1.1.1

1.1.1.1 に ping が通れば NAT による外部接続は成功です。IPには届くのに名前解決できない場合は DNS 設定を確認してください。

ステップ4:DNAT ポートフォワードでVMのサービスを公開

NAT 配下のVMには外部から直接アクセスできません。SSH やWebサイトを公開したい場合は、ホストに DNAT ルールを追加してパブリックIPのポートをVMへ転送します。

# public port 2201 -> VM 10.10.10.101:22 (SSH)
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2201 -j DNAT --to-destination 10.10.10.101:22
# public port 8080 -> VM 10.10.10.102:80 (HTTP)
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 8080 -j DNAT --to-destination 10.10.10.102:80

iptables -t nat -L PREROUTING -n --line-numbers
ホスト自身が使うポート(22、8006 など)は転送しないでください。ホストや PVE 管理画面にログインできなくなります。ホストでファイアウォールを使っている場合は転送ポートも許可が必要です。

ステップ5:iptables ポートフォワードルールの永続化

コマンドで追加したルールは再起動で消えます。vmbr1 の post-up/post-down に記述する方法(ブリッジと同時に適用され管理しやすい)か、iptables-persistent で保存する方法のどちらかを選びます。対象VMで PVE ファイアウォールを有効にしている場合は、conntrack zone のルールも追加しないと NAT の戻りパケットが破棄されることがあります。

# Option A: add to the vmbr1 block in /etc/network/interfaces
    post-up   iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2201 -j DNAT --to-destination 10.10.10.101:22
    post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 2201 -j DNAT --to-destination 10.10.10.101:22
    # only if the Proxmox firewall is enabled on these VMs:
    post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
    post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1

# Option B: save the current rules with iptables-persistent
apt update && apt install -y iptables-persistent
netfilter-persistent save
cat /etc/iptables/rules.v4

ステップ6(任意):dnsmasq で NAT サブネットに DHCP を提供

VM が多いと固定IPの手入力は手間です。ホストに dnsmasq を入れて vmbr1 のみで待ち受けさせ、ポート転送先のVMは dhcp-host でアドレスを固定します。

apt install -y dnsmasq
cat > /etc/dnsmasq.d/vmbr1.conf <<'EOF'
interface=vmbr1
bind-interfaces
except-interface=lo
dhcp-range=10.10.10.100,10.10.10.200,255.255.255.0,12h
dhcp-option=option:router,10.10.10.1
dhcp-option=option:dns-server,1.1.1.1,8.8.8.8
# fixed lease for one VM (MAC from: qm config 101 | grep net0)
dhcp-host=BC:24:11:AA:BB:CC,10.10.10.101
EOF
systemctl restart dnsmasq
systemctl status dnsmasq --no-pager
dnsmasq は vmbr1 にのみバインドするため、パブリック側に DHCP 応答を出すことはなく、データセンターのネットワークに影響しません。

よくある質問

VMから 10.10.10.1 には ping が通るのにインターネットに出られません

/proc/sys/net/ipv4/ip_forward が 1 か、iptables -t nat -S POSTROUTING に正しい出力インターフェースの MASQUERADE があるか、ホスト自体が外部に接続できるかを順に確認してください。

ポートフォワードが外部から効きません

DNAT ルールの -i が vmbr0 になっているか、VM内のサービスが 127.0.0.1 ではなく 0.0.0.0 で待ち受けているか、ゲストのファイアウォールで許可しているか、PVE ファイアウォール使用時に fwbr+ の conntrack zone ルールがあるかを確認します。

NAT のVMとパブリックIPのVMは共存できますか?

できます。パブリックIPのVMは vmbr0、NAT のVMは vmbr1 を使い、1台のVMに両方のNICを付けることも可能です。パブリックIPを追加したい場合は IMIDC までお問い合わせください。

解決しない場合は、チケットから IMIDC の 24 時間 365 日テクニカルサポートへご連絡ください:https://www.imidc.com/submitticket.php

この回答はお役に立ちましたか?

関連チュートリアル