linux:commands:network:network_manager_bridge

NetworkManager によるブリッジの設定(nmcli)

sysfs でデバイス名を確認する場合。

$ ls /sys/class/net

enp8s0  lo  virbr0  wlp7s0

nmcli でデバイスを確認する場合。

$ nmcli dev

DEVICE  TYPE      STATE            CONNECTION 
enp8s0  ethernet  接続済み         有線接続 1
virbr0  bridge    接続済み (外部)  virbr0
wlp7s0  wifi      利用不可         --
lo      loopback  管理無し         --

もしも、すべてのインタフェースが接続済みな場合は以下のような表示になる。

$ nmcli dev

デバイス    タイプ    状態      接続
enp3s0      ethernet  接続済み  eno1
enp8s0f0    ethernet  接続済み  enp8s0f0
enp8s0f1    ethernet  接続済み  enp8s0f1
lo          loopback  管理無し  --

$ nmcli con

名前        UUID                                  タイプ          デバイス
eno1        b00bea8d-9069-4614-8870-614132313886  802-3-ethernet  enp3s0
enp8s0f0    83d1c2bb-05e6-46b9-9e52-609366a97cf2  802-3-ethernet  enp8s0f0
enp8s0f1    e048c528-f115-4860-85f5-c69da4854e71  802-3-ethernet  enp8s0f1

その場合は、現在 SSH 接続しているインタフェースを残して、それ以外を削除しても問題ない。

$ sudo nmcli con del enp8s0f0
$ sudo nmcli con del enp8s0f1

削除後の確認。

$ nmcli con

名前        UUID                                  タイプ          デバイス
eno1        b00bea8d-9069-4614-8870-614132313886  802-3-ethernet  enp3s0

$ nmcli dev

デバイス    タイプ    状態      接続
enp3s0      ethernet  接続済み  eno1
enp8s0f0    ethernet  切断済み  --
enp8s0f1    ethernet  切断済み  --

仮想ブリッジをデバイス数だけ追加する。

$ sudo nmcli con add type bridge ifname br0

接続 'bridge-br0' (d739ee14-2a10-4ace-9f06-8cce336f73d6) が正常に追加されました。

追加された仮想ブリッジの確認。

$ nmcli con

NAME              UUID                                  TYPE      DEVICE 
bridge-br0        d739ee14-2a10-4ace-9f06-8cce336f73d6  bridge    br0
有線接続 1        9f4327d6-c921-4a34-86fd-4f0f623b06b0  ethernet  enp8s0
virbr0            3e11e4c7-6d60-429d-a4dd-16eca3da540d  bridge    virbr0 
TomoyanWRT-GL24G  c2b00424-24bd-43ae-86af-af62bb7fd4e1  wifi      --

デバイスを仮想ブリッジに接続する。(仮想ブリッジスレーブの追加)

$ sudo nmcli con add type bridge-slave ifname enp8s0 master bridge-br0

接続 'bridge-slave-enp8s0' (51cb5c02-1406-44a1-9e68-7df356a8c049) が正常に追加されました。

追加された仮想ブリッジスレーブの確認。

$ nmcli con

NAME                 UUID                                  TYPE      DEVICE 
bridge-br0           d739ee14-2a10-4ace-9f06-8cce336f73d6  bridge    br0
有線接続 1           9f4327d6-c921-4a34-86fd-4f0f623b06b0  ethernet  enp8s0
virbr0               3e11e4c7-6d60-429d-a4dd-16eca3da540d  bridge    virbr0
TomoyanWRT-GL24G     c2b00424-24bd-43ae-86af-af62bb7fd4e1  wifi      --     
bridge-slave-enp8s0  51cb5c02-1406-44a1-9e68-7df356a8c049  ethernet  --     

仮想ブリッジのIPアドレスを設定する。

$ sudo nmcli connection modify bridge-br0 \
bridge.stp no \
ipv4.method manual ipv4.addresses "192.168.10.70/24" \
ipv4.gateway "192.168.10.254" \
ipv4.dns "192.168.10.254" \
ipv4.dns-search "tomoyan.local" \
ipv4.never-default no

※ipv4.never-default no は DEFROUTE=yes となる。

アクティブインタフェースの削除と再起動。
※SSHによるリモート作業では、削除と共に再起動する必要がある。

$ sudo nmcli connection delete eno1;reboot

Fedora 39 で KVM ゲストから Bridge (br0 など) で外部に通信できない場合😥
12.2. libvirt を使用したブリッジネットワーキング Red Hat Enterprise Linux 5 | Red Hat Customer Portal

$ sysctl net.bridge

net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-filter-pppoe-tagged = 0
net.bridge.bridge-nf-filter-vlan-tagged = 0
net.bridge.bridge-nf-pass-vlan-input-dev = 0

iptables を設定して、全てのトラフィックがブリッジを渡って転送されるようにします🤔

$ sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 1 -m physdev --physdev-is-bridged -j ACCEPT

success

$ sudo firewall-cmd --reload

success

ルールを削除する場合

$ sudo firewall-cmd --permanent --direct --remove-rule ipv4 filter FORWARD 1 -m physdev --physdev-is-bridged -j ACCEPT


設定結果の確認🤔

$ sudo cat /etc/firewalld/direct.xml

<?xml version="1.0" encoding="utf-8"?>
<direct>
  <rule ipv="ipv4" table="filter" chain="FORWARD" priority="1">-m physdev --physdev-is-bridged -j ACCEPT</rule>
</direct>

$ sudo iptables-save

# Generated by iptables-save v1.8.9 (nf_tables) on Sun Feb  4 02:07:04 2024
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:LIBVIRT_PRT - [0:0]
-A POSTROUTING -j LIBVIRT_PRT
-A LIBVIRT_PRT -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Sun Feb  4 02:07:04 2024
# Generated by iptables-save v1.8.9 (nf_tables) on Sun Feb  4 02:07:04 2024
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
:LIBVIRT_FWI - [0:0]
:LIBVIRT_FWO - [0:0]
:LIBVIRT_FWX - [0:0]
:LIBVIRT_INP - [0:0]
:LIBVIRT_OUT - [0:0]
-A INPUT -j LIBVIRT_INP
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -j DOCKER-USER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -j LIBVIRT_FWX
-A FORWARD -j LIBVIRT_FWI
-A FORWARD -j LIBVIRT_FWO
-A FORWARD -m physdev --physdev-is-bridged -j ACCEPT
-A OUTPUT -j LIBVIRT_OUT
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
-A LIBVIRT_FWI -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A LIBVIRT_FWI -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A LIBVIRT_FWO -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A LIBVIRT_FWO -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A LIBVIRT_FWX -i virbr0 -o virbr0 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p tcp -m tcp --dport 68 -j ACCEPT
COMMIT
# Completed on Sun Feb  4 02:07:04 2024
# Generated by iptables-save v1.8.9 (nf_tables) on Sun Feb  4 02:07:04 2024
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
:LIBVIRT_PRT - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -j LIBVIRT_PRT
-A DOCKER -i docker0 -j RETURN
-A LIBVIRT_PRT -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A LIBVIRT_PRT -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
COMMIT
# Completed on Sun Feb  4 02:07:04 2024

ゲストで疎通確認😎

$ ping google.com

PING google.com (142.251.222.46) 56(84) バイトのデータ
64 バイト応答 送信元 nrt13s72-in-f14.1e100.net (142.251.222.46): icmp_seq=1 ttl=55 時間=42.6ミリ秒
64 バイト応答 送信元 nrt13s72-in-f14.1e100.net (142.251.222.46): icmp_seq=2 ttl=55 時間=47.8ミリ秒
64 バイト応答 送信元 nrt13s72-in-f14.1e100.net (142.251.222.46): icmp_seq=3 ttl=55 時間=74.5ミリ秒
64 バイト応答 送信元 nrt13s72-in-f14.1e100.net (142.251.222.46): icmp_seq=4 ttl=55 時間=46.7ミリ秒
^C

ちなみに、/etc/sysctl.confで設定しても再起動すると反映されない😅
なので Fedora 39 ではブリッジの転送許可を firewall-cmd で設定するしかない😉

$ cat /etc/sysctl.conf 

# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

$ ll /etc/sysctl.d/

合計 4
lrwxrwxrwx. 1 root root 14  1月 22 09:00 99-sysctl.conf -> ../sysctl.conf

$ sysctl net.bridge

net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-filter-pppoe-tagged = 0
net.bridge.bridge-nf-filter-vlan-tagged = 0
net.bridge.bridge-nf-pass-vlan-input-dev = 0

☢️古い資料です (Obsolete)☢️

NetworkManager 0.9.8 より前はブリッジをサポートしないため、ネットワークスクリプトで構成する必要がある。

CentOS の場合

$ sudo chkconfig NetworkManager off
$ sudo service NetworkManager stop

Fedora の場合

$ sudo systemctl disable NetworkManager.service
$ sudo systemctl stop NetworkManager.service
$ sudo systemctl enable network.service
$ sudo systemctl start network.service

※Fedora19 の NetworkManager は 0.9.8 からブリッジをサポートします。

Kernelアップデートでデバイス名が変わりインタフェースが使えなくなる場合は、以下の方法でデバイス名を固定する。
ネットワークデバイス名の変更

$ sudo vi /etc/sysconfig/network-scripts/ifcfg-br0

/etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.1
NETMASK=255.255.255.0
GATEWAY=192.168.1.254
DNS1=192.168.1.254
DEFROUTE=yes

$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0

/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=XX:YY:ZZ:04:24:DA
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
BRIDGE=br0
ETHTOOL_OPTS="wol g"
  • linux/commands/network/network_manager_bridge.txt
  • 最終更新: 2024/02/04 03:05
  • by ともやん