在 Vagrant 和 VirtualBox Env 中使用 `socat` 进行多播
Multicasting with `socat` in Vagrant & VirtualBox Env
问题:同一网络中的每台机器都应该能够向所有成员广播,包括它自己。
这是尝试使用在 Vagrant & VirtualBox Envrionment 中创建的 VM 使用 socat
进行多播。似乎这里的工作方式有所不同,所以我首先尝试查看多播如何在物理机器上工作。
我有 3 台安装了 ubuntu 12.04 服务器的物理机,分别命名为 pc0
、pc1
和 pc2
.
我在每台机器上 运行:
socat STDIO UDP-DATAGRAM:224.0.0.1:2200,bind=:2200
...当我从 pc0
中键入 hi from pc0
时,它已向自身和其他 2 台机器广播,这就是我想要的(我希望这就是多播的工作方式):
ubuntu@pc0:~$ socat STDIO UDP-DATAGRAM:224.0.0.1:2200,bind=:2200
hi from pc0
hi from pc0
ubuntu@pc1:~$ socat STDIO UDP-DATAGRAM:224.0.0.1:2200,bind=:2200
hi from pc0
ubuntu@pc2:~$ socat STDIO UDP-DATAGRAM:224.0.0.1:2200,bind=:2200
hi from pc0
我正在使用 IP 224.0.0.1
,因为它默认用于每台机器上的多播。
接下来,我尝试用 3 个虚拟机实现相同的东西,vb0
、vb1
和 vb2
。 Github 回购是 here.
现在我尝试从 vb0
广播:
vagrant@vb0:~$ socat STDIO UDP-DATAGRAM:224.0.0.1:2200,bind=:2200
hello from vb0
hello from vb0
...并且它不会向除自身以外的其他成员广播(如上述物理机的情况)。
看来,在这个工作之前应该做一些额外的设置...
Vagrantfile
:
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu-12.04-x64"
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.provider "virtualbox" do |vb|
vb.cpus = "2"
vb.memory = "4096"
end
config.vm.provision "chef_apply" do |chef|
chef.recipe = File.read("recipe.rb")
end
config.vm.define "vb0" do |vb0|
vb0.vm.hostname = "vb0"
vb0.vm.network "private_network", ip: "10.20.30.100"
end
config.vm.define "vb1" do |vb1|
vb1.vm.hostname = "vb1"
vb1.vm.network "private_network", ip: "10.20.30.101"
end
config.vm.define "vb2" do |vb2|
vb2.vm.hostname = "vb2"
vb2.vm.network "private_network", ip: "10.20.30.102"
end
end
运行 在每台设备上(即 vb01
、vb1
和 vb2
):
sudo ip route add 224.0.0.0/4 dev eth1
解决了问题。
在物理环境中,即使不这样做也能正常工作。
不知道为什么我们必须像这样在虚拟环境中 运行 这个。
vagrant@vb0:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.0.2.2 0.0.0.0 UG 100 0 0 eth0
10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
10.20.30.0 * 255.255.255.0 U 0 0 0 eth1
224.0.0.0 * 240.0.0.0 U 0 0 0 eth1
问题:同一网络中的每台机器都应该能够向所有成员广播,包括它自己。
这是尝试使用在 Vagrant & VirtualBox Envrionment 中创建的 VM 使用 socat
进行多播。似乎这里的工作方式有所不同,所以我首先尝试查看多播如何在物理机器上工作。
我有 3 台安装了 ubuntu 12.04 服务器的物理机,分别命名为 pc0
、pc1
和 pc2
.
我在每台机器上 运行:
socat STDIO UDP-DATAGRAM:224.0.0.1:2200,bind=:2200
...当我从 pc0
中键入 hi from pc0
时,它已向自身和其他 2 台机器广播,这就是我想要的(我希望这就是多播的工作方式):
ubuntu@pc0:~$ socat STDIO UDP-DATAGRAM:224.0.0.1:2200,bind=:2200
hi from pc0
hi from pc0
ubuntu@pc1:~$ socat STDIO UDP-DATAGRAM:224.0.0.1:2200,bind=:2200
hi from pc0
ubuntu@pc2:~$ socat STDIO UDP-DATAGRAM:224.0.0.1:2200,bind=:2200
hi from pc0
我正在使用 IP 224.0.0.1
,因为它默认用于每台机器上的多播。
接下来,我尝试用 3 个虚拟机实现相同的东西,vb0
、vb1
和 vb2
。 Github 回购是 here.
现在我尝试从 vb0
广播:
vagrant@vb0:~$ socat STDIO UDP-DATAGRAM:224.0.0.1:2200,bind=:2200
hello from vb0
hello from vb0
...并且它不会向除自身以外的其他成员广播(如上述物理机的情况)。
看来,在这个工作之前应该做一些额外的设置...
Vagrantfile
:
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu-12.04-x64"
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.provider "virtualbox" do |vb|
vb.cpus = "2"
vb.memory = "4096"
end
config.vm.provision "chef_apply" do |chef|
chef.recipe = File.read("recipe.rb")
end
config.vm.define "vb0" do |vb0|
vb0.vm.hostname = "vb0"
vb0.vm.network "private_network", ip: "10.20.30.100"
end
config.vm.define "vb1" do |vb1|
vb1.vm.hostname = "vb1"
vb1.vm.network "private_network", ip: "10.20.30.101"
end
config.vm.define "vb2" do |vb2|
vb2.vm.hostname = "vb2"
vb2.vm.network "private_network", ip: "10.20.30.102"
end
end
运行 在每台设备上(即 vb01
、vb1
和 vb2
):
sudo ip route add 224.0.0.0/4 dev eth1
解决了问题。
在物理环境中,即使不这样做也能正常工作。 不知道为什么我们必须像这样在虚拟环境中 运行 这个。
vagrant@vb0:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.0.2.2 0.0.0.0 UG 100 0 0 eth0
10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
10.20.30.0 * 255.255.255.0 U 0 0 0 eth1
224.0.0.0 * 240.0.0.0 U 0 0 0 eth1