16.03.2021

Port Forwarding -> VPN

 Были времена, когда на Белтелекомовском домашнем роутере можно было сделать проброс портов, придти на работу и попасть по сети домой с использованием DynDNS. Это было давно и уже не правда. Сейчас всё за NAT-ами. Проброс на роутере совсем не актуален для домашнего использования. 

Мой Кубик на данный момент является точкой доступа из сети к домашним устройствам. Схема проста. 

  1. На Кубике поднят VPN (Hamachi).
  2. На кубике сделан проброс портов iptables. 

Эта тема более актуальна для специфических протоколов, так как для проброса HTTP из сети через кубик на домашнее устройство можно обойтись Webmin. Да у него есть такая возможность - редирект в домашней сети и прячется во вкладке HTTP Tunnel.

Если надо попасть в SSH или заходить на Webmin неудобно, то применим колдунство iptables

Однако, давай по порядку. Сначала VPN.



#!/bin/bash
E_MAIL=$1

# https://www.vpn.net/linux
wget https://www.vpn.net/installers/logmein-hamachi_2.1.0.203-1_armhf.deb
dpkg -i logmein-hamachi_2.1.0.203-1_armhf.deb
hamachi login
hamachi attach E_MAIL

Проще, наверное, и не бывает. Регистрируешься, смотришь версию, устанавливаешь, в webe подключаешь свои точки к сети и делаешь прочие настройки. Теперь твои устройства связаны в своей собственной сети. Бесплатный тариф ограничен пятью точками. Но ко всей домашней локальной сети можно достучаться с Кубика при поднятом Hamachi только на нём. Для удобства делаем проброс порта.

Сервер - это девайс в локальной сети, к которому мы стучимся из VPN (192.168.100.15).

Шлюз - это Кубик.

Неправильный порт - порт, по которому из VPN мы получим доступ к девайсу (90).

#!/bin/bash
EXT_IP="xxx.xxx.xxx.xxx" # внешний VPN, реальный IP-адрес шлюза 
INT_IP="xxx.xxx.xxx.xxx" # реальный IP-адрес шлюза в локальной сети
EXT_IF=ham0 # Внешний и внутренний интерфейсы.
INT_IF=eth0 # Для шлюза они вряд ли изменятся, поэтому можно прописать вручную.
FAKE_PORT=$1  # Вначале передаём скрипту "неправильный" порт на внешнем интерфейсе,
LAN_IP=$2     # затем - локальный адрес сервера
SRV_PORT=$3   # и в конце - реальный порт для подключения к серверу

iptables -t nat -A PREROUTING -d $EXT_IP -p tcp -m tcp --dport $FAKE_PORT -j DNAT --to-destination $LAN_IP:$SRV_PORT
iptables -t nat -A POSTROUTING -d $LAN_IP -p tcp -m tcp --dport $SRV_PORT -j SNAT --to-source $INT_IP
iptables -t nat -A OUTPUT -d $EXT_IP -p tcp -m tcp --dport $SRV_PORT -j DNAT --to-destination $LAN_IP
iptables -I FORWARD 1 -i $EXT_IF -o $INT_IF -d $LAN_IP -p tcp -m tcp --dport $SRV_PORT -j ACCEPT

Пример использования скрипта

port_forward.sh 90 192.168.100.15 80
Теперь, если мы постучимся в кубик по его VPN-адресу на порт 90, то мы попадём на 80-ый порт по адресу в локальной сети 192.168.100.15

Это колдунство взято из этой статьи - Проброс и перенаправление портов в iptables 

Сохранить таблицы и восстановить после пеерзагрузки:

apt-get install iptables-persistent
systemctl enable netfilter-persistent
iptables-save > /etc/iptables/rules.v4

Комментариев нет: