За исключением некоторых IP-адресов из правила, чтобы запретить интернет через openwrt + openvpn, когда vpn отключен

У меня есть следующие рабочие настройки в моей сети:

A. ISP-Router (подключен к inet, внутренний ip 192.168.0.1) <----> B. eth0 - OpenWrt Router (запущен клиент OpenVPN) br-lan (мост eth1 + wlan0, ip 192.168.1.0) <- -> C. Несколько клиентов

Идея состоит в том, что все клиентские соединения проходят через B. B маршрутизирует все через VPN. Если VPN-соединение разрывается, у клиентов больше нет доступа к Интернету. Таким образом, я не даю клиентам разоблачить себя в случае возникновения проблемы с подключением vpn.

Мои настройки роутера OpenWrt взяты отсюда: https://blog.ipredator.se/howto/openwrt/configuring-openvpn-on-openwrt.html

Подводя итог:

1 соответствующих устройств:

root@OpenWrt:~# ifconfig
br-lan    Link encap:Ethernet  
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
eth0      Link encap:Ethernet  
          inet addr:192.168.0.16  Bcast:192.168.0.255  Mask:255.255.255.0
tun0      Link encap:UNSPEC  
          inet addr:10.33.197.41  P-t-P:10.33.197.41  Mask:255.255.0.0

2 соответствующие зоны брандмауэра:

config zone
option name 'lan'
option network 'lan'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'REJECT'

config zone
option name 'wan'
option output 'ACCEPT'
option forward 'REJECT'
option network 'wan'
option input 'ACCEPT'

config zone
option name 'vpn'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option masq '1'
option mtu_fix '1'
option network 'vpn'

config forwarding
option dest 'vpn'
option src 'lan'

Таблица 3 маршрутизации выглядит так:

root@OpenWrt:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.33.0.1       128.0.0.0       UG    0      0        0 tun0
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
10.33.0.0       0.0.0.0         255.255.0.0     U     0      0        0 tun0
46.122.122.89   192.168.0.1     255.255.255.255 UGH   0      0        0 eth0
128.0.0.0       10.33.0.1       128.0.0.0       UG    0      0        0 tun0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br-lan

Пока все с этой настройкой работает нормально. Однако теперь я хочу обойти vpn для определенных IP-адресов / хостов. Следовательно, делая их доступными, даже если vpn отключен. Моя идея состояла в том, чтобы добавить маршрут для этих IP-адресов, проходящих непосредственно через A (ip rule add ...) . Это не работает, потому что мне кажется, что мне также нужно настроить параметры брандмауэра. К сожалению, чтение об основах iptables еще не помогло мне понять, какие изменения необходимо сделать.

/ edit: Пробуясь вокруг и продолжая исследования, я прихожу к мысли, что теоретически есть два решения. Однако я не знаю, как заставить их работать:

  1. Сохраняя вышеуказанную концепцию на месте, мне нужно:

    • Добавить MASQUERADE для моей wan_zone (я сделал это)
    • Добавьте правила FORWARD из LAN в WAN и из WAN в LAN (я могу это сделать, но затем я теряю свою "защиту от взлома vpn"), которые зависят от IP-адреса, к которому я хочу получить доступ (не знаю, как и как это сделать работает)
  2. Изменение концепции и избавление от iptables и использование iproute2 и маршрутизации на основе политик ( http://www.linupedia.org/opensuse/Policy_Based_Routing)

    • По умолчанию маршрут все только через vpn
    • условно направить конкретные IP через A. напрямую

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

1 ответ

/edit: Хорошо, я нашел решение, которое работает довольно хорошо для моих нужд.

Мне удалось улучшить первую рабочую идею ниже. В частности, теперь я могу управлять списком IP-адресов, которые будут перенаправлены / перенаправлены непосредственно во внешний список. Я добавил следующее в /etc/firewall.user

# If connection was established before, accept it (so we dont have to deal with inbound connections)
iptables -A forwarding_rule -m state --state ESTABLISHED,RELATED -j ACCEPT
# Read ips from file
FORWARDIPS=$(egrep -v -E "^#|^$" /etc/forward_ip)

# create new iptables and route table entries for each ip in the file
# allow forward if packet matches destination and route it through "table admin", for which we set a default gateway below 
for ipblock in $FORWARDIPS
do
   iptables -A forwarding_rule -d $ipblock -j ACCEPT -p all
   ip rule add to $ipblock table admin
done
~

root@OpenWrt:~# cat /etc/forward_ip 
54.164.36.0/24
8.31.8.0/22     

При запуске мне нужно было вызвать следующую команду из другого файла (я поместил ее в /etc/rc.local):

# Route everything in table admin by default through ISP-Router
ip route add default via 192.168.0.1 dev eth0 table admin  

также отредактируйте /etc/iproute2/rt_tables и добавьте строку:

10     admin

/ edit, это было мое первое решение:

Я нашел решение. Тем не менее, он может быть значительно улучшен. Идея вытекает из моей интуиции в /edit 1. Я включаю маскирование для моей зоны wan, а также включаю условную переадресацию между моей локальной сетью и зоной wan для определенного IP-адреса назначения. Я не могу добавить более одного "option dest_ip" для правила конфигурации. Так что было бы неплохо иметь то, что я делаю в конфигурации брандмауэра uci, как правило iptables, которое я затем добавляю в /etc/firewall.user

Я отредактировал / etc / config / firewall и изменил зону конфигурации и добавил правило конфигурации

config zone
        option input 'ACCEPT'
        option output 'ACCEPT'
        option name 'wan'
        option network 'wan'
        option forward 'REJECT'
        option masq '1'
        option mtu_fix '1'

config rule
        option target 'ACCEPT'
        option src 'lan'
        option dest 'wan'
        option name 'Lan to Wan'
        option proto 'all'
        option dest_ip '54.164.36.190'
        option enabled '0'

Я отбросил свою идею в / edit 2 после некоторой попытки, потому что было много непредвиденных препятствий. Например, без шлюза по умолчанию от B до A я не могу установить мое соединение vpn во-первых. Тем не менее, я полагаю, что это можно сделать, если вы лучше разбираетесь в маршрутизации, чем я.

Другие вопросы по тегам