目次
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
参考文献
RHEL7/CentOS7 NetworkManager徹底入門
nmcliで仮想ブリッジ作成 - めもめも
6.2. USING THE NETWORKMANAGER COMMAND LINE TOOL, NMCLI
付録
☢️古い資料です (Obsolete)☢️
ブリッジ接続の設定(network編)
NetworkManager の無効化
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
NICのブリッジ設定
$ 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"