Решил поделиться скриптом для обеспечения одновременной работы локалки (без ВПН) и инета, может быть кому-то пригодится. Проблема в том, что просто прописывание маршрута через route мне не подходит, т.к. я хотел чтобы ответ на пакеты уходил по тому же интерфейсу, по которому пришел пакет. То есть например, если кто-то с локального IP обратился на мой внешний IP, нужно чтобы ответ пришел через внешний интерфейс, а не через локальный. Поэтому сделано с помощью advanced routing-а.
Работает в уфанете с локалкой без ВПН.
Code:
#!/bin/sh
#локальные адреса ufanet
localnetworks="77.79.128.0/18 77.79.160.0/19 79.140.16.0/20 81.30.176.0/20 81.30.192.0/19 89.189.128.0/19 92.50.128.0/18 94.41.0.0/16 172.16.0.0/12 10.0.0.0/8"
#
local_IF=`nvram get wan0_ifname`
inet_IF=`nvram get wan0_pppoe_ifname`
local_GW=`nvram get wanx_gateway`
inet_GW=`nvram get wan0_gateway`
local_IP=`nvram get wanx_ipaddr`
inet_IP=`nvram get wan0_ipaddr`
#удаляем rule, кроме дефолтных из рутинга
ip rule show | grep -v '0:' | grep -v '32766:' | grep -v '32767:' \
| while read PRIO RULE; do
ip rule del prio ${PRIO%%:*} $( echo $RULE | sed 's|all|0/0|' )
done
#добавляем таблицу рутинга 100 - локалка
ip route add $local_GW/32 dev $local_IF src $local_IP
ip route add default via $local_GW dev $local_IF table 100
ip route flush cache
#добавляем таблицу рутинга 101 - инет
ip route add $inet_GW/32 dev $inet_IF src $inet_IP
ip route add default via $inet_GW dev $inet_IF table 101
ip route flush cache
#входящие пакеты пусть обрабатываются таблицами
ip rule add from $local_IP table 100
ip rule add from $inet_IP table 101
#пакеты с маркировкой пусть обрабатывают соответствующие таблицы
ip rule add fwmark 1 table 100
ip rule add fwmark 2 table 101
#чистим, чтобы правила не накапливались при перезапуске скрипта
iptables -t mangle -F
#исключения: не нужно трогать дефолтный рутинг для гейтвеев и адресов интерфейсов, 10.8.0.1 - адрес VPN-сервера уфанета
iptables -t mangle -A PREROUTING -d $inet_IP -j ACCEPT
iptables -t mangle -A PREROUTING -d $inet_GW -j ACCEPT
iptables -t mangle -A PREROUTING -d 10.8.0.1 -j ACCEPT
iptables -t mangle -A PREROUTING -d $local_GW -j ACCEPT
iptables -t mangle -A PREROUTING -d $local_IP -j ACCEPT
#пакеты в локалку маркируем 1
for a in $localnetworks; do
iptables -t mangle -A PREROUTING ! -s $local_IP -d $a -j MARK --set-mark 1
done
#это на всякий случай, возможно и без этого будет работать :)
echo "0" >/proc/sys/net/ipv4/conf/all/rp_filter
Маркировка 2 не используется, т.к. дефолтный рутинг после соединения становится через VPN. Но оставил для наглядности.
Прописывать в /usr/local/sbin/post-firewall