Как я могу использовать Linux в качестве шлюза?

16

ПРИМЕЧАНИЕ. Если клиентские устройства ( computer Bв этом примере) хотят подключиться к Интернету через компьютер шлюза, возможно, им все равно необходимо настроить разрешение сервера имен. Это не объясняется здесь (шлюз не обязательно обслуживает Интернет).

Я пытаюсь понять основы маршрутизации сетей.
Поэтому я экспериментирую с локальной сетью (сейчас мне не нужен интернет, только связь по локальной сети).

Я знаю, что конфигурация сети довольно сложная вещь, но я просто пытаюсь заставить компьютер (скажем, A) выступать в качестве шлюза для другого (скажем, B) (оба работают под управлением Ubuntu Linux).
Мне нужно только B, чтобы быть в состоянии достичь маршрутизатора, который доступен только для A.

В этом случае:

Router for computer A  -->  192.168.0.1
Computer A - eth0      -->  192.168.0.2
Computer A - eth1      -->  192.168.1.1

Computer B - eth0      -->  192.168.1.2

Компьютер А нормально подключается к роутеру .
Компьютеры A и B нормально соединяются (ping, SSH ... и т. Д.) Между ними .
Компьютер B не может связаться с маршрутизатором для компьютера A.

Я думал, что простое добавление на B компьютера A в качестве шлюза по умолчанию и активация IP-пересылки на A сделает B доступным к маршрутизатору для A:

luis@ComputerB:~$ sudo route add default gw 192.168.1.1
luis@ComputerB:~$ sudo routel

target            gateway      source        proto    scope  dev   tbl
127.0.0.0         broadcast    127.0.0.1     kernel   link   lo    local
127.0.0.0 8       local        127.0.0.1     kernel   host   lo    local
127.0.0.1         local        127.0.0.1     kernel   host   lo    local
127.255.255.255   broadcast    127.0.0.1     kernel   link   lo    local
192.168.1.0       broadcast    192.168.1.2   kernel   link   eth0  local
192.168.1.2       local        192.168.1.2   kernel   host   eth0  local
192.168.1.255     broadcast    192.168.1.2   kernel   link   eth0  local
default           192.168.1.1                                eth0
169.254.0.0 16                                        link   eth0
192.168.1.0 24                 192.168.1.2   kernel   link   eth0

А на компьютере А (промежуточный шлюз):

root@ComputerA:~$ echo 1 > /proc/sys/net/ipv4/ip_forward

Компьютер B все еще может пропинговать компьютер A, но маршрутизатор для A не отвечает:

luis@ComputerB:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
^C

(Нет ответа на пинг)

Является ли это правильной процедурой, чтобы заставить компьютер под управлением Linux действовать в качестве шлюза для другого компьютера простым способом?

Сопалахо де Арриерес
источник

Ответы:

21

Вы почти там, вам просто нужно убедиться, что трафик возвращается к B. Прямо сейчас вы перенаправили трафик с B во внешний мир, но A не знает, как вернуть трафик к B. Вам нужно A, чтобы сохранить некоторое состояние о связи, проходящие через это. Для этого вам нужно включить NAT . У вас уже есть первый шаг, который разрешает пересылку. Затем вам нужно добавить несколько правил брандмауэра, используя iptables:

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

Это говорит: в таблице трансляции сетевых адресов, после того, как мы выяснили маршрутизацию пакета на выходе eth0 (внешний), замените информацию обратного адреса нашей собственной, чтобы возвращаемые пакеты приходили к нам. Кроме того, помните, что мы сделали это (как таблица поиска, которая запоминает это соединение).

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Разрешить пакетам, которые хотят прийти из eth1 (внутренний интерфейс), выйти из eth0 (внешний интерфейс).

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

Используйте эту таблицу поиска, которая у нас была раньше, чтобы увидеть, действительно ли пакет, поступающий на внешний интерфейс, относится к соединению, которое уже было инициировано из внутреннего.

user1794469
источник
Действительно, краткое объяснение. Должны ли все блоки кода выполняться на компьютере A?
Сопалахо де Арриерес
@SopalajodeArrierez Да, все они выполняются на компьютере «шлюза». Системе B не нужно ничего знать о маршрутизации, кроме того, что если она хочет связаться с любой другой машиной, она отправляет пакеты в B (это GW по умолчанию).
user1794469
Протестировано работает на Ubuntu v14 на настольном компьютере и Ubuntu v12 на Utilite Pro (встроенное устройство от CompuLabs). Большое спасибо за то, что вы подробно рассказали о том, что делает каждая строка. Я исследовал и нашел много длинных длинных объяснений, которые не работали. Я надеюсь, что эта ветка Вопрос-Ответ может быть полезна для других в будущем.
Сопалайо де Арриерес
@ user1794469 это то же самое, когда интерфейс шлюза является виртуальным, то есть интерфейс касания? Вы можете посмотреть здесь ?
Овен
1

Для правильной работы маршрутизации между двумя компьютерами Linux, выступающими в качестве шлюзов, необходимо сделать несколько вещей:

  • Оба шлюза должны иметь физическую связь друг с другом (или виртуальную, если вы связываете виртуальные машины).
  • Маршруты должны быть добавлены к обоим интерфейсам на маршрутизаторе.

    route add -net 192.168.0.0/24 gw 192.168.0.1
    route add -net 192.168.1.0/24 gw 192.168.1.1
    
  • Локальный шлюз должен быть указан для удаленной сети на обоих шлюзах. Это позволяет компьютерам в локальной сети знать, куда отправлять пакеты для удаленной сети. Шлюзом должен быть IP-адрес компьютера, который будет отправлять пакеты в удаленную сеть.

  • Компьютеры, желающие передавать трафик между сетями, также должны знать, какой локальный шлюз обрабатывает трафик в удаленную сеть и из нее. Обычно это делается через протокол динамического управления хостом (DHCP), однако, если вы собираетесь использовать отдельный шлюз для Интернета, вам нужно будет указать оба компьютера, которым требуется доступ к Интернету, и другую сеть (например, интернет-шлюз через DHCP и шлюз другой сети через маршрут).
  • Переадресация IP должна быть активной для обоих шлюзов.
  • IP-маскарадинг должен быть включен, чтобы позволить NAT функционировать между шлюзами.

    modprobe iptable_nat
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth1 -j ACCEPT
    

    Вам может потребоваться указать источник и назначение, так как вы используете один и тот же интерфейс для маскировки:

    iptables -t nat -A POSTROUTING -i eth0 -s 192.168.0.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
    

    и другой шлюз:

    iptables -t nat -A POSTROUTING -i eth1 -s 192.168.1.0/24 ! -d 192.168.0.0/24 -j MASQUERADE   
    

    Для каждого шлюза трафик локальной сети должен приниматься на соответствующем интерфейсе, например:

    iptables -A FORWARD -i eth0 -s 192.168.0.0/24 -j ACCEPT
    

    или

    iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT
    

Существует множество ссылок и похожих вопросов, на которые можно ссылаться для решения возникающих у вас проблем.

В данном конкретном случае неправильным является то, что на обоих компьютерах настройка маршрута и шлюза не завершена, а преобразование сетевых адресов (NAT) не было включено с помощью iptables, что позволяет шлюзам переносить запрос с компьютера в другой подсети. от их имени.

Это также важно при настройке интернет-соединения, так как вы несете ответственность за один конец соединения (например, используете компьютер Linux в качестве шлюза для соединения PPPoE).

Джон Петтит
источник