Возможно ли (в действительности формулировка должна быть «Правильно ли») иметь несколько 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. Без него вы увидите странное и некорректное поведение, как будто одна сетевая карта отвечает на трафик другой.
- Кристофер Карел