У меня есть два компьютера, оба работают с 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, чтобы запустить мои заключительные эксперименты ...
BTW компьютер B работает на виртуальной машине на отдельном хосте.
Я меняю значение по умолчанию gw компьютера A следующим образом:
sudo sudo ip route del
sudo ip route add default via 192.168.1.6
здесь вывод route -n на компьютере A: [ ! d4] 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
После этих инструкций компьютер A не имеет доступа к Интернету !!
У вас есть есть ли какие-либо идеи о проблеме и решении?
топология по умолчанию подсети такая:
|--------------|
| 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 подключена через nat.
$ 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
У вас есть три интерфейса на компьютере 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.Итак, что я рекомендую:
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 --source $ADDR -j ACCEPT - это правило говорит, что вы разрешаете маршрут от eth2 до eth2, когда пакет поступает из 192.168.1.3 (без информации о сетевой маске).
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 ACCEPT iptables -A FORWARD -s 0/0 -d 192.168.1.0/24 -j ACCEPTsudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT - это правило говорит, что вы разрешаете маршрут от eth2 до eth2, когда пакет поступает из 192.168.1.3 (без информации о сетевой маске). Это правило совершенно бессмысленно.
Узнайте больше об iptables и попытайтесь понять это. Это довольно просто. Например, если у вас сеть 192.168.1.0/24, которая соединяет компьютеры A и B, самый простой способ - сделать NAT таким (компьютер B):
Обновить после вопроса, расширяющего
Сетевая архитектура, на которой вы работаете, на самом деле не работает так, как вы хотите. Компьютер A должен быть подключен к компьютеру C через отдельную сеть, чем сетевой компьютер C с шлюзом (Интернет). Но у вас есть два решения.
Обновление после вопроса продления
Вам необходимо создать интерфейсы vlan на компьютерах A и C. Например sudo vconfig add eth0 100. Эта команда создаст тегированный интерфейс eth0.100. На компьютере C выполните команду sudo vconfig add en1 100. У вас будет интерфейс en1.100. В настройках виртуальной машины вам необходимо подключить виртуальный интерфейс ethX с en1.100. Не назначайте IP-адрес для en1.100 (компьютер C) - он не нужен. sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT - почти то же, что и выше.sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT - почти то же, что и выше.
Вы устанавливаете правило по умолчанию для цепочки iptables -F INPUT ACCEPT и затем удалите iptables -F INPUT. 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 Вам необходимо создать интерфейсы vlan на компьютерах A и C. Например sudo vconfig add eth0 100. Эта команда создаст тегированный интерфейс eth0.100. На компьютере C выполните команду sudo vconfig add en1 100. У вас будет интерфейс en1.100. В настройках виртуальной машины вам необходимо подключить виртуальный интерфейс ethX с en1.100. Не назначайте какой-либо IP-адрес для en1.100 (компьютер C) - он не нужен. route add default gw 192.168.2.2Требуется, чтобы коммутатор был прозрачным для vlan-тегов с сетью Ethernet (beacause, я полагаю, у вас нет управляемого коммутатора с возможностью отмечать порты). Если ваш коммутатор поддерживает 802.1q, он должен работать именно так.
Виртуальная машина B должна иметь еще один интерфейс, который будет подключен к en1 на компьютере C (непомеченный интерфейс). Предположим, у него есть адрес 192.168.1.3/24.
Вам необходимо создать интерфейсы vlan на компьютерах A и C. Например sudo vconfig add eth0 100. Эта команда создаст тегированный интерфейс eth0.100. На компьютере C выполните команду sudo vconfig add en1 100. У вас будет интерфейс en1.100. В настройках виртуальной машины вам необходимо подключить виртуальный интерфейс ethX с en1.100. Не назначайте какой-либо IP-адрес для en1.100 (компьютер C) - он не нужен.
sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT - почти то же, что и выше.
Вы устанавливаете правило по умолчанию для цепочки iptables -F INPUT ACCEPT, а затем удаляете iptables -F INPUT.
Применять те же команды, что и в пунктах 4 и 5 изящного способа.Он должен работать.
Грязный путь Вы можете попробовать грязный путь. Он не требует vlans, но он немного мешает на третьем уровне.
Проблема решена, когда машина B помещается в одну реальную машину вместо виртуальной машины. После этого eth1.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:)
У вас есть три интерфейса на компьютере 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.Итак, что я рекомендую:
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 --source $ADDR -j ACCEPT - это правило говорит, что вы разрешаете маршрут от eth2 до eth2, когда пакет поступает из 192.168.1.3 (без информации о сетевой маске).
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 ACCEPT iptables -A FORWARD -s 0/0 -d 192.168.1.0/24 -j ACCEPTsudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT - это правило говорит, что вы разрешаете маршрут от eth2 до eth2, когда пакет поступает из 192.168.1.3 (без информации о сетевой маске). Это правило совершенно бессмысленно.
Узнайте больше об iptables и попытайтесь понять это. Это довольно просто. Например, если у вас сеть 192.168.1.0/24, которая соединяет компьютеры A и B, самый простой способ - сделать NAT таким (компьютер B):
Обновить после вопроса, расширяющего
Сетевая архитектура, на которой вы работаете, на самом деле не работает так, как вы хотите. Компьютер A должен быть подключен к компьютеру C через отдельную сеть, чем сетевой компьютер C с шлюзом (Интернет). Но у вас есть два решения.
Обновление после вопроса продления
Вам необходимо создать интерфейсы vlan на компьютерах A и C. Например sudo vconfig add eth0 100. Эта команда создаст тегированный интерфейс eth0.100. На компьютере C выполните команду sudo vconfig add en1 100. У вас будет интерфейс en1.100. В настройках виртуальной машины вам необходимо подключить виртуальный интерфейс ethX с en1.100. Не назначайте IP-адрес для en1.100 (компьютер C) - он не нужен. sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT - почти то же, что и выше.sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT - почти то же, что и выше.
Вы устанавливаете правило по умолчанию для цепочки iptables -F INPUT ACCEPT и затем удалите iptables -F INPUT. 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 Вам необходимо создать интерфейсы vlan на компьютерах A и C. Например sudo vconfig add eth0 100. Эта команда создаст тегированный интерфейс eth0.100. На компьютере C выполните команду sudo vconfig add en1 100. У вас будет интерфейс en1.100. В настройках виртуальной машины вам необходимо подключить виртуальный интерфейс ethX с en1.100. Не назначайте какой-либо IP-адрес для en1.100 (компьютер C) - он не нужен. route add default gw 192.168.2.2Требуется, чтобы коммутатор был прозрачным для vlan-тегов с сетью Ethernet (beacause, я полагаю, у вас нет управляемого коммутатора с возможностью отмечать порты). Если ваш коммутатор поддерживает 802.1q, он должен работать именно так.
Виртуальная машина B должна иметь еще один интерфейс, который будет подключен к en1 на компьютере C (непомеченный интерфейс). Предположим, у него есть адрес 192.168.1.3/24.
Вам необходимо создать интерфейсы vlan на компьютерах A и C. Например sudo vconfig add eth0 100. Эта команда создаст тегированный интерфейс eth0.100. На компьютере C выполните команду sudo vconfig add en1 100. У вас будет интерфейс en1.100. В настройках виртуальной машины вам необходимо подключить виртуальный интерфейс ethX с en1.100. Не назначайте какой-либо IP-адрес для en1.100 (компьютер C) - он не нужен.
sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT - почти то же, что и выше.
Вы устанавливаете правило по умолчанию для цепочки iptables -F INPUT ACCEPT, а затем удаляете iptables -F INPUT.
Применять те же команды, что и в пунктах 4 и 5 изящного способа.Он должен работать.
Грязный путь Вы можете попробовать грязный путь. Он не требует vlans, но он немного мешает на третьем уровне.
Проблема решена, когда машина B помещается в одну реальную машину вместо виртуальной машины. После этого eth1.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:)