Использование нескольких IP-адресов, предоставленных провайдером
Это немного сложно, так что терпите меня. У меня есть довольно хорошие практические знания в области ИС, но я ищу помощь в наилучшем способе реализации этого.
Мой провайдер дал мне блок статических IP-адресов, а также один IP-адрес. Ради конфиденциальности вот схема сети, которую я буду использовать в моих примерах:
- 192.168.1.0/24 - LAN
- 172.16.0.1/30 - один статический IP, по умолчанию gw 172.16.0.2
- 172.16.1.1-5 / 28 - диапазон статических IP-адресов, по умолчанию gw 172.16.1.6
В этих примерах 172.16.0.1 и 172.16.1.1-5 в действительности являются интернет-IP-адресами с возможностью глобальной маршрутизации. Я использую частные блоки IP для конфиденциальности. Итак, представьте, что 172.16.0.1 - это любой публичный IP-адрес, который вы хотите представить, и тот же для блока 172.16.1.1.
Мой сервис предоставляется через единый интерфейс кабельного модема с одним портом Ethernet. Другими словами, все переключение, маршрутизация и т. Д. Должны выполняться на стороне клиента.
В настоящее время у меня есть сервер Linux с двумя интерфейсами Ethernet. Он назначен 172.16.0.1 статическим и использует NAT для предоставления Интернета интерфейсу ЛВС, что прекрасно работает. Я использовал эту настройку в течение многих лет, чтобы предоставить мне маршрутизатор NAT, над которым у меня гораздо более глубокий контроль, чем у стандартного маршрутизатора.
Теперь я хочу начать использовать те другие статические IP-адреса, которые у меня есть. Уловы эти:
Я все еще хочу иметь возможность, по крайней мере, до некоторой степени контролировать доступ к этим ящикам. Итак, на главном Linux-боксе я бы хотел сказать, что "172.16.1.1 не может принимать никакие входящие соединения, кроме как через порт 80", или "172.16.1.2 не может подключаться ни к чему, кроме порта 22". Просто несколько примеров. Другими словами, я все еще хочу, чтобы брандмауэр контролировал эти ящики. Подобно тому, как я могу в настоящее время использовать
iptables
заблокировать, скажем, 192.168.1.5 отправку куда-либо, кроме как туда, где я хочу, и в этом случае также подсчитывать входящие соединения. В идеале это означало бы, что я могу получить все пакеты, предназначенные для одной из пяти общедоступных статик, маршрутизируемых через iptables, и иметь такой же уровень контроля, как и для пакетов локальной сети.Компьютеры в локальной сети (192.168.1.0/24) могут также нуждаться в доступе к этим общедоступным компьютерам. Кроме того, компьютерам на общедоступной IPS может потребоваться доступ к компьютерам локальной сети. Таким образом, 172.16.1.2 может потребоваться доступ к 192.168.1.5 и наоборот.
Компьютеры, которые имеют статические маршрутизируемые IP-адреса, должны, если это вообще возможно, быть в курсе своих общедоступных IP-адресов. Одно из предложений, которое я увидел для этого, заключалось в том, чтобы подключать общедоступные компьютеры в локальной сети и назначать им адреса локальной сети, затем использовать множественную адресацию на компьютере с Linux и перенаправлять все порты с требуемого статического уровня на требуемый IP-адрес локальной сети. Это, конечно, работает, но создает некоторые беспорядочные ситуации - Linux-системе теперь нужно знать каждый статический IP-адрес, и, следовательно, это не будет хорошо масштабироваться. Так, например, "eth1" (интерфейс WAN) должен иметь не только IP-адрес, который он уже использует, но также и все пять других IP-адресов. Это может быть хорошо для пяти, но как насчет масштабируемости, когда в будущем будет 2000 IP-адресов....
Одна мысль, о которой я подумал, - добавить третий интерфейс к маршрутизатору Linux и настроить небольшую сеть, которая содержит только общедоступные машины. Единственный вопрос - маршрутизация между этими машинами и Интернетом. Вдобавок ко всему, единственный простой способ, которым я мог придумать, чтобы сделать это таким образом, это дать Linux-системе второй IP-адрес на eth2, который использовал бы одну из этих пяти драгоценных статик.
Я не хочу использовать какие-либо коммерческие решения для достижения этой цели. Я чувствую, что Linux должен справиться с такой ситуацией.
Я надеюсь, что этот макет сработает, но мне просто нужно выяснить, как сделать саму маршрутизацию в Linux.
3 ответа
Я наконец понял это, и в интересах всех остальных, стоит написать здесь.
Я собираюсь получить коробку с тремя интерфейсами Ethernet. Вот как мы их подключаем:
- eth0 -> к кабельному модему
- eth1 -> к коммутатору, на котором должны находиться компьютеры с общими адресами WAN
- eth2 -> к коммутатору для компьютеров локальной сети (NAT)
Мы устанавливаем мост Linux, используя bridge-utils (brctl), br0, который соединяет eth0 и eth1.
Затем мы можем дать интерфейсу br0 один из общедоступных IP-адресов. Это будет адрес, с которого будут приходить пакеты, приходящие с компьютеров локальной сети. Для лучшей безопасности я буду использовать iptables для блокировки ВСЕГО трафика, не являющегося NAT, на этот IP:
iptables -A INPUT d 172.16.0.1 -j DROP
Это работает, поскольку NAT-трафик будет передаваться по цепочке FORWARD, а незапрашиваемый интернет-трафик будет отображаться на входе.
Теперь на коммутаторе WAN я могу разместить другие хосты. Я перенесу свой основной сервер - веб-сервер и т. Д. - на этот коммутатор и статически назначу ему один из общедоступных IP-адресов с возможностью маршрутизации в мире.
Реальная причина, по которой это раньше не было для меня очевидным, заключалась в том, что я не думал, что смогу запустить брандмауэр на интерфейсе моста - я не осознавал, что пакеты моста действительно проходят через iptables. Оказывается, я не только могу это сделать, но я даже могу использовать такие хитрости, как ulogd и аналогичные инструменты, для мониторинга пропускной способности и так далее. Ключом к этому является модуль iptables под названием physdev
, который позволяет вам использовать брандмауэр в зависимости от физического интерфейса, в который входит или выходит пакет, независимо от мостовости интерфейсов.
Поэтому я мог бы добавить правила брандмауэра в таблицу FORWARD, например:
iptables -A FORWARD -d 172.16.1.2 -p tcp --dport 80 -m physdev --physdev-in eth0 -j ACCEPT
iptables -A FORWARD -d 172.16.1.2 -m physdev --physdev-in eth0 -j DROP
В конечном итоге это разрешает только трафик порта 80 на 172.16.1.2 из Интернета, даже если эта машина имеет публичный IP-адрес. (Помните, что в моих примерах 172.16.xx являются публичными, хотя в действительности мы все знаем, что это не так.)
Так как я использую physdev
это означает, что машины на стороне локальной сети могут иметь полный доступ к этому хосту. Так что со стороны локальной сети, я все еще могу SSH к 172.16.0.1. С точки зрения локальной сети, 172.16.0.1 вообще не имеет брандмауэра. С точки зрения другой машины DMZ, то же самое. Однако с точки зрения Интернета 172.16.0.1 заблокирован.
Решение найдено! Это оказалось действительно забавным проектом.
F
Если вы добавите третий интерфейс, подобный описанному выше, для создания DMZ, маршрутизация будет очень простой. буквально все, что вам нужно сделать, это включить IP-пересылку, и она будет пересылать пакеты между подключенными интерфейсами.
или
sysctl -w net.ipv4.ip_forward=1
или же
echo 1 > /proc/sys/net/ipv4/ip_forward
включить его на лету
или установить
net.ipv4.ip_forward=1
в /etc/sysctl.conf
Тогда вам просто потребуются правила брандмауэра для управления доступом к компьютерам Lan из DMZ, вы все равно будете использовать NAT от интерфейса Wan к интерфейсу LAN, вы будете полагаться на правила доступа Routing + для управления из WAN в DMZ и DMZ в ЛВС. Поскольку DMZ и GW по умолчанию для локальной сети - это одно и то же устройство, вам не придется ретранслировать статические маршруты на компьютерах DMZ или LAN, чтобы получить доступ друг к другу. Другой вариант - поместить 2 карты Ethernet в каждый узел DMZ и также подключить их к локальной сети, но это не так чисто, как использование маршрутизатора в середине и списков доступа (iptables) для определения того, о чем можно говорить.
Я полагаю, что функциональность, которую вы ищете, это "псевдонимы сети". Тогда вам нужно настроить "множественный NAT" для этих сетевых псевдонимов.
Я не знаю, что вы на самом деле используете на своем маршрутизаторе Linux, но если бы я мог предложить одно решение, просто установите "pfSense", который имеет много функций ( http://www.pfsense.org/index.php@option= com_content & task = view & id = 40 & Itemid = 43.html) или IPCop ( http://www.ipcop.org/), тогда администрирование намного проще, поскольку это графическое решение.
Это точно соответствует вашему варианту использования:
- http://www.youtube.com/watch?v=zrBr0N0WrTY
- http://www.ipcop.org/2.0.0/en/install/html/preparation-network-interfaces.html
Более того, он работает на действительно старом оборудовании.
Yann