Уже больше года периодами поднимал для себя вопрос как организовать по двум каналам гарантированную доставку трафика.
Все варианты с перебрасыванием маршрутов, переконнектом ОпенВПН при попадании одного и т.д. отбрасывались по причине - это время реакции.
К примеру есть сервер дома, у него два независимых провайдера в инет.
И есть сервер, к примеру в германии. Необходимо, что бы пакет пришедший на сервер в Германии попал на домашнюю машину.
100% гарантии никто и никогда конечно не получит, но бывает ситуация, что на основном (используемом в данный момент) канале (админ свич перетыкал) пропадет инет на пару секунд, а для софта это критичное время.
Поэтому решил сам для себя сваять небольшую софтину которую и представляю на ваше рассмотрение.
Исходные данные два сервера, один дома (два канала интернета), второй в Германии два ИП адреса.
На одном и на втором сервере запускается dtun (dounle tunnel, так мне захотелось назвать)
dtun [-b][-h]
-b|--bg : start in background, default - none
--s1=ADDRESS : remote server 1 IP, default - 127.0.0.1
--s2=ADDRESS : remote server 2 IP, default - 127.0.0.1
--p1=PORT : remote server 1 Port, default 4444
--p2=PORT : remote server 2 Port, default 4444
--tapN=NUMBER : local tap interface number, default - 0
--tapA=ADDRESS : local tap interface address, default - 192.168.0.1
-h|--help : this help
-b|--bg - заставляет работать в фоне
--s1=ADDRESS первый адрес удаленной машины
--s2=ADDRESS второй адрес удаленной машины
--p1=PORT - порт первого адреса
--p2=PORT - порт второго адреса
--tapN=NUMBER номер локального tap интерфейса
--tapA=ADDRESS адрес локального tap иртерфейса
-h|--help хелп он и в африке хелп.
При запуске поднимается tap интерфейс и все приходящие на него пакеты будут отсылаться по udp протоколу на два адреса удаленного сервера. На удаленной стороне точно так же.
Все приходяшие на локальный порт пакеты транслируются в локальный tap интерфейс. Дублирующий пакет (пришедший по второму каналу) просто игнорируются.
Исходники и скомилированный под х64 бинарик тут Здесь
Пример запуска
/dtun/dtun --lport 5001 --s1 21.22.23.24 --s2 21.22.23.25 --p1 5001 --p2 5001 --tapN 1 --tapA 192.168.2.1 -b
Пока конечно все сыро - поэтому сильно не пинайте, но работает и приносит пользу.
Для тех кто будет ковырять исходники.
Пока нет проверки порядка прихода пакета, они конечно же нумеруются. Но все пакеты попадают в буфер. В дальнейших планах сделать проверку очередности и контроль. (Хотя особого смысла наверное не будет).
Отсылаемые пакеты пакуются lzo - поэтому перед компиляцией установите lzo-devel - есть ли смысл, пока не знаю, немного грузит проц.
За основу взяты исходники простого туннеля, найденные не помню даже где, самому писать тяжеловато.
Сам в сях я не очень, но как говорится если надо то надо. Поэтому сильно не пинайте. Может, наоборот, кто то доделает по уму, думаю многим пригодится.
Обмен построен на udp по принципу отправил и забыл.
То есть нет понятия нормального соединения, когда один сервер с реальным ИП а второй за натом, просто так работать не будут, для второго надо пробрасывать порт с файрвола. Это с одной стороны минус, а с другой нет понятия никаких таймаутов.
Т.е. если сервер за натом то соответственно он должен инициировать соединение и необходимо его контролировать.
Здесь же пакеты просто уходят по назначению и все. Контроль уже ложится например на ТСП соединение которое строится по этому туннелю.
Наверное так.
Надеюсь попал по адресу и кому то будет интересно.