Назад | Перейти на главную страницу

Как заставить виртуальную машину linux работать как роутер

У меня есть доступ к учетной записи openstack, где я могу создавать виртуальные машины Linux 14.04. Я создал два сетевых интерфейса.

  1. "общедоступная сеть", подключенная к Интернету через маршрутизатор.

  2. "private-net", не доступный в Интернет

Теперь я создал одну виртуальную машину с именем «GATEWAY», которая подключена к обоим сетевым интерфейсам и имеет два интернет-адреса на eth0 (10.70.0.6) и eth1 (10.90.0.1). eth0 доступен в Интернете, а eth1 - для частной сети. Виртуальная машина GATEWAY имеет публичный IP-адрес на eth0.

Теперь я создал еще одну виртуальную машину с именем «AGENT» на интерфейсе частной сети. IP-адрес - 10.90.0.7, а шлюзом по умолчанию - 10.90.0.1 (машина GATEWAY vm)

Поскольку частная виртуальная машина не связана с каким-либо маршрутизатором, у нас не может быть доступа к виртуальной машине через Интернет. Чтобы включить доступ в Интернет, я добавил правило NAT на шлюз vm, как показано ниже:

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Это изменит адрес источника всех интернет-пакетов, покидающих ШЛЮЗ хоста, как адрес машины ШЛЮЗА. Кроме того, установите пересылку пакетов ipv4 = 1 на машине GATEWAY.

Я могу пропинговать любой внешний адрес с машины GATEWAY, но не с машины внутреннего агента. Не говоря уже о том, что у этой частной машины АГЕНТА нет доступа в Интернет.

Может ли кто-нибудь помочь мне настроить виртуальную машину шлюза таким образом, чтобы я мог использовать ее в качестве маршрутизатора и обеспечить доступ в Интернет к частным машинам.

Вот как выглядит моя таблица маршрутизации на машине AGENT:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.90.0.1       0.0.0.0         UG    0      0        0 eth0
10.90.0.0       0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.169.254 10.90.0.2       255.255.255.255 UGH   0      0        0 eth0
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

Здесь я добавляю свой tcpdump для пинга icmp на обоих интерфейсах.

eth1: интерфейс для подключения к частной сети.

18:43:39.309771 IP host-10-90-0-7.openstacklocal > 172.217.3.14: ICMP echo request, id 2395, seq 1, length 64
18:43:39.355430 IP 172.217.3.14 > host-10-90-0-7.openstacklocal: ICMP echo reply, id 2395, seq 1, length 64
18:43:40.318637 IP host-10-90-0-7.openstacklocal > 172.217.3.14: ICMP echo request, id 2395, seq 2, length 64
18:43:40.364178 IP 172.217.3.14 > host-10-90-0-7.openstacklocal: ICMP echo reply, id 2395, seq 2, length 64

eth0: интерфейс подключения к Интернету.

18:43:39.309796 IP host-10-70-0-6.openstacklocal > 172.217.3.14: ICMP echo request, id 2395, seq 1, length 64
18:43:39.355396 IP 172.217.3.14 > host-10-70-0-6.openstacklocal: ICMP echo reply, id 2395, seq 1, length 64
18:43:40.318679 IP host-10-70-0-6.openstacklocal > 172.217.3.14: ICMP echo request, id 2395, seq 2, length 64
18:43:40.364154 IP 172.217.3.14 > host-10-70-0-6.openstacklocal: ICMP echo reply, id 2395, seq 2, length 64
18:43:41.326618 IP host-10-70-0-6.openstacklocal > 172.217.3.14: ICMP echo request, id 2395, seq 3, length 64

Здесь я вижу, что ответ на пинг поступает с внешнего адреса и перемещается по обоим интерфейсам. Несмотря на то, что eth1 получает его на частную виртуальную машину, он говорит, что ping потерял 100% пакетов.

---------     -------------------                                            -------------                                                      ------------
INTERNET |----| openstack-router| --10.70.0.1 --------10.70.0.6(NIC eth0) --| GATEWAY-VM |-- 10.90.0.1(NIC eth1) ---------10.90.0.7(NIC eth0) --| AGENT-VM |
---------     -------------------                                            -------------                                                      ------------ 

Вы на правильном пути со своими правилами брандмауэра. Я делаю все «по старинке» - пишу сценарий, помещаю его в / etc и вызываю из /etc/rc.local. Как бы вы ни любили это делать, вот что мне подходит.

Операционная система - это 64-разрядная версия Debian Jessie с помощью netinstall, при этом во время выполнения задачи выбираются только «стандартные системные утилиты», работающие в VirtualBox на рабочем столе Mint. Eth0 подключается к моей локальной сети через мостовой интерфейс и DHCP. Eth1 - это сторона LAN сети виртуальных машин, которые я использую для экспериментов. Скопируйте / вставьте скрипт брандмауэра в /etc/rc.firewall, сделайте его исполняемым и вызовите в /etc/rc.local.

#!/bin/bash
# copyright me, licensed to you freely
# a very simple set of iptables commands 
# to allow forwarding between ethernet
# devices

# make sure forwarding is enabled in the kernel
echo 1 > /proc/sys/net/ipv4/ip_forward

# where is iptables located?
iptables=`which iptables`

# flush all existing rules
$iptables -F

# this is for NAT
# enable masquerading
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# don't forward packets from off-lan to lan if
# they are a brand new connection being initiated
$iptables -A FORWARD -i eth0 -o eth1 -m state --state NEW -j REJECT

# if the packets come from off-lan but they are
# related to a connection that was established from
# within the lan, go ahead and forward them
$iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

# whatever traffic comes from the lan to go to
# the world allow thru
$iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Когда все будет сделано и запущено, вы увидите что-то вроде

root@router:~# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 08:00:27:e6:43:df  
          inet addr:192.168.1.126  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fee6:43df/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:729 errors:0 dropped:0 overruns:0 frame:0
          TX packets:382 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:61777 (60.3 KiB)  TX bytes:46468 (45.3 KiB)

root@router:~# ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 08:00:27:af:50:e2  
          inet addr:10.99.99.1  Bcast:10.99.99.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:feaf:50e2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:828 (828.0 B)

root@router:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
10.99.99.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
root@router:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere             state NEW reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
root@router:~# cat /proc/sys/net/ipv4/ip_forward
1
root@router:~#