次のトポロジを使用します。
HostA(virbr0:192.168.122.1) - TAPインターフェース - (eth0:192.168.122.85)gw(eth1:192.168.3.51)---
gw
:QEMU VMゲスト、他のQEMU VMゲストのゲートウェイとして機能し、インターフェイスを介してeth1
接続します。gw
インターフェイスを使用して、Linux TAPインターフェイスを介してQEMUホストに接続しますeth0
。 TABインターフェイスはIPを動的に割り当てますeth0
。
hostA
: QEMU 仮想マシンホスト
root@hostA:~$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.254.134 netmask 255.255.255.0 broadcast 172.16.254.255
inet6 fe80::20c:29ff:fe25:1670 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:25:16:70 txqueuelen 1000 (Ethernet)
RX packets 18116 bytes 1361094 (1.3 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14579 bytes 5334119 (5.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
gns3tap0-0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::50bd:d3ff:fe1a:e55 prefixlen 64 scopeid 0x20<link>
ether 52:bd:d3:1a:0e:55 txqueuelen 1000 (Ethernet)
RX packets 353 bytes 28543 (28.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3348 bytes 183399 (183.3 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 662311 bytes 99203163 (99.2 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 662311 bytes 99203163 (99.2 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:62:0a:c5 txqueuelen 1000 (Ethernet)
RX packets 353 bytes 23601 (23.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 379 bytes 28629 (28.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
gw:~# ifconfig
eth0 Link encap:Ethernet HWaddr 0C:FE:27:0C:E4:00
inet addr:192.168.122.85 Bcast:192.168.122.255 Mask:255.255.255.0
inet6 addr: fe80::efe:27ff:fe0c:e400/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:379 errors:3150 dropped:0 overruns:0 frame:3150
TX packets:353 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:31851 (31.1 KiB) TX bytes:28543 (27.8 KiB)
eth1 Link encap:Ethernet HWaddr 0C:FE:27:0C:E4:01
inet addr:192.168.3.51 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::efe:27ff:fe0c:e401/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:302 errors:0 dropped:0 overruns:0 frame:0
TX packets:300 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:25796 (25.1 KiB) TX bytes:24782 (24.2 KiB)
gw:~# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.122.1 0.0.0.0 UG 0 0 0 eth0
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
目標は、内部LANのホストAから仮想マシン192.168.3.0/24への接続可能性です。
次のルーティング設定が動作しています。
root@hostA:~$ sudo route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.122.85
root@hostA:~$ netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 172.16.254.2 0.0.0.0 UG 0 0 0 eth0
172.16.254.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.3.0 192.168.122.85 255.255.255.0 UG 0 0 0 virbr0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
root@hostA:~$ ping 192.168.3.102
PING 192.168.3.102 (192.168.3.102) 56(84) bytes of data.
64 bytes from 192.168.3.102: icmp_seq=1 ttl=63 time=3.07 ms
^C
--- 192.168.3.102 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.071/3.071/3.071/0.000 ms
root@hostA:~$ ping 192.168.3.103
PING 192.168.3.103 (192.168.3.103) 56(84) bytes of data.
64 bytes from 192.168.3.103: icmp_seq=1 ttl=63 time=3.03 ms
64 bytes from 192.168.3.103: icmp_seq=2 ttl=63 time=2.99 ms
^C
--- 192.168.3.103 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 2.997/3.014/3.032/0.057 ms
ただし、Linux TAP は IP を動的に割り当てるため、ルーティングがeth0
必要で、次のルータの IP アドレスをネクスト ホップとして使用せず、代わりに次のような終端インターフェイスのローカル IP を使用します。
root@hostA:~$ route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.122.1 dev virbr0
root@hostA:~$ netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 172.16.254.2 0.0.0.0 UG 0 0 0 eth0
172.16.254.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.0.0 192.168.122.1 255.255.0.0 UG 0 0 0 virbr0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr
root@hostA:~$ ping -c 1 192.168.122.85
PING 192.168.122.85 (192.168.122.85) 56(84) bytes of data.
64 bytes from 192.168.122.85: icmp_seq=1 ttl=64 time=0.585 ms
--- 192.168.122.85 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.585/0.585/0.585/0.000 ms
root@hostA:~$ ping -c 1 192.168.3.51
PING 192.168.3.51 (192.168.3.51) 56(84) bytes of data.
64 bytes from 192.168.3.51: icmp_seq=1 ttl=64 time=0.956 ms
--- 192.168.3.51 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.956/0.956/0.956/0.000 ms
root@hostA:~$ ping -c 1 192.168.3.102
PING 192.168.3.102 (192.168.3.102) 56(84) bytes of data.
From 192.168.122.1 icmp_seq=1 Destination Host Unreachable
--- 192.168.3.102 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
root@hostA:~$ ping -c 1 192.168.3.103
PING 192.168.3.103 (192.168.3.103) 56(84) bytes of data.
From 192.168.122.1 icmp_seq=1 Destination Host Unreachable
--- 192.168.3.103 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
図に示すように、上記のルーティング設定を使用するとhostA
インターフェイスeth1
に接続できますが、内部LAN(192.168.3.0/24)内の他の仮想マシンには接続できません。ただし、内部LANホスト自体はホストAに到達できます。
iptables
構成は次のとおりです。
root@hostA:~$ sudo iptables -nvL FORWARD
Chain FORWARD (policy ACCEPT 21 packets, 1624 bytes)
pkts bytes target prot opt in out source destination
197 15616 DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
197 15616 DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
88 7346 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED
88 6646 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0
0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0
gw:~# iptables -nvL FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- eth1 eth0 192.168.122.0/24 0.0.0.0/0 ctstate NEW
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
gw:~# sysctl -a | grep ipv4.ip_forward
net.ipv4.ip_forward = 1
dns:~# ifconfig
eth0 Link encap:Ethernet HWaddr 0C:FE:27:0C:76:00
inet addr:192.168.3.103 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::efe:27ff:fe0c:7600/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:18638 errors:0 dropped:0 overruns:0 frame:0
TX packets:18634 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1543312 (1.4 MiB) TX bytes:1705846 (1.6 MiB)
dns:~# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.3.51 0.0.0.0 UG 0 0 0 eth0
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
質問:
構成に何か抜けましたか?
出口インターフェイスのローカルIPをネクストホップIPとして使用する動作するルーティングエントリを設定する方法はありますか?
ベストアンサー1
2つの3つの別々の質問があります。
動的ゲートウェイIP
このためにルーティングプロトコルを使用するのは過剰です(他の理由ですでにルーティングプロトコルを使用していない限り)。 gw/eth0 構成を静的に変更してみましょう。これが不可能な場合は、そのネットワークへのパスを設定する権限を取得できるgw
ユーザーを作成できます。新しいIPを取得するたびにSSHを介して接続し、コマンドを実行できます(おそらく経由)。hostA
sudo
gw
hostA
ForcedCommand
GWからのルーティング
にパスが(正しく)設定されていませんgw
。net.ipv4.ip_forward = 0
()で有効にし、man sysctl
ファイアウォールでその接続を許可する必要がありますiptables -nvL FORWARD
。を参照してください。
192.168.3.0の仮想マシンパス
接続する仮想マシンはデフォルトゲートウェイとして設定する必要がgw/eth1
あります。gw
そうでない場合は、そのネットワークで()を実行するgw
必要があります。SNAT
iptables