Як я можу використовувати Linux як шлюз?


16

ПРИМІТКА. Якщо клієнтські пристрої ( computer Bу цьому прикладі) хочуть отримати Інтернет через шлюзовий комп'ютер, можливо, їм все-таки потрібно налаштувати роздільну здатність сервера імен. Це не пояснено тут (шлюз не обов'язково обслуговує Інтернет).

Я намагаюся зрозуміти основи маршрутизації мереж.
Тож я експериментую зі своєю локальною мережею (мені зараз не потрібен Інтернет, а лише мережа зв'язку).

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

Це так:

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 підключається (пінг, SSH ... і т.д.) між ними .
Комп'ютер B не може дістатися до маршрутизатора для комп'ютера А.

Я думав, що просто додавання на комп'ютер B комп'ютера як шлюз за замовчуванням та активація переадресації 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

А на комп’ютері A (проміжний шлюз):

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

(Немає відповіді на отримання ping)

Це правильна процедура, щоб змусити комп'ютер під управлінням 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

Скористайтеся цією таблицею пошуку, яку ми мали раніше, щоб побачити, чи пакет, що надходить на зовнішній інтерфейс, насправді належить до з'єднання, яке вже було ініційовано з внутрішнього.


Справді, стисле пояснення. Чи повинні всі блоки коду виконуватись на комп’ютері A?
Sopalajo de Arrierez

@SopalajodeArrierez Так, всі вони виконуються на "шлюзі" комп'ютера. Системі B не потрібно нічого знати про маршрутизацію, окрім як якщо вона хоче дійти до будь-якої іншої машини, вона надсилає пакети до B (це GW за замовчуванням).
користувач1794469

Тестовано на Ubuntu v14 на робочому столі та Ubuntu v12 на Utilite Pro (вбудований пристрій від CompuLabs). Дуже дякую вам за розширення того, що саме робить кожен рядок. Я дослідив і знайшов багато давно-довгих пояснень, які не спрацювали. Я сподіваюся, що ця нитка запитань-відповідей може бути корисною для інших у майбутньому.
Sopalajo de Arrierez

@ 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).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.