Чтобы прояснить мой вопрос ...
Мне интересно, как ядро Linux маршрутизирует пакеты на многоквартирный дом хост?
Под словом «multi-home» я подразумеваю, что у хоста есть несколько сетевых адаптеров для отправки пакетов, например, мой Debian в Virtualbox имеет два сетевых адаптера.
eth0 обеспечивает поддержку NAT. Я не знаю, как Virtualbox это удается. Я имею в виду, что на моем хосте Windows нет виртуального сетевого адаптера с IP-адресом 10.0.2.x.
eth1 обеспечивает поддержку только для хоста. Я использую эту небольшую сеть, чтобы изучить протокол TCP / IP и провести несколько небольших экспериментов. Я вручную настраиваю его на IP-адрес 192.168.56.2, шлюз 192.168.56.1, последний IP-адрес является IP-адресом виртуального сетевого адаптера Virtualbox.
операционная система хоста Я использую ADSL для подключения к Интернету и получаю случайный IP-адрес, например, 118.249.xxx.113.
Так что вопрос выходит, как ядро linux маршрутизирует IP-пакеты? Я имею в виду, что если я выполнил следующие команды, я не смогу подключиться к Интернету.
ifup eth0
ifup eth1
пинг www.google.com
этот пинг не вернет ответа.
Так получается, что после настройки eth1 ядро будет использовать eth1 как дефолт Сетевая карта, которая находится в сети только для хоста, для отправки IP-пакетов? В результате в Debian я не могу подключиться к внешнему Интернету?
Другой простой вопрос так как eth1 теперь является сетевым адаптером по умолчанию, будет ли ядро Linux пытаться использовать сетевой адаптер eth1 для отправки пакетов, если eth0 не смог найти доступную запись маршрута?
Если будет, то как его настроить?
Вот моя сетевая конфигурация Debian Linux в Virtualbox.
eth0 Link encap:Ethernet HWaddr 08:00:27:ec:d9:bb
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:feec:d9bb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1690 errors:2 dropped:0 overruns:0 frame:0
TX packets:1129 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2276172 (2.1 MiB) TX bytes:62647 (61.1 KiB)
Interrupt:11 Base address:0xd020
eth1 Link encap:Ethernet HWaddr 08:00:27:ae:e1:69
inet addr:192.168.56.2 Bcast:192.168.56.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:feae:e169/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:48 errors:0 dropped:0 overruns:0 frame:0
TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5985 (5.8 KiB) TX bytes:1334 (1.3 KiB)
Interrupt:10 Base address:0xd240
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:560 (560.0 B) TX bytes:560 (560.0 B)
и таблица маршрутов следующая:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
0.0.0.0 192.168.56.1 0.0.0.0 UG 0 0 0 eth1
0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
У вас есть два маршрута по умолчанию. Я когда-либо использовал только по одному, но думаю, два не будут проблемой --- насколько мне известно, таблица маршрутизации отсортирована по специфичности (количество бит в маске подсети назначения по возрастанию) и возможно MTU (хотя я так не думаю в Linux). Затем будет использован первый соответствующий маршрут по умолчанию в отсортированном списке.
В любом случае попробуйте удалить один из маршрутов по умолчанию (route del ... как упоминали другие или ip route del ...).
В противном случае ... почему ваш пинг не получает ответа? Это похоже на проблему с брандмауэром. Возможно, Linux автоматически выполняет балансировку нагрузки / циклический перебор с двумя маршрутами по умолчанию, но я никогда не слышал, чтобы Linux делал это, и это может создать проблемы для некоторых протоколов, поэтому я сомневаюсь в этом.
Если у вас есть проблемы с маршрутизацией, пинг, вероятно, должен сказать «нет маршрута к хосту» или что-то в этом роде. Никакой ответ не отличается. Убедитесь, что ping определяет IP из имени хоста в порядке. Если нет, то проблема в DNS. Если это так, посмотрите на свой брандмауэр - iptables -L -n -v предоставит вам какие-либо правила и сколько раз они были сработаны. Если правило увеличивается так же часто, как ваши пинги, скорее всего, проблема в этом. В противном случае проверьте пакеты, отправляемые и входящие в машину, с помощью wirehark.
Ваш вопрос сбивает с толку, но позвольте мне попробовать.
Во-первых, если вы хотите иметь простой маршрутизатор NAT / маскарадинга, есть несколько простых адаптируемых руководств о том, как это сделать с помощью netfilter (iptables
). Включить такое поведение может быть обманчиво просто. Погуглите "linux nat" или "linux masquerade".
редактировать: добавление основных команд для хорошей меры. Убедитесь, что вы знаете, какой интерфейс какой!
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
/sbin/iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
В противном случае вы должны просто иметь возможность использовать команду route для удаления «лишних» шлюзов и принудительного вывода всего трафика через eth1, если это ваша цель (в этом сценарии вам не нужен eth0, если я вас правильно понимаю).
route del gw 10.0.2.2 eth0
Должен помочь в последнем сценарии. (Если я правильно вас понимаю, то, возможно, нет.)
Надеюсь, это поможет.
Я не уверен, что правильно понимаю проблему, но сделайте «echo 1> / proc / sys / net / ipv4 / ip_forward», чтобы включить маршрутизацию. Сделайте его постоянным, отредактировав /etc/sysctl.conf. Если для этого параметра установлено значение 1 (включено), Linux будет пересылать пакеты, полученные с одного интерфейса Ethernet, на другой - он будет действовать как маршрутизатор.
Если у вас есть машина с двумя домами - два способа выхода в Интернет - вы не можете использовать оба восходящих канала только с двумя установленными шлюзами по умолчанию ... Что вы можете сделать, так это выбрать основной шлюз по умолчанию, скажем 192.168.56.1 а затем выберите несколько сетей, которые вы хотите получить через вторичную ссылку:
ip route add default via 192.168.56.1
ip route add 221.x.x.x/24 via 10.10.10.2
ip route add 99.99.99.99/32 via 10.10.10.2
Итак, позвольте мне объяснить вам некоторые основы на вашем примере. У вас есть 2 Nics (виртуальные или неважные). Оба находятся в разных сетях. 10.0.2.0 и 192.168.56.0
Первые две записи в таблице маршрутизации показывают, что у них нет специального шлюза (0.0.0.0), а последний столбец показывает, к какому сетевому адаптеру они подключены.
Значит, в таблице маршрутизации есть ошибка. У вас есть две записи для шлюза по умолчанию. У вас может быть только один реальный шлюз по умолчанию. Обычно IP-пакеты отправляются на первый gw по умолчанию, найденный в таблице маршрутизации. (Я думаю, в вашем случае это не тот)
Я не знаю, как именно работает NAT (я когда-либо использовал мостовую сеть). Итак, у вас есть два варианта. Установите шлюз по умолчанию на IP-адрес вашего РЕАЛЬНОГО IP-адреса машины. Например. если ваша машина за пределами вашего виртуального бокса имеет IP 10.0.2.254, установите ваш шлюз по умолчанию на 10.0.2.254. (В NAT Enviroment вы должны настроить свою машину за пределами вашего виртуального бокса, чтобы поддерживать это, ipfilter должен быть настроен правильно, а маршрутизация пакетов между интерфейсами должна быть включена echo 1 > /proc/sys/net/ipv4/ip_forward
).
Если вы используете мостовую установку, ваш компьютер будет напрямую подключен к вашему маршрутизатору, который подключен к Интернету. Вам нужно только настроить IP-адрес этой сети и настроить шлюз по умолчанию для IP-адреса вашего маршрутизатора. например VBOX 10.0.2.2 ------- МАШИНА ВНЕ VBOX 10.0.2.254 ------ Маршрутизатор подключен к Интернету 10.0.2.1
Тогда ваш шлюз будет 10.0.2.1