IlyaK
Участники форума-
Постов
7 -
Зарегистрирован
-
Посещение
Оборудование
-
Кинетик
Ultra
Достижения IlyaK
Новичок (1/5)
6
Репутация
-
Задача простая, но хочу поделиться; может быть будет полезно новичкам, тем более что в Zyxel пришлось править настройки файрвола. Понадобится знание маршрутизации, iptables и Linux:) У меня есть VPSка (с CentOS) на одном хостере в Восточной Европе, решил направить трафик на некоторые сети через нее с моего Keenetic Ultra. Выбирал между VPN на IPSec, OpenVPN и SSH Tunnel. Самый быстрый вариант наверное IPSec (потому что не заворачивается в userspace), но он самый сложный в настройке. В итоге остановился на OpenVPN и tun: tun это такой API в Linux когда траффик на виртуальный интерфейс сетевого уровня направляется в пользовательскую программу (OpenVPN в моем случае). Еще бывает tup, который эмулирует канальный уровень. Сервер На сервере поставил openvpn (``yum install openvpn``), настроил по https://openvpn.net/index.php/open-source/documentation/miscellaneous/78-static-key-mini-howto.html: $ cat /etc/openvpn/server.conf # хотим tun dev tun # IP сервера 172.16.1.1, IP клиента -- .2 (172.16. у нас приватная сетка) ifconfig 172.16.1.1 172.16.1.2 # Будет слушать порт 443 port 443 # Будем работать по TCP proto tcp-server # Пингуем клиента каждые 10 секунд: если минуту не отвечает то считаем что отвалился keepalive 10 60 # авторизироваться будем по ключу secret static.key Создал ключ в /etc/openvpn $ openvpn --genkey --secret static.key Запустил сервер (``systemctl enable openvpn@server && systemctl start openvpn@server``). У systemd юнита openvpn после собачки идет имя файла с конфигом. Настройки iptables на centos хранятся в /etc/sysconfig/iptables, загружаются cat /etc/sysconfig/iptables | iptables-restore Добавил в него NAT (тут написано что после роутинга, прямо перед отправкой пакета в Интернет (интерфейс venet) если он пришел из сети с VPN (см адрес) нужно поменять source на внешний IP ): Получился обычный SNAT *nat :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [1:76] :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 172.16.1.0/24 -o venet+ -j SNAT --to [ВНЕШНИЙ_IP] COMMIT *filter :INPUT DROP [83:5616] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [6911:1304844] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT ...тут всякие мои правила -A INPUT -s [ДОМАШНИЙ_МОЙ_ВНЕШНИЙ_IP] -m state --state NEW -p tcp --dport 443 -j ACCEPT -A INPUT -i tun+ -j ACCEPT -A FORWARD -i tun+ -o venet+ -j ACCEPT -A FORWARD -i venet0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT ...и в filter: тут написано что с моего домашнего IP можно цепляться на порт 443, и что между внешним интерфейсом и tun (нашим VPN) можно пускать траффик: с VPN любой, а обратно только если он идет в ответ. Zyxel Скопировал себе static.key. Поставил через opkg openvpn-ssl. Настраиваем клиента /opt/etc/openvpn/openvpn.conf remote [МОЙ_СЕРВЕР] 443 tcp-client dev tun ifconfig 172.16.1.2 172.16.1.1 connect-retry 15 connect-retry-max infinite keepalive 10 60 resolv-retry infinite route-up /opt/etc/openvpn/route.sh secret /opt/etc/openvpn/static.key Тут всё как на сервере, только мы tcp-client, пытаемся достучаться каждые 15 секунд (это важно, ведь у меня связь с провайдером по L2TP/IPSec, а оно иногда рвется!). Так же указан ключик с секретом (скопированный!) и скрипт, который будет запускаться как только поднялся OpenVPN и будет править маршрутизацию. На Zyxel systemd нету, так что у нас обычный systemV init: скрипт ``/opt/etc/init.d/S20openvpn`` поставится с Openvpn и будет запускаться при загрузке (ну или его можно start) Запустил скрипт, в журнале увидел что соединение установлено, пошли пинги на интерфейс: ping 172.16.1.1 Тут началось интересное: маршрутизацией Zyxelевая прошивка управляет сама: она NATит весь траффик из локалки (интерфейс br0 -- видимо потому что bridge с другими ethernet портами на роутере) но по-умолчанию разрешает его только на ppp (то-есть на VPN с провайдером). Если добавить iptables -I INPUT -s [моя локалка] -j ACCEPT явно, то zyxel его перепишет. Внести постоянные изменения можно через утилиту ndmc, или через UI. Я пошел в UI и в сетевом экране для интерфейса Home добавил разрешение для TCP, UDP и ICMP куда угодно для 192.168.1.0/255.255.255.0 (такая у меня локалка) Теперь с домашних компов пошли пинги на сервер интерфейса 172.16.1.1. Осталось добавить маршруты в наш # /opt/etc/openvpn/route.sh #!/bin/sh # Network1 route add -net [СЕТКА_НА_КОТОРУЮ_Я_ХОЧУ_ХОДИТЬ_ЧЕРЕЗ_VPS] gw 172.16.1.1 route add -net [ЕЩЕ_СЕТКА_НА_КОТОРУЮ_Я_ХОЧУ_ХОДИТЬ_ЧЕРЕЗ_VPS] gw 172.16.1.1 Запустил скрипт и вуаля: иду на с домашнго компа на машину в той сети, и вижу что пришел туда не от своего провайдера, а со своего сервера:) На всякий случай еще раз, вот как идет пакет: 1) С домашнего компа идет на роутер 2) Роутер по маршрутизации понимает что его надо направить на VPS 3) Делает NAT (заменяет source адрес на 172.16.2.1) 4) Шлет его на сервер 5) Сервер опять меняет ему SRC на свой внешний IP 6) Шлет его в Интернет 7) В Интернет приходит мой пакет от имени моего сервера Хорошо что не смотря на проприетарную прошивку, Zyxel это самый настоящий Linux роутер) Теперь хочу сделать скрипт, который будет собирать список нужных мне сетей и выгружать их по cronу в route.sh. Если не хватит моих знаний sed/awk/shell, то придется ставить из opkg какой-то скриптовый язык. Вроде, там есть python:)
- 2 ответа
-
- 1
-
Ну если подумать то очевидно что linuxу нужен ext, просто я не сообразил)
-
Хотел поднять openvpn. "opkg install openvpn-openssl" сам утянул все зависимости, но написал Warning: ip program not found. Please, install it before using OpenVPN. Я думаю: "ну, ip в линуксе это часть iproute2". Ищу его тут, и не нахожу: http://pkg.entware-keenetic.ru/binaries/keenle/ В итоге нашел в пакете ip-legacy. Я не очень понимаю пока кто всё это поддерживает, так что спрошу тут: 1) чего это он легаси, когда на линуксе вроде как именно iproute2 считается современным, а легаси у нас ifconfig 2) почему у openvpn-openssl в зависимостях нет этого пакета, если openvpn его требует? Ну и чтоб два раза не вставать: если подниму в итоге openvpn, и настрою через него маршрутизацию определенных сетей (через route add) -- будет работать? Получилось у кого-то? Если нет, то я попробую и напишу в рецепты, боюсь только что памяти у моего Zyxel мало: если я ему набью в таблицу маршрутизации штук 500 записей -- зависнет же небось:(
-
Пожалуйста, напишите что FAT32 не поддерживается! Несмотря на то, что там написано про ext2/ext3, я все равно умудрился запихать обычную флешку, которую винда форматнула в FAT32. В итоге получил "failed to inflate "installer-keenle.tar.gz": bin/renice: operation not permitted.": то-ли он попытался сделать chmod, то-ли что-то еще, но тем не менее пока я не сунул ему флешку с ext3 он не заработал. Не смотря на то, что я уже имел опыт c opkg (положительный) я давно его не трогал, все забыл, и наступил на такую вот глупость. Уверен, многие новички наступят. Вот прямо там, где написали про NTFS, напишите пожалуйста что FAT32 флешка из винды не заработает.
-
Добрый день. Хочу поделиться наколенным решением: как я отключал Интернет на iPhone на ночь. AP в Keenetic Ultra умеют черный и белый списки. В них можно добавлять MAC адреса зарегистрированных устройств. Если зарегистрировать iPhone и включить "черный список" на точках (у меня две точки -- 2.4 и 5) то добавление в их список этого мака приведет к его блокировке. А для добавления/удаления его из этого списка можно использовать cron и ndmq. Вот выдержка из моего конфига: # Это детский Iphone и его mac known host iphone xx:xx:xx:xx:xx:xx # Это 2.4 interface WifiMaster0/AccessPoint0 name AccessPoint ... mac access-list type deny # черный список # 5 interface WifiMaster1/AccessPoint0 name AccessPoint_5G .. mac access-list type deny Теперь добавить MAC в список в CLI можно так: "interface WifiMaster1/AccessPoint0 mac access-list address <тут-идет-мак>". # В домашней папке сделал такой простой скрипт ~ # cat switch.sh #!/opt/bin/sh MAC="...." # тут наш мак COMMAND="interface WifiMaster0/AccessPoint0 mac access-list address $MAC" # комманда на 2.4 COMMAND_2="interface WifiMaster1/AccessPoint0 mac access-list address $MAC" # на 5. Проверьте через обычный CLI что работает! # Если передали аргумент то дописываем "no": получается обратный эффект: мак из списка убирают if [ $1 ]; then COMMAND="no $COMMAND" COMMAND_2="no $COMMAND_2" fi # ndmq -p дает нам делать тоже самое что можно делать через CLI по telnet ndmq -p "$COMMAND" ndmq -p "$COMMAND_2" ~# opkg install cron # ставим крон ~# /opt/etc/init.d/S10cron start # запускаем его (после перегрузки поднимится сам потому что файл исполняемый ~# vi /opt/etc/crontab # правим его 0 23 * * * root /opt/root/switch.sh # в 11 вырубаем 0 8 * * * root /opt/root/switch.sh enable # в 8 врубаем # не забудьте что в конце crontab должна быть или пустая строка или коммент!! Всё. Теперь крон вечером запустит скрипт и добавит мак адрес в черный список, а утром уберет.