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

У меня есть два компьютера, обе рабочей человечности 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 компьютера подобное это:

sudo sudo ip route del
sudo ip route add default via 192.168.1.6

вот вывод route -n в компьютере A:

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 )
                          (        )

обновление

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

2 ответа

У вас есть три интерфейса на компьютере B, которые имеют адреса из одной подсети (192.168.1.0/24, я прав?).

Посмотрите на некоторые из ваших правил iptables:

  1. sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT - это правило говорит, что вы разрешаете маршрутизировать от eth2 до eth2, когда пакет приходит из 192.168.1.3 (без информации о сетевой маске). Это правило совершенно бессмысленно.

  2. sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT - почти так же, как указано выше.

  3. Вы устанавливаете правило по умолчанию для цепочки iptables -F INPUT ACCEPT, а затем удаляете iptables -F INPUT.

Итак, что я рекомендую:

  1. На компьютере B все три интерфейса должны иметь адреса из разных сетей. Если они нужны вам в одной и той же сети, лучше их соединить (создать «мультиинтерфейс», объединяющий всех трех с одним IP-адресом).

  2. Узнайте больше о 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 ACCEPT
iptables -A FORWARD -s 0/0 -d 192.168.1.0/24 -j ACCEPT
  1. Или самый простой способ - соединить все интерфейсы на компьютере B. Тогда вам не нужно использовать NAT.

Обновление после расширения вопроса

Ваша сетевая архитектура на самом деле не работает так, как вы хотите. Компьютер A должен быть подключен к компьютеру C через отдельную сеть, а не сеть, соединяющую компьютер C со шлюзом (Интернет). Но у вас есть два решения.

«Элегантный способ»

Требуется, чтобы коммутатор был прозрачным для кадров Ethernet с тегами vlan (потому что, я полагаю, у вас нет управляемого коммутатора с возможностью маркировать порты) , Если ваш коммутатор поддерживает 802.1q, он должен работать следующим образом.

  1. Вы должны создать интерфейсы VLAN на компьютерах A и C. Например, sudo vconfig add eth0 100. Эта команда создаст интерфейс с тегом eth0.100. На компьютере С выполните команду sudo vconfig add en1 100. У вас будет интерфейс en1.100. В настройках виртуальной машины вам нужно соединить виртуальный интерфейс ethX с en1.100. Не назначайте IP-адрес для en1.100 (компьютер C) - он не нужен.

  2. Установить адреса из одной сети на eth0.100 (компьютер A) и ethX (виртуальная машина B). Допустим, это будут 192.168.2.1/24 (компьютер A) и 192.168.2.2/24 (виртуальная машина B).

  3. Виртуальная машина B должна иметь еще один интерфейс, который будет подключен к en1 на компьютере C (интерфейс без тегов). Допустим, он имеет адрес 192.168.1.3/24.

  4. Теперь вам нужно настроить 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 ACCEPT
iptables -A FORWARD -s 0/0 -d 192.168.2.0/24 -j ACCEPT
  1. и добавить шлюз по умолчанию на компьютере A:
[ 112]

Это должно работать.

Грязный путь Вы можете попробовать грязный путь. Это не требует vlans, но это делает небольшой беспорядок на 3-м слое.

  1. Компьютер A имеет интерфейс eth0 с адресом 192.168.2.1/24.

  2. Виртуальная машина B имеет два интерфейса ethX и ethY. Оба подключены к en1 (на компьютере C) в настройках виртуальной машины.

  3. Интерфейс ethX имеет адрес 192.168.2.2/24. Интерфейс ethY имеет адрес 192.168.1.3/24.

  4. Применять те же команды, что и в пунктах 4 и 5 элегантного способа.

Это также должно работать.

Проблема вашего решения состояла в том, что вы пытались перенаправить трафик из той же сети в ту же сеть. Вы можете маршрутизировать трафик только между двумя логическими IP-сетями (не из одного диапазона адресов). Если вам нужна маршрутизация, вам нужно иметь две разные сети - в данном случае 192.168.1.0/24 (существующая сеть) и 192.168.2.0/24 (сеть, соединяющая компьютер A и виртуальную машину B).

1
ответ дан 7 December 2019 в 15:37

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

0
ответ дан 7 December 2019 в 15:37

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

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