antoo
@antoo

Mikrotik + VPN/iptables: как пробросить порт на внешний IP?

На моем провайдере используются серые адреса + NAT, что не даёт возможности пробросить порт во внешний интернет, поэтому хочу пробросить порт через VPN с белым внешним IP.

На Mikrotik настроен проброс портов следующим образом:
/ip firewall nat add action=masquerade chain=srcnat out-interface=my-vpn
/ip firewall add action=dst-nat chain=dstnat in-interface=my-vpn log=yes protocol=tcp to-addresses=169.254.1.251 to-ports=5000
где 169.254.1.251:5000 - адрес моего сервера в локалке, который нужно пробросить.

На VPN-сервере настроен статический IP (10.201.0.6) для роутера, и по команде в консоли VPNа: curl http://10.201.0.6:5000 показывается нужный мне контент.

Осталось добавить правило для редиректа трафика на VPN-сервере, пытаюсь сделать так:
iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 5000 -j DNAT --to-dest 10.201.0.6:5000
, где x.x.x.x - внешний IP VPNа, но по внешнему IP сайт не открывается, хотя вижу, что запрос на роутер приходит и правило dst-nat срабатывает. Что я делаю не так? Спасибо заранее.

UPD: Получилось сделать через проксирование на базе nginx, но можно ли прокинуть напрямую, без него?
server {
	listen 5000;
	location / {
		proxy_pass http://10.201.0.6:5000;
	}
}
  • Вопрос задан
  • 851 просмотр
Решения вопроса 1
POS_troi
@POS_troi
СадоМазо Админ, флудер, троль.
1. подсеть 169.254.0.0/16 не для того нужна.
2. используйте 172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8
3. Nginx это хорошее решение.
4.
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.2:8080
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 8080 -j ACCEPT

и не забываем про то что необходимо врубить форвард в sysctl
sysctl -w net.ipv4.ip_forward=1

Далее.
У вас с "внешнего" сервера приходит пакет в котором указан адрес клиента и в результате микротик его отфутболит в "default route" тоесть не обратно в VPN соединение а в WAN порт роутера (ну если он так настроен, таблицу маршрутизации вы не дали).
Что-бы ответы пошли туда куда нужно, вам необходимо на микротике, манглом промаркировать роуты и указать в роут таблице куда отсылать это всё
К примеру
/ip firewall mangle add action=mark-routing chain=prerouting dst-address=!169.254.1.0/24 \
    new-routing-mark=WEB-SERVER passthrough=yes protocol=tcp src-address=169.254.1.251 \
    src-port=80

/ip route add distance=1 gateway=my-vpn routing-mark=WEB-SERVER

и все внешние коннекты будет уходить строго в vpn интерфейс.

Но!
1. Приводите адресацию сети в соответствии с п.1/п.2
2. Убираете нафиг все наты
3. прописываете route на vpn сервере в свою сеть (можно /32)
4. оставляете nginx на vpn сервере.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Zzzz9
IP 169.254.x.x нормальный DHCP не выдаст, нужен путний адрес.
Про iptables, конечно на маршрутизаторе уже включена маршрутизация транзитных IP-пакетов?
после того как пакет встретили на PREROUTING, кстати нужно указывать адрес компа со слушающей службой, потом
его нужно проводить из одного интерфейса в другой, типа
iptables -A FORWARD -i eth0 /* тот что смотрит в i-net*/ -o eth1 /* в локальную сеть*/ -j ACCEPT,
если нужно обратиться к службе из локальной сети или из маршрутизатора, нужно еще парочку правил.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы