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

перенаправление интернет траффика vlan'а через определенный хост в локальной сети

 , , ,


0

1

Есть два vlan’a на mikrotik:

  • vlan10 192.168.10.0/24
  • vlan11 192.168.11.0/24
  • Для 192.168.10.0/24 разрешен NAT через домашнего провайдера.

Настроен хост с linux (alpine) на борту:

  • eth0 (vlan10) 192.168.10.5/24 gw 192.168.10.1
  • eth1 (vlan11) 192.168.11.5/24
  • добавлен маршрут net 192.168.11.0 netmask 255.255.255.0 gw 192.168.11.1
  • tun0 10.52.0.12 (openvpn)

Задача:

  1. Перенаправить траффик 0.0.0.0/0 vlan’а 11 через хост 192.168.11.5, на котором он будет заворачиваться в vpn-туннель

Что уже пробовал сделать:

  • На микротике добавил mangle для траффика сети 192.168.11.0/24 не к локальным адресам route mark 'nat-vpn'
  • Добавлен маршрут 0.0.0.0/0 для route mark 'nat-vpn' через 192.168.11.5
  • На хосте через iptables организован nat 'iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o tun0 -j MASQUERADE'

Итоговое решение

  • Для сетки 192.168.11.0 назначаем gw 192.168.11.5.
  • На хосте 192.168.11.5 правим iptables:
iptables -A INPUT -j ACCEPT -m conntrack --ctstate RELATED,ESTABLISHED
iptables -A OUTPUT -j ACCEPT -o lo

iptables -A OUTPUT -j ACCEPT -o eth0 -d $VPN_IP -p udp -m udp --dport 1198
iptables -A FORWARD -j ACCEPT -i tun0 -o eth1
iptables -A FORWARD -j ACCEPT -i eth1 -o tun0

iptables -A OUTPUT -j ACCEPT -o tun0

iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP
iptables -A OUTPUT -j DROP

iptables -t nat -A POSTROUTING -j MASQUERADE -s 192.168.11.0/24
  • На остальных устройствах в 192.168.11.0 добавляем необходимые маршруты в другие сетки через роутер:
ip route add 192.168.30.0/24 via 192.168.11.1 dev eth0

Давай более подробно. Что нужно сделать, нарисуй схему сети.

Если у тебя есть ПК, на котором есть VLANы, и этот ПК является шлюзом для сетей в этих VLANах и ты хочешь что бы он дальше маршрутизировал эти пакеты в другие сети через некоторый другой шлюз, то тебе нужно сделать отдельную таблицу маршрутизации, в которой указать другой маршрут по умолчанию и через ip rule указать, что пакеты из сетей во VLAN`ах должны маршрутизироваться через эту таблицу маршрутизации.

anonymous ()

Читай как это делается на микротик. Но собственно тебе как раз и нужно сделать то, что я написал в предыдущем сообщении.

Создаёшь отдельную таблицу маршрутизации, в которой маршрутом по умолчанию указываешь 192.168.11.5 и далее указываешь, что пакеты с адресом источника сетей во VLAN`ах должны маршрутизироваться через эту таблицу маршрутизации.

В Linux это пишется примерно вот так:

ip rule from 192.168.10.0/24 lookup table2
anonymous ()
Ответ на: комментарий от anonymous

Для 192.168.10.0/24 должен остаться роутер (192.168.10.1) дефолтным шлюзом, он все же через него в интернет и лезет, когда соединение устанавливает с vpn сервером.

немного экспорта с роутера:

/ip firewall mangle
add action=mark-connection chain=prerouting dst-address-list=!Internal \
    new-connection-mark=nat-pia-connection passthrough=yes src-address-list=\
    nat-pia
add action=mark-routing chain=prerouting connection-mark=nat-pia-connection \
    new-routing-mark=nat-pia-route passthrough=ye
	
/ip route
add distance=1 gateway=192.168.11.5 routing-mark=nat-pia-route
nikolass2007 ()
Ответ на: комментарий от anonymous

настроил для тестового хоста 192.168.11.9 дефолтным шлюзом 192.168.11.5. друг друга видят, но в интернет (8.8.8.8) не выходит.

с хоста 192.168.11.5 выполнил traceroute -s 192.168.11.5 8.8.8.8 - траффик уходит в vpn-туннель.

nikolass2007 ()
Ответ на: комментарий от anonymous

хост 192.168.11.5:

iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 7436 packets, 966K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 399 packets, 56888 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 7 packets, 492 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 7 packets, 492 bytes)
 pkts bytes target     prot opt in     out     source               destination
   19   874 MASQUERADE  all  --  *      tun0    192.168.11.0/24         0.0.0.0/0

iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -j ACCEPT
nikolass2007 ()
Ответ на: комментарий от anonymous
~ # cat /etc/iptables/rules-save
# Generated by iptables-save v1.8.4 on Sun Jan 10 18:46:18 2021
*filter
:INPUT ACCEPT [28:4028]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2:168]
[0:0] -A FORWARD -j ACCEPT
[0:0] -A FORWARD -j ACCEPT
COMMIT
# Completed on Sun Jan 10 18:46:18 2021
# Generated by iptables-save v1.8.4 on Sun Jan 10 18:46:18 2021
*nat
:PREROUTING ACCEPT [7608:997283]
:INPUT ACCEPT [429:61161]
:OUTPUT ACCEPT [7:492]
:POSTROUTING ACCEPT [7:492]
[19:874] -A POSTROUTING -s 192.168.11.0/24 -o tun0 -j MASQUERADE
COMMIT
# Completed on Sun Jan 10 18:46:18 2021
~ # cat  /proc/sys/net/ipv4/ip_forward
1
nikolass2007 ()
Ответ на: комментарий от nikolass2007

Почему «-o tun0», если у хоста 192.168.11.5 шлюзом является 192.168.11.1

eth1 (vlan11) 192.168.11.5/24
добавлен маршрут net 192.168.11.0 netmask 255.255.255.0 gw 192.168.11.1

доступный через интерфейс eth1.

Либо пиши

-A POSTROUTING -s 192.168.11.0/24 -o eth1 -j MASQUERADE

либо вообще убери «-o eth1» из правила.

anonymous ()
Ответ на: комментарий от nikolass2007

Нет, правила iptables работают по другому.

в правиле указываются критерии, а после ключа «-j» что делать в случае, если пакет подпадает под критерий.

У тебя было написано, что для пакетов из сети 192.168.11.0/24 уходящие через интерфейс tun0 нужно применять маскарадинг.

То через какой интерфейс пакет будет уходить управляется таблицей маршрутизации.

И сейчас у тебя на хосте 192.168.11.5 есть грубо говоря 3 маршрута:

  • маршрут до сети 192.168.10.0/24
  • маршрут до сети 192.168.11.0/24
  • маршрут по умолчанию через 192.168.11.1

Напиши что ты хочешь сделать, а не то как ты видишь это должно работать.

anonymous ()
Ответ на: комментарий от nikolass2007

Что это за VPN? Точнее что за VPN сервер? По сути, если ты хочешь что бы трафик шёл через VPN сервер, то тебе нужно в качестве маршрута по умолчанию на 192.168.11.5 указать IP адрес VPN сервера в VPN сети.

Если ты хочешь, что бы только пакеты из сети 192.168.11.0/24 ходили через этот маршрут, то нужно создать отдельную таблицу маршрутизации и прописать правило перенаправления пакетов через эту таблицу маршрутизации

echo "1000  vpn" /etc/iproute2/rt_tables
ip route add default via VPN_SERVER_IP table vpn
ip rule add from 192.168.11.0/24 lookup vpn

И как-то это автоматизируй.

Далее просто настраиваешь NAT на 192.168.11.5 с указанием исходящего интефейса.

anonymous ()

добавлен маршрут net 192.168.11.0 netmask 255.255.255.0 gw 192.168.11.1

Нахрена? Ты уже в сети 192.168.11.0/24

Идея - говно.

mikrotik умеет openvpn/tun. Подними его там и не уродуйся с маршрутизацией.

анонимус предолжил очень годную идею про dhcp

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

так цель достигнута уже, осталось только подобие killswitch на хосте с openvpn клиентом настроить через iptables и все.

единственное но, если сразу дефолтным gw указывать 192.168.11.5, а не адрес роутера 192.168.11.1, то пропадает доступ к другим сетям в домашней локалке. 192.168.11.5 о них просто ничего не знает.

казалось бы, вот это должно рещить проблему:

/ip firewall mangle
add action=mark-connection chain=prerouting dst-address-list=!Internal \
    new-connection-mark=nat-pia-connection passthrough=yes src-address-list=\
    nat-pia
add action=mark-routing chain=prerouting connection-mark=nat-pia-connection \
    new-routing-mark=nat-pia-route passthrough=ye
	
/ip route
add distance=1 gateway=192.168.11.5 routing-mark=nat-pia-route

таким образом, к локальным адресам хосты в 192.168.11.0 будут ходить через роутер, а в 0.0.0.0/0 сам роутер будет заворачивать траффик на 192.168.11.5.

но по какой-то причине при такой конфигурации тестовый хост 192.168.11.9 в интернет попал только с 3 попытки:

~ # wget https://mirror.yandex.ru/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso
Connecting to mirror.yandex.ru (213.180.204.183:443)
ssl_client: mirror.yandex.ru: handshake failed: Connection reset by peer
wget: error getting response: Connection reset by peer
~ # wget https://mirror.yandex.ru/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso
Connecting to mirror.yandex.ru (213.180.204.183:443)
ssl_client: mirror.yandex.ru: handshake failed: Connection reset by peer
wget: error getting response: Connection reset by peer
~ # wget https://mirror.yandex.ru/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso
Connecting to mirror.yandex.ru (213.180.204.183:443)
saving to 'CentOS-7-x86_64-Minimal-2009.iso'
CentOS-7-x86_64-Mini 100% |**********************************************************|  973M  0:00:00 ETA
'CentOS-7-x86_64-Minimal-2009.iso' saved
nikolass2007 ()
Ответ на: комментарий от nikolass2007

Ну дык выдай им 192.168.11.5 как dgw и не мучайся.

На микротике заперти всем из сети 192.168.11.0/24 доступ в инет.

Если впн на 192.168.11.5 ходит через микротик, то сделай для него исключение.

Два роутера в сети с клиентами это всегда геморой.

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

единственное но, если сразу дефолтным gw указывать 192.168.11.5, а не адрес роутера 192.168.11.1, то пропадает доступ к другим сетям в домашней локалке. 192.168.11.5 о них просто ничего не знает.

Ну так добавить на хосте маршруты через 192.168.11.1.

А если их много, то ospf подними на хосте и микротике.

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

vel, да, понял что маршрут для 192.168.11.0 через роутер - лишнее.

Насчет поднять впн на роутере - openvpn у него только tcp. Делал через более перевариваемый им ipsec - проивзодительность отличная, 100 Мбит/с до 15% загрузки CPU давало. Но vpn провайдер оффициально не поддерживает такой способ подключения, и постоянно дропалось соединение требовало вкл/выкл. Решил на более «дубовом» openvpn организовать, и вынести на железку (proxmox, lxc).

nikolass2007 ()