Назад | Перейти на главную страницу

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

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

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

Идея состоит в том, что все клиентские подключения проходят через 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.

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

/ edit: Хорошо, я нашел решение, которое мне подходит.

Мне удалось улучшить первую рабочую идею ниже. В частности, теперь я могу управлять списком IP-адресов, которые будут маршрутизироваться / перенаправляться непосредственно на A во внешнем списке. Я добавил следующее в /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-зоны, а также включаю условную пересылку между моей LAN и 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-соединение. Тем не менее, я полагаю, что это можно сделать, если вы лучше меня разбираетесь в маршрутизации.