LINUX.ORG.RU
решено ФорумAdmin

External public IP forward

 , , ,


0

1

Всем привет!

Имею проблему - мой домашний роутер не имеет внешнего адреса. Хочу решить эту задачу пробросив соединения с внешнего хоста на внутренние.

Как решил сделать:

Роутер поднимает ВПН соединение с внешним хостом, входящие соединения на хосте подначивать в адрес внутренний принадлежащий VPN и назначенный Keenetic, а source в адрес WG туннеля принадлежащий внешнему хосту.

Пинги бегают есть соединение. А вот соединение не устанавливается.

Моя адресация WG - Ext 172.16.6.2, Keenetic 172.16.6.10

Проброс настраивал для портов tcp\16883, tcp\16884, udp\16885

table ip nat {
        chain prerouting {
                type nat hook prerouting priority -100;
                # DNAT BitTorrent TCP traffic
                iif ens18 tcp dport 16883 dnat to 172.16.63.10:16883

                # DNAT BitTorrent TCP traffic
                iif ens18 tcp dport 16884 dnat to 172.16.63.10:16884

                # DNAT BitTorrent UDP traffic
                iif ens18 udp dport 16885 dnat to 172.16.63.10:16885
        }

        chain postrouting {
                type nat hook postrouting priority 100;
                # SNAT For tunnel
                oif wg0 ip daddr 172.16.63.10 tcp dport 16883 snat to 172.16.63.2
                oif wg0 ip daddr 172.16.63.10 tcp dport 16884 snat to 172.16.63.2
                oif wg0 ip daddr 172.16.63.10 udp dport 16885 snat to 172.16.63.2
                # Masquerade traffic going through WireGuard
                #oif wg0 masquerade
                ip saddr 172.16.63.10 oif ens18 snat to <EXT_IP>
        }
}

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

Подскажите что подкрутить?

Ответ на: комментарий от Anoxemian

Почему шиза? Если пакеты вылетает в WG то мы его натим в наш внутренний адрес WG обеспечивая тем самым маршрутизацию из внутренней сети в туннель.Если пакет залетает к нам то натим во внешний адрес Вроде все логично

SterhTG
() автор топика
Ответ на: комментарий от Anoxemian

Все просто, из таблицы SNAT вынули адрес источника, сняли 172.16.63.2 поставили оригинальный адрес источника, с таблицы DNAT сняли 172.16.63.10 поставили оригинальный адрес назначения и порт. Отдали пакет наружу. В чем проблема?

SterhTG
() автор топика
Ответ на: комментарий от Merionet

Если запустить не внутреннем хосте wireshark, то мы увидим входящий syn пакет, ack пакет направленный на внутренний адрес туннеля внешнего хоста. В таблице записей кинетика есть данное соединение, но наружу пакет не выплёвыется.

SterhTG
() автор топика
Ответ на: комментарий от SterhTG

Проблема в том, что ни в одно из правил этот пакет не попадает, втыкается в несуществующий порт внутреннего адреса внешнего хоста и на этом все. Тебе нужно сделать hairpin, убери уже oif/iif из dnat/snat и все заработает.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

Проверил - Убрал интерфейс, не заработало. Не понимаю почему он должен куда-то втыкаться и теряться.

  1. Пришёл пакет на внешний интерфейс внешнего хоста
  2. Отрабатывает правило DNAT, меняется внешний адрес внешнего хоста на внутренний адрес ВПН кинетика, создаётся запись в таблице трансляций DNAT
  3. Маршрутизация. Выбрали маршрут в ВПН, подготовились выплюнуть
  4. Работает SNAT, заменили адрес источника на внутренний ВПН адрес внешнего хоста
  5. Отправили на кинетик, он поймал пакет и через порт форвард закинул его внутреннему хосту в локальной сети
  6. Внутренний сервер обработал пакет и отправил его на внутренний ВПН адрес внешнего хоста
  7. Кинетик поймал пакет, разобрал его и отправил в ВПН туннель
  8. Пришёл пакет в ВПНе, мы нашли его в таблице контрака и восстановили реальный адрес источника
  9. Нашли маршрут, подготовили выкинуть в интерфейс
  10. Нашли пакет в таблице контрака и сделали unDNAT - заменили адрес источника с внутреннего адреса кинетика на наш внешний
    Вот моя логика. Причем тут имя интерфеса в правиле? Если я не прав, поправьте пожалуйста
SterhTG
() автор топика
Ответ на: комментарий от SterhTG

Да, не прав, условия фильтра - условия отбора пакетов для прохождения. dnat/snat условно создают 2 правила с зеркальным отбором пакетов, как ты правильно написал undnat/unsnat, указывая интерфейс, ты создаешь противоречивое условие, которое не дает пакету попасть в контрак.

Anoxemian ★★★★★
()

Посыпал голову пеплом - разобрался с проблемой. Правила верные, проблема в том, что в скрипт забыл воткнуть включение глобального форвардинга net.ipv4.ip_forward(по умолчанию =0 ), хотя были включены специфичные правила для форвардинга на интерфейсах net.ipv4.conf.ens18.forwarding = 1 и впн.

SterhTG
() автор топика