데이터 센터에 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하면 첫 번째 응답을 받고 그 다음에는 아무것도 얻지 못합니다.
이제 정말 당황스러운 점은 몇 시간 동안 그대로 두었다가 다시 돌아왔을 때 호스트나 가상 머신에 아무 작업도 하지 않았다는 점을 강조합니다. 마술처럼 작동했습니다. 나는 마술을 좋아하지 않습니다. 저는 과학자이고 작동하거나 작동하지 않는 것을 좋아합니다. 전자를 선호합니다. 이렇게 이상한 지연이 발생할 수 있는 원인을 아는 사람이 있습니까?