В моей сети есть следующие рабочие настройки:
А. 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: Пробуя и продолжая исследования, я пришел к выводу, что теоретически есть два решения. Однако я не знаю, как заставить их работать:
Сохраняя вышеуказанную концепцию, мне необходимо:
Изменение концепции и избавление от iptables и вместо этого использование iproute2 и маршрутизации на основе политик (http://www.linupedia.org/opensuse/Policy_Based_Routing)
Однако это кажется еще более сложным, по крайней мере, для меня, потому что я никогда этим не пользовался.
/ 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-соединение. Тем не менее, я полагаю, что это можно сделать, если вы лучше меня разбираетесь в маршрутизации.