しばらくハマってた……
先日無事にリニューアルオープンした社内Lab。
使用しているハードウェアにNIC(Network Interface Card)をふたつ搭載しているってのもあり、今後の使用状況的にちょっとネットワーク周りもちゃんとしておこうという思いもありで……。
Bonding+Bridge1)Bridgeの方はlxcとかで使う用な構成を実装してみようと思い立ったのです。
……が、これが結構ハマリまして(;´Д`)
BondingかBridgeのどちらか一方だけならサクッといけるんですが、コレを組み合わせようと思ったら上手くいかず……。ひとり悶々と「(`皿´)ムッキー!!」していたわけですが……。
完璧とは言いませんが、ようやくそれっぽくアレできるようになったので、将来の自分が「(`皿´)ムッキー!!」しなくて済むように備忘録がてらブログにまとめておこうと思います。
ここからのお約束だよ(`・ω・´)
とはいえ、このまま進むと説明がアレになってしまうので、RFC 6890 – Special-Purpose IP Address Registries2)と、ついでにRFC 5737 – IPv4 Address Blocks Reserved for Documentation(ついでのついでに、RFC 3849 – IPv6 Address Prefix Reserved for Documentation)に基づいて、下記のIPアドレス等を使用したものとしてアレします。
用途 | アドレス等 | 備考 |
---|---|---|
ネットワークアドレス | 192.0.2.0 | TEST-NET-1 |
サブネットマスク | 255.255.255.0 | /24 |
ブロードキャスト アドレス |
192.0.2.255 | |
ルータ | 192.0.2.1 | |
物理NIC | 192.0.2.10(eth0) 192.0.2.11(eth1) |
|
Bonding+Bridgeした後の仮想NIC | 192.0.2.12 |
メモを元に手順を整理する〜ぅ
設定したときに作ったメモを元に、手順を整理していきませぅ。
今回はNICを2つ装備したハードウェアに、CentOS7(Minimal ISO)をインストールしたものを使っています。OSのインストール時に、2つのNICには固定IPをアサインしています。
あと、(この設定を入れた時点では)rootユーザしかいない環境なのでアレですが、実際にやるときは一般ユーザを作ってsudoとかアレするかんじでやるのがいいかとおもいます。
まずは現状の設定を確認
さて、まずは普通に起動してみて、現状どうなっているかを確認してみましょう。
# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether nn:nn:nn:nn:nn:nn brd ff:ff:ff:ff:ff:ff inet 192.0.2.10/24 brd 192.0.2.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether nn:nn:nn:nn:nn:nn brd ff:ff:ff:ff:ff:ff inet 192.0.2.11/24 brd 192.0.2.255 scope global eth1 valid_lft forever preferred_lft forever # nmcli connection 名前 UUID タイプ デバイス eth0 nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn 802-3-ethernet eth0 eth1 nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn 802-3-ethernet eth1 # nmcli device デバイス タイプ 状態 接続 eth0 ethernet 接続済み eth0 eth1 ethernet 接続済み eth1 lo loopback 管理無し --
ちゃんと認識されているようですね!
Bridgeを設定する
まずはBridgeの設定を入れていきましょう。やりかたは簡単で、下記のようにすればOK。
1つ目のコマンドでブツを追加し、2つ目のコマンドで細かい設定を入れていく……って感じですね。
# nmcli connection add type bridge con-name br0 ifname br0 接続 'br0' (nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn) が正常に追加されました。 # nmcli connection modify br0 bridge.stp no ipv4.method manual ipv4.address "192.0.2.12/24" ipv4.gateway 192.0.2.1 ipv4.dns "8.8.8.8 8.8.4.4"
Bondingを設定する
続いて、Bondingの設定をば。
Bondingができるようにするには、カーネルモジュールをロードしなければなりません。3)たぶん、標準ではロードされていないので
lsmod
で「bonding」関係のモジュールがロードされているかを確認し、されていなければmodprobe
でロードしましょう。
# lsmod | grep bonding # modprobe bonding # lsmod | grep bonding bonding 145728 0
ここまでくれば後は簡単。
1つ目のコマンドでブツを追加し、2つ目のコマンドでBridgeのブツと紐付ける。3つ目と4つ目のコマンドで2つの物理NICをBondingなブツに紐付ける……という流れですね。
# nmcli connection add type bond ifname bond0 con-name bond0 mode active-backup 接続 'bond0' (nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn) が正常に追加されました。 # nmcli connection mod bond0 connection.master br0 connection.slave-type bridge # nmcli connection add type bond-slave ifname eth0 con-name bond-slave-eth0 master bond0 接続 'bond-slave-eth0' (nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn) が正常に追加されました。 # nmcli connection add type bond-slave ifname eth1 con-name bond-slave-eth1 master bond0 接続 'bond-slave-eth1' (nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn) が正常に追加されました。
あとは物理NICの設定を消して、サーバを再起動4)今回はメンドイので再起動の手順にしているけど、
サーバ自体の再起動が不要な方法もあるらすぃすればOK。
# nmcli connection del eth0 && nmcli connection del eth1 && shutdown -r now
最終確認
再起動が終わって、192.0.2.12
宛にSSHで接続できるようになっていればOK。
# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000 link/ether nn:nn:nn:nn:nn:nn brd ff:ff:ff:ff:ff:ff 3: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000 link/ether nn:nn:nn:nn:nn:nn brd ff:ff:ff:ff:ff:ff 4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000 link/ether nn:nn:nn:nn:nn:nn brd ff:ff:ff:ff:ff:ff inet 192.0.2.12/24 brd 192.0.2.255 scope global br0 valid_lft forever preferred_lft forever 5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP qlen 1000 link/ether nn:nn:nn:nn:nn:nn brd ff:ff:ff:ff:ff:ff # nmcli connection 名前 UUID タイプ デバイス bond-slave-eth0 nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn 802-3-ethernet eth0 bond-slave-eth1 nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn 802-3-ethernet eth1 bond0 nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn bond bond0 br0 nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn bridge br0 # nmcli device デバイス タイプ 状態 接続 bond0 bond 接続済み bond0 br0 bridge 接続済み br0 eth0 ethernet 接続済み bond-slave-eth0 eth1 ethernet 接続済み bond-slave-eth1 lo loopback 管理無し --
この状態でcat /proc/net/bonding/bond0
とかしながら、他のPCからpingとか打ちつつ線を抜き差しして動作検証をすればbondingのテストはできるはず。
Bridgeのテストについては、適当にlxcのインスタンスを立ち上げて「VM→外部」と「外部→VM」の疎通が取れればOK。
……こんな感じで大丈夫かしら……?
手元の構築メモを見ながら手順まとめてみたわけですが、多分こんな感じで設定すればOK!……なはず(;´Д`)
この記事にはn個のコピペミスとか設定の漏れとか根本的な勘違いとかあるかと思いますので、ボク以外の人がこのエントリを参考にするようなことがあったときはお気を付けください。
あと、間違いなどを見つけた方はコッソリとボクに教えてください 壁|_=)
Appendix: このエントリより役に立つだろう参考文献
参考までにボクがこのエントリを書くまでに参照したサイトを、参考文献として列挙しておきます。
順不同/敬称略です。
- CentOS 7 の nmcli で bonding – Qiita
- Linux の bonding のモードまとめ – Qiita
- LinuxのBondingをもっとよく知りたい | OpenGroove
- Linux Bonding : modprobe.confの編集 | OpenGroove
- Linux Bonding : NICフェイルオーバーのテスト | OpenGroove
- NIC冗長化〜Miimon編〜 – よかろうもん!
- Blog Alpha Networking: MII監視からARP監視によるボンディング切り替えへの変更方法
- Linuxでbondingのactiveなinterfaceを変更するコマンド – id:rx7(@namikawa)の技術メモ – 技術日記
- Bondingドライバの設定 – mk_1211の日記
- bonding でフォールトトレラントなNICにする – いますぐ実践! Linuxシステム管理 / Vol.161
注訳はこちら
↑1 | Bridgeの方はlxcとかで使う用 |
---|---|
↑2 | と、ついでにRFC 5737 – IPv4 Address Blocks Reserved for Documentation(ついでのついでに、RFC 3849 – IPv6 Address Prefix Reserved for Documentation) |
↑3 | たぶん、標準ではロードされていないので |
↑4 | 今回はメンドイので再起動の手順にしているけど、 サーバ自体の再起動が不要な方法もあるらすぃ |