Маршрутизировать весь трафик машины через другую внутри подсети?
У меня есть два компьютера, оба работают под управлением Ubuntu 12.04 64 бит. Мне нужно направить трафик одного компьютера через другой.
computer A: 192.168.1.3 (eth0)
computer B: 192.168.1.7 (eth0), 192.168.1.5 (eth1), 192.168.1.6 (eth2)
Мне нужны эти три интерфейса в компьютере B, чтобы провести мои последние эксперименты...
КСТАТИ компьютер B работает на виртуальной машине на отдельном хосте.
Я изменяю стандартное значение gw компьютера A следующим образом:
sudo sudo ip route del
sudo ip route add default via 192.168.1.6
вот вывод route -n
в компьютере А:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.6 0.0.0.0 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
Также я запускаю этот скрипт на компьютере B:
#!/bin/bash
IF="eth2"
ADDR="192.168.1.3"
sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_dynaddr'
sudo iptables -P FORWARD DROP
sudo iptables -F FORWARD
sudo iptables -t nat -F
sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT
sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s $ADDR -j MASQUERADE
После этих инструкций компьютер А не имеет доступа к Интернету!!
Есть ли у вас какие-либо идеи о проблеме и решении?
Редактировать 1
топология по умолчанию для подсети выглядит следующим образом:
|--------------|
| Comp C |
|----------| eth0 |----------| en0| |----------| |
| CompA |--------| switch |---------| | VM B | |
|----------| |-----|----| | |----------| |
| |--------------|
|
( Internet )
( )
Обновить
компьютер A:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.2 0.0.0.0 UG 0 0 0 eth0.100
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0.100
виртуальная машина B:
eth0
подключен через нац.
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.233.2 0.0.0.0 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
172.16.233.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1
192.168.2.0 0.0.0.0 255.255.255.0 U 1 0 0 eth2
2 ответа
У вас есть три интерфейса на компьютере B, которые имеют адреса из одной подсети (192.168.1.0/24, я прав?).
Посмотрите на некоторые из ваших правил iptables:
sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT
- это правило гласит, что вы разрешаете прокладывать маршрут изeth2
вeth2
когда приходит пакет192.168.1.3
(без информации о сетевой маске). Это правило совершенно бессмысленно.sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT
- почти так же, как и выше.Вы устанавливаете правило по умолчанию для цепочки
iptables -F INPUT ACCEPT
а затем удалитьiptables -F INPUT
,
Итак, что я рекомендую:
На компьютере B все три интерфейса должны иметь адреса из разных сетей. Если они нужны вам в одной сети, лучше их соединить (создать "мультиинтерфейс", который объединяет три из них с одним IP-адресом).
Узнайте больше о iptables и попытайтесь понять это. Это довольно просто. Например, если у вас есть сеть 192.168.1.0/24, которая соединяет компьютеры A и B, самый простой способ - сделать NAT таким (компьютер B):
iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.1.0/24 -j MASQUERADE iptables -A FORWARD -s 192.168.1.0/24 -d 0/0 -j ПРИНЯТЬ iptables -A FORWARD -s 0/0 -d 192.168.1.0/24 -j ПРИНЯТЬ
- Или самый простой способ - соединить все интерфейсы на компьютере B. Тогда вам не нужно использовать NAT.
Обновление после продления вопроса
Ваша сетевая архитектура на самом деле не работает так, как вы хотите. Компьютер A должен быть подключен к компьютеру C через отдельную сеть, а не сеть, соединяющую компьютер C со шлюзом (Интернет). Но у вас есть два решения.
"Элегантный путь"
Требуется, чтобы коммутатор был прозрачным для кадров Ethernet с тегами vlan (поскольку я полагаю, что у вас нет управляемого коммутатора с возможностью маркировать порты). Если ваш коммутатор поддерживает 802.1q, он должен работать так.
Вы должны создать интерфейсы VLAN на компьютерах A и C. Например,
sudo vconfig add eth0 100
, Эта команда создаст интерфейс с тегом eth0.100. На компьютере С выполните командуsudo vconfig add en1 100
, У вас будет интерфейс en1.100. В настройках виртуальной машины вам нужно соединить виртуальный интерфейс ethX с en1.100. Не назначайте IP-адрес для en1.100 (компьютер C) - он не нужен.Установите адреса из одной сети на eth0.100 (компьютер A) и ethX (виртуальная машина B). Допустим, это будут 192.168.2.1/24 (компьютер A) и 192.168.2.2/24 (виртуальная машина B).
Виртуальная машина B должна иметь еще один интерфейс, который будет подключен к en1 на компьютере C (интерфейс без тегов). Допустим, у него есть адрес 192.168.1.3/24.
Теперь вам нужно настроить NAT на виртуальной машине C:
iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.2.0/24 -j MASQUERADE iptables -A FORWARD -s 192.168.2.0/24 -d 0/0 -j ПРИНЯТЬ iptables -A FORWARD -s 0/0 -d 192.168.2.0/24 -j ПРИНЯТЬ
- И добавьте шлюз по умолчанию на компьютере A:
route add default gw 192.168.2.2
Он должен работать.
Грязный путь Вы можете попробовать грязный путь. Это не требует vlans, но это делает небольшой беспорядок на 3-м слое.
Компьютер A имеет интерфейс eth0 с адресом 192.168.2.1/24.
Виртуальная машина B имеет два интерфейса ethX и ethY. Оба подключены к en1 (на компьютере C) в настройках виртуальной машины.
Интерфейс ethX имеет адрес 192.168.2.2/24. Интерфейс ethY имеет адрес 192.168.1.3/24.
Применяйте те же команды, что и в пунктах 4 и 5 элегантного способа.
Это также должно работать.
Проблема вашего решения заключалась в том, что вы пытались перенаправить трафик из одной и той же сети в одну и ту же сеть. Вы можете маршрутизировать трафик только между двумя логическими IP-сетями (не из одного диапазона адресов). Если вам нужна маршрутизация, вам нужно иметь две разные сети - в данном случае 192.168.1.0/24 (существующая сеть) и 192.168.2.0/24 (сеть, соединяющая компьютер A и виртуальную машину B).
Проблема решается, когда машина B помещается в одну реальную машину вместо виртуальной машины. После этого eth0.1 с ip-адресом 192.168.2.2 создается на машине A, а eth0.1 с ip-адресом 192.168.2.1 создается на машине B.
Установите шлюз по умолчанию на компьютере A:
sudo route del default gw 192.168.1.1
sudo route add default gw 192.168.2.1
и запустите эту инструкцию на машине B:
sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.2.0/24 -j MASQUERADE
iptables -A FORWARD -s 192.168.2.0/24 -d 0/0 -j ACCEPT
iptables -A FORWARD -s 0/0 -d 192.168.2.0/24 -j ACCEPT
Теперь трафик машины A правильно маршрутизируется с машины B. Большое спасибо за ваши руководства @Krzysztof Sawicki:)