호스트 IP와 다른 서브넷에 있지만 호스트 하드웨어 주소로 정적으로 라우팅되는 Virtualbox 가상 머신의 고정 IP에 연결할 수 없습니다.

호스트 IP와 다른 서브넷에 있지만 호스트 하드웨어 주소로 정적으로 라우팅되는 Virtualbox 가상 머신의 고정 IP에 연결할 수 없습니다.

데이터 센터에 Ubuntu Trusty(14.04)를 실행하는 물리적 서버가 있는데, 그곳에서 IP 주소와 /28 블록(IP 주소 16개, 사용 가능 14개)을 할당했습니다. 추가 서브넷이 물리적 호스트를 통해 정적으로 라우팅된다고 하는데, 이는 해당 네트워크가 호스트 NIC 하드웨어 주소의 요청만 수락한다는 의미라고 가정합니다.

각 가상 머신이 고유한 IP 주소를 갖고 네트워크에서 실제 물리적 서버처럼 작동하도록(즉, NAT 없음) VirtualBox와 함께 이를 사용할 것입니다. 또한 요청이 호스트의 하드웨어 주소를 사용하도록 VM이 호스트를 통해 트래픽을 라우팅해야 한다고 가정합니다.

저는 기본 고정 IP나 NAT 이상의 복잡한 네트워크를 설정하는 전문가가 아니기 때문에 매뉴얼 페이지, Ubuntu 온라인 문서, 다양한 StackExchange 사이트에 대한 수많은 질문과 답변을 읽었습니다. 제가 이해한 바로는 호스트 IP 주소와 가상 머신에 대한 게이트웨이 역할을 하는 서브넷의 주소 사이에 가상 브리지를 설정해야 합니다. 따라서 가상 머신은 해당 서브넷에 게이트웨이가 있는 간단한 설정을 갖게 됩니다.

호스트에서 VM에 액세스할 수 있고 그 반대의 경우도 가능하지만 VM은 호스트 외부의 인터넷에 액세스할 수 없고 인터넷에서도 VM에 액세스할 수 없습니다. 문제는 요청을 라우팅하기 위해 브리지를 올바르게 설정하지 않았기 때문이라고 가정합니다. 올바른 방향으로 나아갈 수 있도록 도와주는 조언을 주시면 감사하겠습니다.

후원자의/etc/network/interfaces

auto lo
iface lo inet loopback

auto  br0
iface br0 inet static
  name      Bridge for VMs to connect via
  address   x.x.x.229
  netmask   255.255.255.192
  gateway   x.x.x.193
  # default route to access subnet - this was provided by the data centre:
  up route add -net x.x.x.192 netmask 255.255.255.192 gw x.x.x.193 eth0
  bridge_ports eth0
  bridge_fd 9
  bridge_hello 2
  bridge_maxage 12
  bridge_stp off

auto  br0:0
iface br0:0 inet static
  name      Gateway IP for VMs in subnet y.y.y.240/28
  address   y.y.y.241
  netmask   255.255.255.240
  broadcast y.y.y.255
  network   y.y.y.240

호스트 시스템 정보:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         x.x.x.193  0.0.0.0         UG    0      0        0 br0
x.x.x.192  0.0.0.0         255.255.255.192 U     0      0        0 br0
y.y.y.240  0.0.0.0         255.255.255.240 U     0      0        0 br0

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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 master br0 state UP group default qlen 1000
    link/ether c8:60:00:5e:bd:e0 brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether c8:60:00:5e:bd:e0 brd ff:ff:ff:ff:ff:ff
    inet x.x.x.229/26 brd x.x.x.255 scope global br0
       valid_lft forever preferred_lft forever
    inet y.y.y.241/28 brd y.y.y.255 scope global br0:0
       valid_lft forever preferred_lft forever

$ ifconfig
br0       Link encap:Ethernet  HWaddr c8:60:00:5e:bd:e0  
          inet addr:x.x.x.229  Bcast:x.x.x.255  Mask:255.255.255.192
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:743907 errors:0 dropped:0 overruns:0 frame:0
          TX packets:519787 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:92549304 (92.5 MB)  TX bytes:172422977 (172.4 MB)

br0:0     Link encap:Ethernet  HWaddr c8:60:00:5e:bd:e0  
          inet addr:y.y.y.241  Bcast:y.y.y.255  Mask:255.255.255.240
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth0      Link encap:Ethernet  HWaddr c8:60:00:5e:bd:e0  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:743968 errors:0 dropped:0 overruns:0 frame:0
          TX packets:519787 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:102968103 (102.9 MB)  TX bytes:172422977 (172.4 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:674890 errors:0 dropped:0 overruns:0 frame:0
          TX packets:674890 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:302219962 (302.2 MB)  TX bytes:302219962 (302.2 MB)

가상 기기/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
  address y.y.y.243
  netmask 255.255.255.240
  gateway y.y.y.241

가상 머신 시스템 정보:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         y.y.y.241  0.0.0.0         UG    0      0        0 eth0
y.y.y.240  0.0.0.0         255.255.255.240 U     0      0        0 eth0

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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 group default qlen 1000
    link/ether 08:00:27:f7:36:74 brd ff:ff:ff:ff:ff:ff
    inet y.y.y.243/28 brd y.y.y.255 scope global eth0
       valid_lft forever preferred_lft forever

$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:f7:36:74  
          inet addr:y.y.y.243  Bcast:y.y.y.255  Mask:255.255.255.240
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:18112 errors:0 dropped:0 overruns:0 frame:0
          TX packets:241 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1123962 (1.1 MB)  TX bytes:54822 (54.8 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:444 errors:0 dropped:0 overruns:0 frame:0
          TX packets:444 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:35428 (35.4 KB)  TX bytes:35428 (35.4 KB)

$ ping -c 4 -W 5 x.x.x.229
PING x.x.x.229 (x.x.x.229) 56(84) bytes of data.
64 bytes from x.x.x.229: icmp_seq=1 ttl=64 time=0.117 ms
64 bytes from x.x.x.229: icmp_seq=2 ttl=64 time=0.106 ms
64 bytes from x.x.x.229: icmp_seq=3 ttl=64 time=0.102 ms
64 bytes from x.x.x.229: icmp_seq=4 ttl=64 time=0.103 ms

--- x.x.x.229 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.102/0.107/0.117/0.006 ms

$ ping -c 4 -W 5 x.x.x.193
PING x.x.x.193 (x.x.x.193) 56(84) bytes of data.

--- x.x.x.193 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3007ms

$ ping -c 4 -W 5 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3023ms

Virtualbox에서는 VM의 가상 네트워크 인터페이스를 br0에 연결된 브리지 어댑터로 설정했습니다. eth0에도 연결을 시도했지만 눈에 띄는 차이는 없습니다.

고쳐 쓰다:

의견에서 제안한 대로 IP 전달을 활성화했습니다.

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
$ sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

또한 VirtualBox 네트워크 설정에서 무차별 모드를 활성화했지만 아무런 차이가 없다고 생각합니다.

나는 흥미로운 것을 발견했습니다. 네트워크(예: Google의 이름 서버)에서 무언가를 핑하면 첫 번째 핑에서는 응답을 받지만 후속 핑에서는 응답을 받지 못합니다.

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From y.y.y.241: icmp_seq=1 Redirect Host(New nexthop: y.y.y.y.241)
64 bytes from y.y.y.241: icmp_seq=1 ttl=54 time=5.97 ms
From y.y.y.241 icmp_seq=2 Destination Host Unreachable
From y.y.y.241 icmp_seq=3 Destination Host Unreachable
From y.y.y.241 icmp_seq=4 Destination Host Unreachable
From y.y.y.241 icmp_seq=5 Destination Host Unreachable
From y.y.y.241 icmp_seq=6 Destination Host Unreachable
From y.y.y.241 icmp_seq=7 Destination Host Unreachable
^C
--- 8.8.8.8 ping statistics ---
9 packets transmitted, 1 received, +6 errors, 88% packet loss, time 8041ms
rtt min/avg/max/mdev = 5.972/5.972/5.972/0.000 ms, pipe 3

IP 전달이 꺼지면 얻을 수 있는 것은 다음과 같습니다.

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 10000ms

이것은 가상 머신을 다시 시작한 후 처음으로 가상 머신에서 8.8.4.4를 핑할 때 호스트에서 IP 패킷을 스니핑했을 때 얻은 결과입니다. 동일한 IP 주소에 대한 후속 핑은 맨 아래 중복 행(처음 두 행 대신)만 제공합니다.

$ sudo tcpdump -q -c 10 -e -n host y.y.y.243
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:32:57.199202 c8:60:00:5e:bd:e0 > cc:e1:7f:07:e0:af, IPv4, length 98: y.y.y.243 > 8.8.4.4: ICMP echo request, id 1060, seq 1, length 64
12:32:57.204498 cc:e1:7f:07:e0:af > c8:60:00:5e:bd:e0, IPv4, length 98: 8.8.4.4 > y.y.y.243: ICMP echo reply, id 1060, seq 1, length 64
12:32:58.202555 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:32:59.201628 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:00.201652 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:01.201759 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:02.201502 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:03.201394 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:04.201706 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:05.201647 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
10 packets captured
11 packets received by filter
0 packets dropped by kernel

무엇이 그렇게 이상한 결과를 초래할 수 있습니까? 솔루션에 더 가까워지기 위해 또 무엇을 테스트할 수 있나요?

업데이트 2:

나는 지금 이 문제에 대해 매우 혼란스러워요. 해당 서브넷에 대한 경로가 제대로 작동하는지 확인하기 위해 네트워크에서 추가 서브넷(yyy241)에 있는 호스트의 IP 주소로 SSH를 통해 연결했습니다. 그런 다음 yyy243으로 ssh를 실행했고 아무 것도 얻지 못할 것이라고 예상했지만 놀랍게도 접속에 성공했습니다! 갑자기 모든 것이 예상대로 작동합니다. 8.8.8.8 및 기타 모든 항목에 대해 ping을 수행하고 모든 인터넷 호스트에 ssh를 보낼 수 있습니다. 이는 호스트 또는 가상 머신에서 아무런 조치도 취하지 않은 후입니다.

물론 나는 옳은 일을 했습니다. 나는 과학의 이름으로 그것을 깨뜨렸습니다. 무엇이 작동하는지 알아내야 해요! 따라서 호스트 시스템에서 다음을 수행하십시오.

sudo sysctl -w net.ipv4.ip_forward=0

분명히 다시 활성화했습니다.

sudo sysctl -w net.ipv4.ip_forward=1

물론 위의 상황으로 돌아갔습니다. 가상 머신은 호스트 머신을 제외하고 접속할 수 없습니다. 가상 머신에서 인터넷 호스트를 ping하면 첫 번째 응답을 받고 그 다음에는 아무것도 얻지 못합니다.

이제 정말 당황스러운 점은 몇 시간 동안 그대로 두었다가 다시 돌아왔을 때 호스트나 가상 머신에 아무 작업도 하지 않았다는 점을 강조합니다. 마술처럼 작동했습니다. 나는 마술을 좋아하지 않습니다. 저는 과학자이고 작동하거나 작동하지 않는 것을 좋아합니다. 전자를 선호합니다. 이렇게 이상한 지연이 발생할 수 있는 원인을 아는 사람이 있습니까?

관련 정보