読者です 読者をやめる 読者になる 読者になる

初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

スポンサーリンク

Vagrantでちょっとしたネットワーク構成のVMを作成した

Vagrant 仮想化


仕事でちょっとした実験ネットワーク構成を作る必要があったので、Vagrantでやってみた時のメモ。Vagrantっつうかマルチホーム構成のメモに近い。

構成

今回作りたい構成はこんな形。

f:id:osa030:20150113193123p:plain

異なるネットワークに属するノードがルータを介して通信するような構成。シカーモ片方のノードは何故かマルチホーム。

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu1404"

  config.vm.define :server do | server |
    server.vm.hostname = "Server"
    server.vm.network :private_network, ip: "192.168.11.10", virtualbox__intnet: "pnet1"
    server.vm.provision "shell", :path => "server_setup.sh", run: "always"
  end

  config.vm.define :router do | router |
    router.vm.hostname = "Router"
    router.vm.network :private_network, ip: "192.168.11.1", virtualbox__intnet: "pnet1"
    router.vm.network :private_network, ip: "192.168.22.1", virtualbox__intnet: "pnet2"
    router.vm.network :private_network, ip: "192.168.33.1", virtualbox__intnet: "pnet3"
    router.vm.provision "shell", :path => "router_setup.sh", run: "always"
  end

  config.vm.define :client do | client |
    client.vm.hostname = "Client"
    client.vm.network :private_network, ip: "192.168.22.100", virtualbox__intnet: "pnet2"
    client.vm.network :private_network, ip: [f:id:osa030:20150113193123p:plain]"192.168.33.100", virtualbox__intnet: "pnet3"
    client.vm.provision "shell", :path => "client_setup.sh", run: "always"
  end
end

ネットワーク設定

ルーティング設定については、Vagrantfileだとあまり細かい設定はできなさそうなので、VM起動時にコマンド(shell)を叩いて設定する。なお、この設定だと各VMはHostOnlyNetwork経由でNATを介して外部との通じて外部通信はできない。が、今回は必要ないのでガン無視。

実現にあたって2パターンのやり方があったので両方載せておく。お好みで。

パターン1

"rp_filter"を無効化するパターン。"rp_filter"とは「戻り経路フィルタ」のことらしい。詳細は以下参照。

http://linuxjf.sourceforge.jp/JFdocs/Adv-Routing-HOWTO/lartc.kernel.rpf.html

普通は必要ないと思うけど、今回マルチホーム構成のClientがいるので必要になった。実験用構成なのでこれでもおけ。

  • server_setup.sh
# /bin/sh

sudo route del default gw 10.0.2.2 eth0
sudo route add default gw 192.168.11.1 eth1

自動的にデフォゲがHostOnlyNetworkになるので削除してRouterに設定

  • router_setup.sh
# /bin/sh

sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv4.conf.eth1.rp_filter=0
sudo sysctl -w net.ipv4.conf.eth2.rp_filter=0
sudo sysctl -w net.ipv4.conf.all.rp_filter=0
sudo sysctl -w net.ipv4.conf.default.rp_filter=0

ルータと機能するように"ip_forward"を有効化して"rp_filter"を無効化、恐らくeth2とallだけでいいんだけど面倒くさいので全部指定だこの野郎。

  • client_setup.sh
# /bin/sh

sudo route del default gw 10.0.2.2 eth0
sudo route add default gw 192.168.22.1 eth1

sudo sysctl -w net.ipv4.conf.eth1.rp_filter=0
sudo sysctl -w net.ipv4.conf.eth2.rp_filter=0
sudo sysctl -w net.ipv4.conf.all.rp_filter=0
sudo sysctl -w net.ipv4.conf.default.rp_filter=0

serverとrouterの間の子。デフォゲはとりあえずpnet2にしてみたけどどっちでもいい。"rp_filter"を無効化は恐らくeth2とallだけでいいんだけど面倒くさいので全部指定だンカンこの野郎。

パターン2

"rp_filter"を無効化せずに"iproute2"を使うパターン。ポリシールーティングというらしい。こっちの方が洗練されておりエレガントである。

ポリシーベースルーティングの設定について : makoto_fujimotoのblog

  • server_setup.sh
# /bin/sh
sudo route del default gw 10.0.2.2 eth0
sudo route add default gw 192.168.11.1 eth1

パターン1と同じ。

  • router_setup.sh
# /bin/sh

sudo sysctl -w net.ipv4.ip_forward=1

ルータと機能するように"ip_forward"を有効化のみ。ならばVagrantfile中にinlineでも問題なかろう。

  • client_setup.sh
# /bin/sh

sudo route del default gw 10.0.2.2 eth0
sudo route add default gw 192.168.22.1 eth1

sudo ip route flush table 22
sudo ip route add table 22 to 192.168.22.0/24 dev eth1
sudo ip route add table 22 to default via 192.168.22.1 dev eth1

sudo ip route flush table 33
sudo ip route add table 33 to 192.168.33.0/24 dev eth2
sudo ip route add table 33 to default via 192.168.33.1 dev eth2

sudo ip rule add from 192.168.22.0/24 table 22 priority 22
sudo ip rule add from 192.168.33.0/24 table 33 priority 33
sudo ip route flush cache

ここがこのパターンの主役。ぶっちゃけここを参考に自分のネットワーク構成に変えただけである。

Linux Dual Network Route Hack (Multi-Homing) | Sivel.net

終わりに

今回は、ServerからClientのデフォゲ向いてない方のアドレス(192.168.33.100)を指定して通信する場合に"rp_filter"や"iproute2"の設定が必要となったけど、多分マルチホームじゃなければそれを外してもらえれば普通に通信できると思う。なのでマルチホームじゃない構成を作りたい場合はそこら辺を省いてもらって問題ないと思う。

あとパターン2の方でいけばきっとNAT経由での外部アクセスもいけるはず。なのでモテたくばiproute2を極めた方がいいと思う。でも今回は必要ないからそこは放置してる。

スポンサーリンク