Проброс внешнего IP c VDS к себе в сеть при помощи mikrotik

Или как сделать себе дополнительный внешний IP адрес дома и хостить на нём свои сайты.
Надо сказать, что материал ориентирован на гиков, которые любят selfhosted решения. Конечно, тут можно спорить про надежность и стабильность таких решений, SLA и прочие умные слова. Но раз вы нашли этот материал, то вы уже понимаете и без меня все минусы и плюсы данного решения.

Для начала напишу, что нам понадобится для этого:
1) аренда VDS у любого хостера, который поддерживает дополнительные IP адреса, поддерживает установку PTR записей (необязательно, но в будущем для selfhosted решений может понадобиться) и позволяет установить свой образ системы (тут вроде бы у всех есть эта опция)
2) Нужно будет купить любой mikrotik роутер. Важно понимать, что самый дешевый микротик имеет очень слабый процессор для нашей задачи, потому что мы будем поднимать шифрованный тоннель между нашим роутером и VDS хостера. Производительность процессора напрямую влияет на скорость передачи данных, поэтому кроить на этом не стоит. Я себе заказал RB5009UG+S+ роутер и полностью доволен им.

Подготовка VDS

Мои изыскания по самым крупным игрокам рунета с умеренными ценами на свои услуги и с всеми необходимыми требованиями, описанными выше, остановили меня на двух компаниях:
1) firstvds.ru — очень приятная и быстрая панель управления сервером, приемлемые цены, можно привязывать до 32 адресов к своему серверу и в целом работает без изъянов. ТехПоддержка добротная, ночью отвечают в течение часа и помогают, а не присылают отписки.
2) justhost.ru — супер бюджетный сегмент серверов, как они себя позиционируют, но за последний год это стало не так, к сожалению. Минимальные конфигурации сильно подорожали, панель управления очень кривая и тормозная, техподдержка откровенно на вас забивает и все проблемы списывает на вас, даже если проблема потом решилась сама по себе. Я бы не рекомендовал их для наших задач, но но если вы готовы мириться с проблемами 2-3 раза в год, то вполне себе вариант. Очевидный для нас плюс — при заказе сервера можно выбрать образ системы RouterOS и не тратить время на установку системы самостоятельно.

Итак, нам необходимо установить на VDS RouterOS CHR. Как это сделать я писал ранее, вы можете следовать этой инструкции и у вас всё получится. У других хостеров порядок действий может отличаться, очень хорошая инструкция есть вот здесь. Но у ruvds нельзя добавить дополнительные IP адреса, поэтому под наши задачи компания не подходит. Но инструкция может вам помочь при установке образа у другого провайдера. Думаю, вы разберетесь :)

Установка роутера mikrotik дома

Хочу сразу отметить, что ваш домашний роутер менять НЕ НУЖНО, каким бы он ни был. Для нашей задачи совершенно неважна модель, марка и вероисповедание вашего домашнего роутера, потому что мы будем делать страшное — двойной NAT.

Как вы уже могли догадаться, пришло время распаковать свежекупленный mikrotik и подключить его к вашему существующему роутеру как обычный клиент (в LAN порт). Объясню почему именно так. На ether2 микротика мы будем вешать внешний IP адрес, и из-за особенностей сети находясь в соседнем порту роутера (подключив, например, свой компьютер в ether3 микротика) мы не сможем получить доступ к своему внешнему IP адресу, потому что он завернут в тоннель.

Производите первичную настройку роутера и мы готовы начинать настройку и переходить к следующему шагу

Настройка CHR RouterOS 7 и проброс внешнего адреса

Необходимо поднять VPN тоннель между нашим домашним mikrotik и CHR. Лично я пользуюсь для этого wireguard, поэтому настройка будет именно с ним. Т.к. внешний IP адрес есть только у CHR, то он будет выступать в роли сервера, а домашний микротик в роли клиента.

Легенда:
1.1.1.1 — IP адрес вашего VDS
2.2.2.2 — дополнительный IP адрес, который вы купили и привязали к VDS
172.16.100.0/24 — подсеть для VPN соединения
10.10.10.0/30 — подсеть для IPIP тоннеля
192.168.100.1/32 — дефолтный шлюз для устройства, подключенного к mikrotik

Настраиваем CHR:

/interface wireguard
add listen-port=13333 mtu=1420 name=wg1

подняли wireguard соединение

/interface wireguard peers
add allowed-address=172.16.100.0/24,0.0.0.0/0 interface=wg1 persistent-keepalive=10s public-key="pubkeyofclient"

добавили пира, вместо pubkeyofclient вписать публичный ключ клиента, он будет на стороне mikortik

/ip address
add address=172.16.100.1/24 interface=wg1 network=172.16.100.0

добавили IP адрес на интерфейс wg

/interface ipip
add allow-fast-path=no local-address=172.16.100.1 name=ipip-tunnel1 remote-address=172.16.100.2

создали ipip тоннель внутри wireguard

/ip address
add address=10.10.10.1/30 interface=ipip-tunnel1 network=10.10.10.0

добавили IP адрес тоннелю

/ip route
add comment="ether4 (mini)" disabled=no distance=1 dst-address=2.2.2.2/32 gateway=10.10.10.2 pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10

добавили маршрут к нашему доп. IP адресу

/ip arp
add address=2.2.2.2 interface=ether1 published=yes

опубликовали наш ip адрес, чтобы маршрутизатор у провайдера знал, что 2.2.2.2 выделенный нам находится внутри CHR и мы готовы с ним работать

/ip firewall filter
add action=accept chain=input dst-address=2.2.2.2
add action=accept chain=forward dst-address=2.2.2.2

не забудьте добавить правила в фаервол, если он у вас настроен, чтобы трафик ходил как надо. И не забудьте переместить правила выше drop в соответствующей секции

На этом настройка CHR закончилась, переходим к терзаниям домашнего mikrotik

Настраиваем mikrotik:

Предполагаем, что ether2 будем использовать для внешнего адреса, поэтому необходимо убрать его из bridge:
/interface bridge port
print


нужно найти номер вашего ether2, скорее всего он будет нулевым:

поэтому пишем команду

disable 0
чтобы отключить этот порт от бриджа

Продолжаем:
/routing table
add disabled=no fib name=to-chr2

добавили новую таблицу маршрутизации

/interface wireguard
add listen-port=13231 mtu=1420 name=wg1

добавили wireguard интерфейс и создаем пира

/interface wireguard peers
add allowed-address=172.16.100.0/24,0.0.0.0/0 endpoint-address=1.1.1.1 endpoint-port=13333 interface=wg1 persistent-keepalive=10s public-key="publickeyofserver"

где publickeyofserver публичный ключ, который надо скопировать с интерфейса wg в CHR

/ip address
add address=172.16.100.2/24 interface=wg1 network=172.16.100.0

добавляем IP для wg1

/interface ipip
add allow-fast-path=no local-address=172.16.100.2 name=ipip-tunnel1 remote-address=172.16.100.1

поднимаем IPIP туннель и с этой стороны

/ip address
add address=10.10.10.2/30 interface=ipip-tunnel1 network=10.10.10.0

присваиваем IP адрес для второй стороны тоннеля

/ip address
add address=192.168.100.1 interface=ether2 network=2.2.2.2

присваиваем IP адрес на интерейфс, чтобы он выступал шлюзом по умолчанию для устройства, подключенного в этот порт

не забываем аналогично и про фаерволл
/ip firewall filter
add action=accept chain=input dst-address=2.2.2.2
add action=accept chain=forward dst-address=2.2.2.2


теперь интересное, помечаем трафик, чтобы нужный потом в ether2 отправлять

/ip firewall mangle
add action=mark-connection chain=prerouting connection-mark=no-mark dst-address=2.2.2.2 in-interface=ipip-tunnel1 new-connection-mark=server-public2 passthrough=no
add action=mark-connection chain=prerouting connection-mark=no-mark new-connection-mark=server-public2 passthrough=yes src-address=2.2.2.2
add action=mark-routing chain=prerouting connection-mark=server-public2 in-interface=ether2 new-routing-mark=to-chr2 passthrough=no

мы маркируем трафик, который приходит на наш IP адрес через IPIP тоннель, чтобы потом можно было его маршрутизировать в отдельной таблице, задаем метку трафика to-chr2. Теперь остается разобраться с маршрутизацией и почти готово

/ip route
add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=ipip-tunnel1 pref-src="" routing-table=to-chr2 suppress-hw-offload=no

показываем куда должен отправляться весь маркированный трафик

на этом с настройкой завершаем, теперь самое интересное

Настройка сервера

Под сервером я понимаю любое устройство, которое можно воткнуть в ether2 порт mikrotik. В нем необходимо прописать настройки сетевого интерфейса. Покажу на примере linux:

# /etc/network/interces

interface eth0 inet static
  address 2.2.2.2
  netmask 255.255.255.255
  gateway 192.168.100.1
  dns-servers 8.8.8.8

Поздравляю, теперь вы должны выходить в интернет с этого устройства с внешним адресом. Аналогично и к вам могут достучаться по внешнему адресу. Можно selfhost’ить всё, что душа экспериментатора пожелает :)