Назад | Перейти на главную страницу

Несколько IP-адресов в одной подсети на одном хосте

Возможно ли (в действительности формулировка должна быть «Правильно ли») иметь несколько IP-адресов, принадлежащих одной подсети, на одном и том же хосте?

Вот пример:

#Host 1
eth0   -> 10.0.0.1/24
eth1   -> 10.0.0.2/24
eth1:1 -> 10.0.0.3/24

У меня есть интуиция, что это не может работать из-за проблем с маршрутизацией, но я не могу объяснить, почему я так думаю.

Так правильный ли этот образец? Если да, распространено ли это? Какие могут быть проблемы с такой конфигурацией?

Да, конечно, в этом буквально нет проблем - возможно, нужно быть немного осторожнее при настройке шлюза по умолчанию, но на самом деле это совсем не проблема. Если на самом деле время было, когда вам приходилось настраивать многосайтовые веб-серверы (мы говорим давно).

У меня где-то есть сложная установка, в которой используется этот тип сети. У меня есть два внутренних интерфейса и внешний интерфейс для выхода в Интернет. (это скоро изменится на два внешних интерфейса в разных подсетях и на внутренний интерфейс, разделенный на два внутренних интерфейса, но он идет по одному и тому же маршруту) В любом случае - к ответу!

скажем, у вас есть два внутренних интерфейса:

eth0 192.168.1.2
eth1 192.168.1.3

Вы используете внутренний восходящий канал к Интернету (маршрутизатор) на 192.168.1.1

Таким образом, ваша таблица маршрутизации по умолчанию будет выглядеть так (команда: netstat -rn)

Dest            Gw         Genmask   Flags  ... ... Iface

0.0.0.0     192.168.1.1    0.0.0.0    UG           eth0

192.168.1.0  0.0.0.0     255.255.255.0 U           eth0

192.168.1.0  0.0.0.0     255.255.255.0 U           eth1

Вот ваша проблема, весь вывод будет проходить через eth0 потому что это первое попадание в вашу таблицу маршрутизации. Поэтому, если вы используете другой компьютер (или даже тот же самый ящик) для проверки связи 192.168.1.3 (eth1) вы не получите ответа? Зачем? Потому что это исходит от 192.168.1.2.

Вам придется использовать iproute2 для настройки индивидуальных таблиц маршрутизации для каждого устройства. Таким образом, когда устройство получает что-то INPUT цепочка ответов через одно и то же устройство.

редактировать /etc/iproute2/rt_tables Добавить:

1  my_eth0

2  my_eth1 

затем выполните следующее:

ip route add 192.168.1.0/24 dev eth0 table my_eth0

ip route add default via 192.168.1.1 dev eth0 table my_eth0

ip route add 192.168.1.0/24 dev eth1 table my_eth1

ip route add default via 192.168.1.1 dev eth1 table my_eth1

Теперь добавьте правила для таблиц, которые будут использоваться, выполнив:

ip rule add from 192.168.1.2 table my_eth0

ip rule add from 192.168.1.3 table my_eth1

Это сообщит вашей системе, что когда она получит запрос на eth0 использовать my_eth0 таблица маршрутизации для ответа. Когда он получает запрос на eth1, ответьте, используя my_eth1 таблица маршрутизации. Когда вы получите команды, поместите их в свой /etc/rc.local файл и сделать rc.local исполняемый, выполнив sudo chmod u+x /etc/rc.local таким образом ваши маршруты не будут уничтожены при перезагрузке. Радоваться, веселиться!

Есть довольно распространенная проблема с ожиданиями людей в этом типе установки. Когда в одной подсети назначается несколько адресов, обычно все исходящая связь будет казаться приходящим с одного адреса.

Так что ответы на входящие соединения должны быть в порядке. Ответы должны приходить с адреса, на который было установлено входящее соединение. Но если вы ожидаете, что какой-то процесс, который будет устанавливать исходящие соединения, будет использовать определенный адрес, отличный от первого, вам нужно будет убедиться, что вы можете специально настроить привязку IP-адреса в приложении.

Это прекрасно, но делать это как есть - с более чем одним физическим интерфейсом в одной подсети, подключенным к одному коммутатору - не рекомендуется. Linux в целом нормально с этим справляется, но некоторым ОС (например, Solaris) это совсем не нравится.

Поместите все свои адреса на один физический интерфейс (eth0, eth0: 0, eth0: 1 и т. Д.) И подключите только его. Если вы хотите подключить несколько интерфейсов для повышения производительности, посмотрите на связывание, а затем перегрузите связанный интерфейс (bond0 , bond0: 0, bond0: 1 и так далее).

Нет, эта конфигурация не рекомендуется, несмотря на распространенное мнение.

Имея виртуальные интерфейсы (например: eth1: 1) в той же подсети, что и физическая (например: eth1), - очень распространенная и полезная конфигурация, не представляющая проблем.

Однако, имея разные физический интерфейс в одной и той же подсети (или, что еще хуже, в разных подсетях, но в том же широковещательном домене), может привести к проблемам из-за недетерминированных записей ARP. Это относится как минимум к Solaris и Linux. Если по какой-то причине вам все равно нужно это сделать, рекомендуется или требуется настроить поведение ARP, то есть отключить ARP на одном из интерфейсов или настроить ARP, чтобы ограничить его ответы с физического интерфейса на соответствующий IP-адрес (а). Найдите arp_filter в http://www.mjmwired.net/kernel/Documentation/networking/ip-sysctl.txt . Другой способ - установить маску сети на / 24 на всех интерфейсах, кроме одного.

В Solaris поддерживаемым способом настройки нескольких интерфейсов в одной подсети будет использование IPMP (IP-множественный путь).

Наконец, это ограничение не применяется, если физические интерфейсы не используют один и тот же стек IP (например, эксклюзивные IP-зоны Solaris) или изолированы с помощью тегов 802.1Q VLAN.

Это возможно. Раньше пользовался.

У меня есть приложение, которому необходимо использовать разные исходные IP-адреса при подключении к удаленному серверу. В моем случае это важно для преодоления ограничения на количество разрешенных подключений на IP-адрес, наложенного удаленным сервером.

Я настроил несколько IP-адресов на одном интерфейсе, и мое приложение было настроено на использование этих IP-адресов в циклическом режиме.

Да, это сработает.

Как указано в других ответах, настоящая цель этого заключается в обслуживании разных служб на разных IP-адресах.

Если у вас есть IIS и Apache на одном компьютере, и вы хотите запустить их оба на порту 80, вам нужно будет установить один на 10.0.0.1, а другой на 10.0.0.2, так как они оба не могут обслуживать порт 80 из тот же IP-адрес.

На самом деле это не вопрос маршрутизации, так как это может вступить в игру только на том компьютере, который выходит в сеть из общих программ, таких как веб-браузеры, ping и т. Д. В таких ситуациях он всегда будет использовать одно и то же адрес как его источник.

В таблице маршрутизации маршрут указывает интерфейс для использования, поэтому это будет тот адрес, который привязан к подходящему маршруту.

Я собираюсь сделать здесь небольшую оговорку. А именно, что обычные инструменты Linux доставят вам проблемы. Они вообще плохо справляются с несколькими интерфейсами. Для этого вам нужно будет использовать iproute2. Это менее распространенный инструмент, чем обычный метод ifconfig / route. Без него вы увидите странное и некорректное поведение, как будто одна сетевая карта отвечает на трафик другой.


- Кристофер Карел