Офисный переключатель интернета

    Провели нам в офис вторую линию интернета. Так как основная (дальше я буду называть её первой) хоть и хороша по-скорости, но ограничена по трафику. Вторая немного медленнее, но безлимитна. Днём вторая линия почти свободна и выдаёт хорошую скорость, поэтому и была выбрана основной для рабочего дня. К вечеру скорость сильно падает из-за нагрузки на канал и приходится переключаться на первую. Так бывает не всегда, но достаточно часто.
    Потому возник вопрос в переключении линий. Роутером у нас трудится обычный компьютер с FreeBSD на борту. Городить хитрую логику проверки скорости канала смысла не было, к тому же нужна была индикация активного подключения. Настроив переключение каналов на консольные команды с помощью sh скриптов в папке /bin, мы столкнулись с двумя проблемами:

    1. Доступ к консоли только у админа, а он не всегда на месте, да и дёргать ради переключения каналов тоже не очень удобно.
    2. Нет индикации актвного, на данный момент, подключения.
    Поэтому было принято решение сделать переключатель физическим и снабдить индикаторами.


    Проект


    Из имеющегося на данный момент в наличии железа, а именно кучки AVR Atmega 8A и FT232RL, было решено сделать переключатель, который подключается к USB порту и простым переключением тумблера меняет активный канал на другой. А так же светодиодом показывает тот, который сейчас выбран.
    Логика работы устройства очень проста:
    Несколько раз в секунду atmega проверяет состояние входов на порту C и передаёт это состояние через UART в виде символа A для первого канала и B для второго. К UART МК подключен преобразователь на FT232RL, который пересылае этот символ через USB в виртуальный COM порт сервера. На сервере работает простой демон написанный на питоне, который в случае изменения канала, выполняет команду переключения (смена шлюза по-умолчанию и статичных маршрутов, но это уже выходит за рамки данной статьи).
    Демон запускается вместе с системой, поэтому для него написан rc скрипт.
    Но обо всём по-порядку.

    Подготовка


    Исходя из задачи в пакете DipTrace была сделана схема:


    U1 это FT232RL, U3 — Atmega 8.
    S1 — тумблер переключения, который так же переключает состояние светодиода-индикатора активного канала.

    Примечание: уже после сборки узнал про свинью, которую FTDI подложила всем пользователям их чипов, так что в следующий раз дважды задумаюсь над применением их продукции. Так как отличить оригинал от подделки практически невозможно, то самым лучшим будет не играть в эту лотерею. Но так как в наличии осталось несколько их чипов, то решил делать всё-таки на них. Забегая вперёд скажу, что пляски с драйверами избежать не удалось, но в итоге удалось заставить эти чипы работать. C FreeBSD же проблем не возникло, так как там старый драйвер.

    По этой схеме была разведена плата под имеющийся корпус:



    Далее встал вопрос как делать плату. Можно, конечно, старым дедовским ЛУТом. Но есть способ лучше: заказать у китайцев. На хабре достаточно подробно описывался процесс заказа, и в почта России тоже частенько стала радовать своей работой.
    DipTrace умеет делать экспорт в формат Gerber, поэтому проблем с заказом не возникло.

    Сборка


    Через пару недель получив посылку с платами на почте, можно приступать к сборке. Так как схема очень проста, то и проблем со сборкой не возникло:





    Замечу только, что SMD компоненты паял с помощью паяльной пасты и фена. Так удобнее и получается намного качественней чем паяльником. Особенно при пайке такой мелочи как FT232.

    Настройка


    Во FreeBSD есть драйвер для чипов FTDI, поэтому проблем с подключением не возникло. Единственно, что потребовалось включить загрузку модуля ядра. В файле /boot/loader.conf прописать:

    uftdi_load="YES"
    

    Atmega была прошита с помощью avrdude, пропатченным для работы с ft232, прямо через USB подключение.
    Исходник прошивки
    /*
     * net_switch.c
     *
     * Created: 09.09.2014 10:07:41
     *  Author: exp131
     */ 
    #define F_CPU 1000000UL // Частота 1МГц, внутренний кварц
    #define BAUD 2400 // Скорость UART, 2400 хватает за глаза
    #define MYUBRR F_CPU/16/BAUD-1
    
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    // Так как не использую файл с заголовками, то описываю функцию тут
    void ReportStatus();
    
    // Обработчик прерывания по таймеру
    ISR(TIMER0_OVF_vect)
    {
    	ReportStatus(); // Вызываем отправку состояния переключателя
    }
    
    // Функция проверки входов 0 и 1, порта С и выдача в UART соответствующего символа
    void ReportStatus()
    {
    	cli(); // Отключим прерывания на время передачи
    	unsigned char a;
    	if((PINC & (1<<PINC0)) && (!(PINC & (1<<PINC1)))) // Если на С0 лог. 1 и на С1 лог 0, то
    		a = 'A'; // состояние А
    	else
    		a = 'B'; // иначе, состояние В
    	
    	// Непосредственно посылаем байт в порт
    	while(!(UCSRA & (1<<UDRE)));
    	UDR = a;
    	sei(); // возвращаем прерывания
    }
    
    //Инициализация
    void init(void) 
    {
    // Настройки UART, включена передача и установлена скорость 2400
    	UCSRB = (1<<TXEN);
    	unsigned int ubrr = MYUBRR;
    	UBRRH = (unsigned char)(ubrr >> 8);
    	UBRRL = (unsigned char)ubrr;
    // Таймер, задаём максимальный делитель и включаем прерывание по переполнению.
    	TCCR0 = (1<<CS02)|(1<<CS00);
    	TIMSK = (1<<TOIE0);
    	sei();
    }
    
    int main(void)
    {
    // Тут инициализируемся 
    	init();
        while(1) // и запускаем основной цикл
        {
            
        }
    }
    



    В качестве базы для демона нашёл в Сети класс на питоне. К сожалению ссылка на источник не сохранилась, просто приведу тут код.
    Код класса демона
    #!/usr/bin/env python
    
    import sys, os, time, atexit
    from signal import SIGTERM
    
    class Daemon:
    	def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
    		self.stdin = stdin
    		self.stdout = stdout
    		self.stderr = stderr
    		self.pidfile = pidfile
    		
    	def demonize(self):
    		try:
    			pid = os.fork()
    			if pid > 0:
    				sys.exit(0)
    		except OSError, e:
    			sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
    			sys.exit(1)
    		os.chdir("/")
    		os.setsid()
    		os.umask(0)
    		
    		sys.stdout.flush()
    		sys.stderr.flush()
    		si = file(self.stdin, 'r')
    		so = file(self.stdout, 'a+')
    		se = file(self.stderr, 'a+', 0)
    		os.dup2(si.fileno(), sys.stdin.fileno())
    		os.dup2(so.fileno(), sys.stdout.fileno())
    		os.dup2(se.fileno(), sys.stderr.fileno())
    		
    		atexit.register(self.delpid)
    		pid = str(os.getpid())
    		file(self.pidfile, 'w+').write("%s\n" % pid)
    		
    	def delpid(self):
    		os.remove(self.pidfile)
    		
    	def start(self):
    		try:
    			pf = file(self.pidfile, 'r')
    			pid = int(pf.read().strip())
    			pf.close()
    		except IOError:
    			pid = None
    			
    		if pid:
    			message = "Pidfile %s already exists. Deamon already running?\n"
    			sys.stderr.write(message % self.pidfile)
    			sys.exit(1)
    		self.demonize()
    		self.run()
    		
    	def stop(self):
    		try:
    			pf = file(self.pidfile, 'r')
    			pid = int(pf.read().strip())
    			pf.close()
    		except IOError:
    			pid = None
    			
    		if not pid:
    			message = "Pidfile %s does not exists. Daemon is not running?\n"
    			sys.stderr.write(message % self.pidfile)
    			return
    			
    		try:
    			while 1:
    				os.kill(pid, SIGTERM)
    				time.sleep(0.1)
    				
    		except OSError, err:
    			err = str(err)
    			if err.find("No such process") > 0:
    				if os.path.exists(self.pidfile):
    					os.remove(self.pidfile)
    				else:
    					print str(err)
    					sys.exit(1)
    					
    	def restart(self):
    		self.stop()
    		self.start()
    		
    	def run(self):
    		"""
    		Need to be overriden
    		"""
    		
    


    На базе этого класса был написан простой демон который слушает указанный в конфиге порт и выполняет, в зависимости от состояния преключателя, либо команду А, либо команду В.
    Конфиг
    [global]
    port=/dev/cuaU1
    rate=2400
    log=/var/log/net_switch.log
    cmdA=/bin/vist
    cmdB=/bin/unico 
    


    А вот и код самого демона:
    Код демона
    #!/usr/bin/env python
    
    import sys, os, time, serial, ConfigParser
    from daemon import Daemon
    
    class NetSwitch(Daemon):
    
    	def run(self):
    		file(self.logfile, 'a+').write("Net switch started\n")
    		while True:
    			ser = serial.Serial(self.port, self.rate, timeout=1)
    			x = ser.read()
    		        if not x == self.state:
    				self.state = x
    	                        if x == 'A':
    		            		os.system(self.cmdA)
    		                else:
    			    		os.system(self.cmdB)
    			        file(self.logfile, 'a+').write("State changed %s\n" % x)
    																																											
    			time.sleep(0.2)
    		
    	def loadConfig(self, configPath):
    	                try:
    	                        config = ConfigParser.RawConfigParser()
            	                config.read(configPath)
    		                self.port = config.get('global', 'port')
    		                self.rate = config.getint('global', 'rate')
    		                self.logfile = config.get('global','log')
    		                self.cmdA = config.get('global', 'cmdA')
    		                self.cmdB = config.get('global', 'cmdB')
    				self.state = 'A'
    				return True
    		        except:
    				return False
    		
    			
    			
    if __name__ == "__main__":
    	daemon = NetSwitch('/var/run/net_switch.pid')
    	if len(sys.argv) == 2:
    		if 'start' == sys.argv[1]:
    			print "Usage: %s start path_to_config" % sys.argv[0]
    		elif 'stop' == sys.argv[1]:
    			daemon.stop()
    		elif 'restart' == sys.argv[1]:
    			daemon.restart()
    		else:
    			print "Unknown command"
    			sys.exit(2)
    		sys.exit(0)
    	elif len(sys.argv) == 3:
    		if 'start' == sys.argv[1]:
    			configPath = sys.argv[2]
    			if daemon.loadConfig(configPath):
    				daemon.start()
    			else:
    				print "Unable to load config file\n"
    		else:
    			print "Usage %s start path_to_config" % sys.argv[0]
    	else:
    		print "Usage: %s start|stop|restart" % sys.argv[0]
    		sys.exit(2) 
    


    И в заключении, для того, чтобы демон стартовал вместе с системой, был написан rc скрипт:
    RC скрипт для запуска
    #!/bin/sh
    
    . /etc/rc.subr
    
    name=net_switch
    rcvar=`set_rcvar`
    
    #reading the config
    load_rc_config $name
    : ${net_switch_enable:="NO"}
    : ${net_switch_config:="/usr/local/etc/net_switch/config.conf"}
    
    pidfile="/var/run/net_switch.pid"
    command="/usr/local/sbin/${name}.py"
    
    start_cmd="start_cmd"
    stop_cmd="stop_cmd"
    restart_cmd="restart_cmd"
    
    start_cmd()
    {
        ${command} start ${net_switch_config}
    }
    
    stop_cmd()
    {
        ${command} stop
    }
    
    restart_cmd()
    {
        ${command} restart
    }
    
    run_rc_command "$1"
    


    Для того, чтобы демон мог стартовать вместе с загрузкой системы, нужно в /etc/rc.conf добавить строку:

    net_switch_enable="YES"
    


    Заключение


    В результате получилось забавное, но функциональное устройство. Теперь любой сотрудник находящийся ближе к серверу может переключить активный канал в случае каких-либо проблем. Так же светодиоды показывают какой из каналов на данный момент активен. Он разного цвета (зеленый и красный), так что из далека видно каким подключением пользуемся.
    И в заключении хочу сказать, что у меня ещё остались платы под это устройство, так как при заказе меньше 10 цена всё равно не меняется, так что заказал сразу 10 штук. Удобно на случай если какая-то плата будет загублена в результате кривых рук при монтаже. Если кого заинтересовал этот девайс и есть желание собрать что-то подобное — пишите в личку, готов поделиться платами.

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 61

      +11
      Как мне кажется, можно было обойтись и без контроллера. Можно установить переключатель между выводами rx и tx ft232, и проверять его состояние, посылая байты в порт. Если выключатель замкнут, байты будут возвращаться, если разомкнут — нет.
        +1
        Как раз для таких случаев, чтобы не лепить контроллер, у FT232 есть 5 выводов CBUS, которые можно использовать как порты ввода-вывода. Но для варианта с одним тумблером, конечно проще замыкать rx-tx.
          0
          Про дополнительные выводы я знаю, но насколько сложно работать с ними под Linux?
          Работа с портом очень проста — он видится как файл.
            0
            Элементарно работать. При помощи ioctl.
              0
              Я даже больше скажу, Драйверы от FTDI (и Linux и Windows) позволяют программно задавать минимум восьми ножкам микросхемы направление работы и переключать их произвольно.
              То же самое умеют делать драйверы от SiLabs с чипами CP210x (под Windows — точно, там даже можно режим с push-pull на open drain менять)
                +1
                Да, достаточно man tty_ioctl почитать, чтобы понять, как этими ногами управлять. Там и пример проверки состояния DTR есть в конце.
        +39
        А руки не чесались сделать побрутальнее? Ну как-то так:

        image

        Мелочь, но для коллектива это бы стало событием и предметом для шуток — а вам профит в виде заработанной репутации. Людям же важно не только то, «чтобы работало», но и немножко шоу.
          +21
          Тогда уже вентилем.
            +9
            Типо, сразу шейпить? Тогда уж несколько вентилей, с бирками: «Руководство», «Бухгалтерия», «Склад».
              +13
              И стрелочные индикаторы трафика от соответствующих отделов
                +1
                И боссу на стол в виде индикатор, а под ним вентиль. Чтобы сразу можно было «прикрутить» инет особо шустрым.
                0
                Ага, и на вентиле «руководство» специальные пломбы…
            +3
            А для чего внешние pull-up резисторы? Можно же включить на соответствующих ногах встроенные

            Светодиоды в идеале лучше было бы зажигать программно — желаемый стейт и так виден по положению тумблера, а какой он на деле — от софта зависит, пинов под это хватает
            Ясное дело, что не всегда есть смысл слишком заморачиваться с полной реализацией, но оставить такую возможность в железе было бы в тему, а в прошивке зажечь леды по текущей схеме
            А так можно было бы в будущем добавить веселую индикацию типа мигания при каких-то неполадках, во время переключения и тп

            Вместо пустого цикла имхо лучше уводить мк в idle — таймеры и прерывания в нем останутся, а потребление меньше и в целом красивее
              +3
              Душевно. Вопрос — а нельзя ли было просто ключ-переключатель на линии витой пары поставить? Правда в этом варианте нельзя разместить где угодно переключатель
                –2
                Если Вы о физическом ключе — баловался я как-то с такой штукой в студенчестве. Пришел добрый препод армянского происхождения, указал пальцем на сертификатор и сказал «ПрАвЭрЪ». Вобщем не комильфо. Прям так сразу результат не выдам — больше десяти лет прошло, помню только что удивился очень. Правда переключатель был сделань такой себе медной «гребенкой» которая елозила от одного набора контактов на другой.
                +3
                А через web-интерфейс почему не сделали?
                  0
                  Веб-интерфейс удобно, но тут главное было чтобы «мозг не включать». А щелкуть тумблером, чего уж проще?
                    +3
                    Во-первых, это скучно.
                    +6
                    Если уж так хотелось на микроконтроллере, есть V-USB, хватило бы одной Меги. Или даже чего попроще.
                      +2
                      Или же одной FT232 в режиме BitBang
                        0
                        Про V-USB узнал уже когда платы были заказаны. Отличная библиотека, сейчас изучаю.
                        +5
                        А что будет с офисным интернетом, если кто-нибудь догадается скрестить ваш переключатель
                        с двумя такими штуками с двух сторон?
                        image
                          +2
                          Можно было упростить, скрестив с devd.
                          Следующий этап — setfib, часть клиентов перекидываем в запасной канал.
                          Ну, и еще корректный шейпер для приоритезации типа и назначения траффика.
                            +2
                            Ожидал сложное устройство с тремя разъёмами Ethernet (два входа и «выход) и, по сути, с функциями MultiWAN-роутера. Но тоже вполне зачётно.
                              +2
                              Топикстартер знает толк в извращениях ;)
                                0
                                Возьмите микротик и не страдайте фигней.
                                  +1
                                  а смысл? у автора полноценный маршрутизатор на фряхе. переключать каналы как минимум можно автоматом по cron… единственный плюс в роутерборде — малый размер. К тому же не известно что на этом компе еще крутится
                                    0
                                    Автоматом нельзя. Ибо критерий переключения, субъективное мнение человека: «Что-то инет подтормаживает». Каналы могут работать стабильно несколько дней, а потом начаться «тормоза».
                                      0
                                      Для полноценной статистики нужно такое же устройство только не подключенное к роутеру. Главное чтоб лампочка при переключении загоралась и «тормоза» сразу уходят!
                                      Более того, можно пойти дальше и провести в офис третий виртуальный интернет канал с синей лампочкой, на котором вообще «всё всегда летать будет» :)
                                        0
                                        Полуавтоматический режим — когда инет ломается, он должен сам переключить в то же время можно переключить переключателем. Но для этого надо иметь возможность управлять светодиодами чтобы знать когда сработал автомат.
                                        –1
                                        Ну тогда я вообще ничего не понимаю. Если у него полноценный биэсди почему просто нельзя вставить в него вторую сетевуху завести туда второй канал и балансить/переключать маршруты/отслеживать длину очереди отправки на канале и т.д. И т.п. Зачем этот «понт» с переключателем? Кто за него отвечает? Какова стратегия переключения если админ заболел и один канал отвалился?
                                          0
                                          А суть в том, что один канал быстрый но лимитированый по трафику, т.е. дорогой. А второй безлимитный, но иногда бывает падает скорость. Балансировать между ними не нужно. Если дешевый не лагает — работаем через него, иначе переключаемся на дорогой. Переключение силами ближайшего сотрудника, которому достаточно просто щелкнуть тумблером. При этом все видят, что сейчас инет по дорогому каналу и лишнего не качать.
                                      0
                                      А как же SLA?
                                      я про то, что если канал упал и ваш комп-роутер перекинет канал на рабочий самостоятельно — лампочка-то останется прежней…
                                      а судя по описанию, система тут же вернётся на использование дохлого канала из-за положения тумблера.
                                        0
                                        На сколько понял из статьи, то аплинк переключается только вручную. никакой автоматики
                                        0
                                        А почему BGP не воспользовались? :)
                                          0
                                          А чем он в данном случае поможет? Тут просто два канала в инет, не факт что вообще с белыми адресами.
                                            0
                                            Фейковые AS еще никто не отменял! Да и BGP это еще и автоматическое переключение без головной боли.
                                              0
                                              А какой провайдер пустит к себе ваш BGP?
                                                0
                                                На моей практике все без исключения провайдеры шли на диалог и всячески помогали в настройке BGP, я еще раз повторяю, BGP фейковый, он ни к чему никого не обязывает!
                                                  0
                                                  Здесь же о качестве, а не о падении. Бижипи ни чем не поможет.
                                          +4
                                          А по-моему, забавно и симпатично.
                                          Реализовать то можно многими способами, просто человеку захотелось и «смоглось» именно так.
                                            0
                                            Хм. У меня расклад похожий с каналами но я поступил по другому. Переключает таки автомат, на основе пингования инетовских серверов. Постоянно пингуется гугль, яндекс, и провайдер почты, с невысокой частотой. Проверяется сколько пакетов вернулось за последние полчаса.
                                            Если оба канала примерно равны — то трафик идет по обоим, но на более слабый канал идет только 20% трафика. Если на одном из них потерь за последние полчаса примерно на 1% больше, то этот канал исключается. Плюс правится dns на внешнем серваке, чтобы люди до нас добирались по другому ip. Плюс почту шлёт, что переключился.
                                            Иногда, когда на обоих каналах проблемы, то автомат может чудить, ибо у него лаг в полчаса. Но в остальном надежность инета стала радикально выше, чем на одном канале. И никаких BGP и AS просто не надо. Такую схему можно хоть для домашнего инета развернуть. Правда роутер — полноценный писюк на линухе — убунте.
                                              0
                                              Расскажите, пожалуйста, более подробно о реализации переключении?
                                                0
                                                тупой скрипт на баше.
                                                #!/bin/bash
                                                to="name@gmail.com"
                                                log=/var/log/autoreroute.log
                                                datadir=/tmp/ardd
                                                aa="ya.ru google.com cas.dtln.ru"
                                                host=`hostname`
                                                if [ "$host" == "router1" ]; then
                                                 nhost=0
                                                 ia=( 11.11.11.1 22.22.22.1 )
                                                 gwa=( 11.11.11.2 22.22.22.2 )
                                                else
                                                 if [ "$host" == "router2" ]; then
                                                  nhost=1
                                                  ia=( 11.11.12.1 22.22.23.1 )
                                                  gwa=( 11.11.12.2 22.22.23.2 )
                                                 else
                                                  exit
                                                 fi
                                                fi
                                                mkdir -p $datadir
                                                cd $datadir || exit
                                                rm *_*_*.log
                                                ns=60
                                                n=60
                                                s=100
                                                while true
                                                do
                                                 n=$[$n+1]
                                                 if [ $n -ge $ns ] ; then
                                                  n=0
                                                 fi
                                                 for a in $aa
                                                  do
                                                  for i in ${ia[*]}
                                                  do
                                                   ping -c 6 -i 6 -n -I $i $a > ${n}_${a}_${i}.log &
                                                  done
                                                 done
                                                 for a in $aa
                                                  do
                                                  for i in ${ia[*]}
                                                  do
                                                   wait
                                                  done
                                                 done
                                                 for t in ${!ia[*]}
                                                 do
                                                  i=${ia[$t]}
                                                  v[$t]=`cat *_${i}.log | grep -F " bytes from " | wc -l`
                                                 done
                                                 so=$s
                                                 dif=$[${v[0]}-${v[1]}]
                                                 lim1=15
                                                 lim2=15
                                                 if [ $s -eq 1 ]; then
                                                  lim1=2
                                                 fi
                                                 if [ $s -eq 2 ]; then
                                                  lim2=2
                                                 fi
                                                 if [ $dif -gt -$lim1 -a $dif -lt $lim2 ] ; then
                                                  s=0
                                                 else
                                                  if [ ${v[0]} -lt ${v[1]} ] ; then
                                                   s=1
                                                  else
                                                   s=2
                                                  fi
                                                 fi
                                                 if [ $so -ne $s ] ; then
                                                  dt=`date --rfc-3339=seconds`
                                                  ip route flush table 100
                                                  ip route flush table 150
                                                  ip route flush cache
                                                  if [ $s -eq 0 ] ; then
                                                   ip route add default table 150 nexthop via ${gwa[0]} weight 3 nexthop via ${gwa[1]} weight 1
                                                   dt="$dt Both chanel up ${v[0]} ${v[1]}"
                                                   dnsi=1
                                                  else
                                                   if [ $s -eq 1 ] ; then
                                                    ip route add default via ${gwa[1]} table 100
                                                    conntrack -D -n ${ia[0]} > /dev/null 2>&1
                                                    dt="$dt Provider 2 down ${v[0]} ${v[1]}"
                                                    dnsi=0
                                                   else
                                                    ip route add default via ${gwa[0]} table 100
                                                    conntrack -D -n ${ia[1]} > /dev/null 2>&1
                                                    dt="$dt Provider 1 down ${v[0]} ${v[1]}"
                                                    dnsi=1
                                                   fi
                                                  fi
                                                  echo "$dt" >> $log
                                                  ip route flush cache
                                                  conntrack -D -s 10.0.1.6 > /dev/null 2>&1
                                                  conntrack -D -g 10.0.1.6 > /dev/null 2>&1
                                                  tst=5
                                                  while [ $tst -gt 0 ]; do
                                                   sleep 5
                                                   ssh dnseditor@ns.ourdomen.ru sudo /root/ed-dns.sh $nhost $dnsi >> $log && tst=1
                                                   tst=$[$tst-1]
                                                  done
                                                  tst=5
                                                  while [ $tst -gt 0 ]; do
                                                   sleep 5
                                                   ( echo "To: $to" ; echo Subject: auto-reroute on $host ; echo ; echo "$dt" ) | sendmail -t >> $log 2>&1 && tst=1
                                                   tst=$[$tst-1]
                                                  done
                                                 fi
                                                done
                                                


                                                Естественно, кроме него надо прописать двух провайдеров в той части где описываются интерфейсы.
                                                Плюс требуются таблицы правил. Плюс требуется настройка iptables в части nat и mangle, но это статические настройки. Они не меняются в процессе переключения провайдера.
                                              0
                                              Думал то что мне нужно. Но вчитавшись понял, что мне нужна «обратная» реализация. На основе каких-то «умозаключений», чтобы тумблер сам двигался.
                                                0
                                                В таком случае зачем «тумблер»? Если «умозаключения» могут переключить канал напрямую на сервере.
                                                  0
                                                  Да всё верно, но нужно что бы «железно» переключалось. Грозозащиту хочу.
                                                    0
                                                    Тогда управляемое реле — самое то.
                                                      0
                                                      получается 8 штук реле? ethernet
                                                        0
                                                        Есть реле с двумя группами контактов, так что 4 :)
                                                          0
                                                          А можно ссылочку, не встречал
                                                            0
                                                            Например вот такое. Но на самом деле их достаточно много разновидностей.
                                                          +1
                                                          Два реле с двумя группами контактов — редко когда используется все 4 пары кабеля. Но не так всё просто, туда нужны высокочастотные реле, иначе работать нифига не будет из-за огромных потерь на контактах и межконтактных емкостей.
                                                          Да, реле грозозащиту не обеспечивают — большинство из них рассчитано на напряжения не более 100 вольт на контактах а высокочастотные и того меньше.
                                                          Если нужна грозозащита именно на контактах то расстояние между разомкнутыми контактами должно быть сантиметров 5 и отключенные контакты надо заземлять
                                                            0
                                                            Тоесть связка ардуина, датчик грозы+ реле, не сработает?
                                                              0
                                                              Если только в качестве реле не ставить контактор от электровоза — он на 25кВ рассчитан. И то, от прямого попадания — не убережет.
                                                                0
                                                                Контакты реле прошибёт. нужна защита от грозы — изолирующий трансформатор и супрессоры до трансформатора. И супрессоры от линейного напряжения — с проводов на заземление, иначе и трансформатор прошибёт.
                                                                  +1
                                                                  Есть вариант дороже — выполните часть линии оптикой. Медь — конвертер — метр оптики — конвертер — медь.
                                                                    0
                                                                    Да уже кинули телефонный кабель в частный дом.
                                                      0
                                                      Хороший и весёлый девайс.
                                                      Можно было бы сделать не менее брутальную, но более полезную штуку.
                                                      На стороне софтверного раутера настроить source based routing. А железку в виде диммера на распбери или микроконтролере. Который управляет раутером и перебрасывает определенный процент маршрутов с одного канала на другой. Так и балансировка нагрузки происходит, и внешний вид крут.
                                                        0
                                                        Я для этого делал простую веб страничку с авторизацией, чтобы определенные люди, которым это разрешено, могли переключаться на нужный канал, когда меня нет на месте и чтобы меня не дергать. Роутер тоже был на базе компа с FreeBSD, делать железный вариант, как-то не пришло в голову :)
                                                          0

                                                          Only users with full accounts can post comments. Log in, please.