Маршрутизировать весь трафик машины через другую в подсети?

У меня есть два компьютера, оба работают с 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 не имеет доступа к Интернету !!

У вас есть есть ли какие-либо идеи о проблеме и решении?

Изменить 1

топология по умолчанию подсети такая:

|--------------| | Comp C | |----------| eth0 |----------| en0| |----------| | | CompA |--------| switch |---------| | VM B | | |----------| |-----|----| | |----------| | | |--------------| | ( Internet ) ( )

update

компьютер 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
1
задан 24 April 2017 в 13:42

4 ответа

У вас есть три интерфейса на компьютере 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 ACCEPT

sudo 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, но он немного мешает на третьем уровне.

1
ответ дан 18 July 2018 в 14:26

Проблема решена, когда машина 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:)

0
ответ дан 18 July 2018 в 14:26

У вас есть три интерфейса на компьютере 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 ACCEPT

sudo 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, но он немного мешает на третьем уровне.

1
ответ дан 24 July 2018 в 20:23

Проблема решена, когда машина 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:)

0
ответ дан 24 July 2018 в 20:23

Другие вопросы по тегам:

Похожие вопросы: