как получить не зависящий от провайдера IP-адрес для домашнего сервера?
Несколько лет назад я решил отказаться от использования внешних почтовых сервисов. Решил купить домен и настроить домашний сервер для приема всей моей корреспонденции. Работа была завершена очень быстро, и я получил свой работающий на домашнем сервере почтовый домен! Некоторое время все работало гладко и ничего не предвещало проблем. Я спокойно наслаждался полным контролем над потоками почты в мой ящик.
Но немного позже мой провайдер решил удешевить мой способ подключения (для себя) и назначить приватный IP-адрес для моего сервера
(192.168.192.2). Не сложно предположить, с этого момента мой почтовый сервер перестал быть доступен из реального мира и мой почтовый домен перестал функционировать.
Самым простым решением было бы переставить MX-записи моего домена на реальный мейл-сервер во внешней сети и использовать fetchmail или что-то похожее для доставки почты на домашний сервер. Но это решение не было достаточно гибким и я решил взять один из адресов, принадлежащих IP-пулу моего работодателя (я работаю на хостинговую компанию, и ее владелец разрешил построение описанной здесь конфигурации) и назначить его на мой домашний сервер, сделав его таким образом доступным для реального мира. Вы можете сказать: “Это невозможно! Нельзя назначить чужой реальный IP на интерфейс внутри приватной сети другого провайдера!”. Да, в общем случае это так и есть, но при помощи небольшой хитрости с использованием Linux policy routing и туннелирования это становится возможным. Эта статья расскажет вам, как это можно сделать.
Во-первых, я выбрал один из адресов (RE.AL.AD.DR) в сети моего работодателя и организовал ip-over-tcp тунель с домашнего сервера на один из хостинговых серверов технической площадки работодателя. Это было сделано при помощи отличного средства для построения тунелей под UNIX - утилиты vtun от Максима Краснянского.
На данном шаге я получил следующие интерфейсы со стороны на “мирового” и домашнего серверов:
Сторона “мирового” сервера:
#ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.200.0.1 P-t-P:RE.AL.AD.DR Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1450 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:10
RX bytes:546 (546.0 b) TX bytes:494 (494.0 b)
Сторона домашнего сервера:
#ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:RE.AL.AD.DR P-t-P:10.200.0.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1450 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:10
RX bytes:494 (494.0 b) TX bytes:546 (546.0 b)
В приведенных выше выдержках используются 2 IP-адреса:
- RE.AL.AD.DR - реальный IP-адрес, который был установлен на туннеле со стороны домашнего сервера;
- 10.200.0.1 - произвольно выбранный (мною) приватный IP-адрес на “мировом” сервере.
Далее мне нужно было заставить мой домашний сервер отправлять ответы на все запросы к сервисам по адресу RE.AL.AD.DR через туннельный интерфейс. Этой цели удалось добиться используя следующий набор команд для конфигурирования Linux policy routing в скрипте подъема туннельного интерфейса:
ip "rule add fwmark 65 table hof";
ip "route add default via 10.220.0.1 dev tun0 table hof”;
firewall “-t mangle -A PREROUTING -s RE.AL.AD.DR -j MARK –set-mark 65";
firewall “-t mangle -A OUTPUT -s RE.AL.AD.DR -j MARK –set-mark 65";
Эти команды добавляют в систему новую таблицу маршрутизации с именем hof (для которой необходимо добавить отдельную строку в файле
/etc/iproute2/rt_tables в виде “имя_таблицы числовой_идентификатор”), затем добавляют в созданную таблицу маршрут по-умолчанию через конец туннеля на стороне “мирового” сервера и, наконец, помечают все пакеты с адреса RE.AL.AD.DR для маршрутизации при помощи таблицы hof. Последним шагом необходимо было настроить “мировой” сервер так, чтобы он анонсировал при помощи arp-фреймов адрес RE.AL.AD.DR со своим MAC- адресом в Ethernet-сеть в сторону своего маршрутизатора. Я использовал для этого маленькую утилиту farpd из официального репозитория дистрибутива Debian GNU/Linux. При помощи этой утилиты возможно анонсирование любого IP-адреса при помощи arp-фреймов в сеть, соединенную с определенным интерфейсом сервера:
/usr/sbin/farpd -i eth0 RE.AL.AD.DR
Вот и все! После выполнения описанных шагов, любое ПО на моем домашнем сервере, настроенное на использование моего нового IP-адреса (RE.AL.AD.DR) будет доступно из реального мира сети Internet. На данный момент я могу без проблем менять провайдеров, обеспечивающих мне доступ в Сеть и это никак не повлияет на работу моего сервера, так как мой IP-адрес постоянно перемещается вместе со мною.
Удачи вам в испытаниях описанной схемы получения собственного выделенного, не зависимого от провайдера IP-адреса! :-)
Scoundrel
Но немного позже мой провайдер решил удешевить мой способ подключения (для себя) и назначить приватный IP-адрес для моего сервера
(192.168.192.2). Не сложно предположить, с этого момента мой почтовый сервер перестал быть доступен из реального мира и мой почтовый домен перестал функционировать.
Самым простым решением было бы переставить MX-записи моего домена на реальный мейл-сервер во внешней сети и использовать fetchmail или что-то похожее для доставки почты на домашний сервер. Но это решение не было достаточно гибким и я решил взять один из адресов, принадлежащих IP-пулу моего работодателя (я работаю на хостинговую компанию, и ее владелец разрешил построение описанной здесь конфигурации) и назначить его на мой домашний сервер, сделав его таким образом доступным для реального мира. Вы можете сказать: “Это невозможно! Нельзя назначить чужой реальный IP на интерфейс внутри приватной сети другого провайдера!”. Да, в общем случае это так и есть, но при помощи небольшой хитрости с использованием Linux policy routing и туннелирования это становится возможным. Эта статья расскажет вам, как это можно сделать.
Во-первых, я выбрал один из адресов (RE.AL.AD.DR) в сети моего работодателя и организовал ip-over-tcp тунель с домашнего сервера на один из хостинговых серверов технической площадки работодателя. Это было сделано при помощи отличного средства для построения тунелей под UNIX - утилиты vtun от Максима Краснянского.
На данном шаге я получил следующие интерфейсы со стороны на “мирового” и домашнего серверов:
Сторона “мирового” сервера:
#ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.200.0.1 P-t-P:RE.AL.AD.DR Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1450 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:10
RX bytes:546 (546.0 b) TX bytes:494 (494.0 b)
Сторона домашнего сервера:
#ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:RE.AL.AD.DR P-t-P:10.200.0.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1450 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:10
RX bytes:494 (494.0 b) TX bytes:546 (546.0 b)
В приведенных выше выдержках используются 2 IP-адреса:
- RE.AL.AD.DR - реальный IP-адрес, который был установлен на туннеле со стороны домашнего сервера;
- 10.200.0.1 - произвольно выбранный (мною) приватный IP-адрес на “мировом” сервере.
Далее мне нужно было заставить мой домашний сервер отправлять ответы на все запросы к сервисам по адресу RE.AL.AD.DR через туннельный интерфейс. Этой цели удалось добиться используя следующий набор команд для конфигурирования Linux policy routing в скрипте подъема туннельного интерфейса:
ip "rule add fwmark 65 table hof";
ip "route add default via 10.220.0.1 dev tun0 table hof”;
firewall “-t mangle -A PREROUTING -s RE.AL.AD.DR -j MARK –set-mark 65";
firewall “-t mangle -A OUTPUT -s RE.AL.AD.DR -j MARK –set-mark 65";
Эти команды добавляют в систему новую таблицу маршрутизации с именем hof (для которой необходимо добавить отдельную строку в файле
/etc/iproute2/rt_tables в виде “имя_таблицы числовой_идентификатор”), затем добавляют в созданную таблицу маршрут по-умолчанию через конец туннеля на стороне “мирового” сервера и, наконец, помечают все пакеты с адреса RE.AL.AD.DR для маршрутизации при помощи таблицы hof. Последним шагом необходимо было настроить “мировой” сервер так, чтобы он анонсировал при помощи arp-фреймов адрес RE.AL.AD.DR со своим MAC- адресом в Ethernet-сеть в сторону своего маршрутизатора. Я использовал для этого маленькую утилиту farpd из официального репозитория дистрибутива Debian GNU/Linux. При помощи этой утилиты возможно анонсирование любого IP-адреса при помощи arp-фреймов в сеть, соединенную с определенным интерфейсом сервера:
/usr/sbin/farpd -i eth0 RE.AL.AD.DR
Вот и все! После выполнения описанных шагов, любое ПО на моем домашнем сервере, настроенное на использование моего нового IP-адреса (RE.AL.AD.DR) будет доступно из реального мира сети Internet. На данный момент я могу без проблем менять провайдеров, обеспечивающих мне доступ в Сеть и это никак не повлияет на работу моего сервера, так как мой IP-адрес постоянно перемещается вместе со мною.
Удачи вам в испытаниях описанной схемы получения собственного выделенного, не зависимого от провайдера IP-адреса! :-)
Scoundrel
Сетевые решения. Статья была опубликована в номере 04 за 2006 год в рубрике sysadmin