PDA

View Full Version : Заявка от сървър до вътрешно IP



StringTheoryPracticist
06-16-2015, 08:30
На разположение имам сървър и клиент с вътрешно IP (динамично), имам root достъп и до двете. Сървъра не знае IP-то на клиента, но това не е проблем - мога да накарам клиента да праща заявка веднъж на няколко секунди/минути. След като имам това IP, в идеалния случай искам да мога да върша следните неща:
- Да пращам енкриптирани HTTP (GET / POST) рекуестове от сървъра до клиента,
- Да започна SSH сесия, пак от сървъра до клиента.

Не съм сигурен дали изобщо са възможни тези две неща, но имам алтернативни решения; голяма част от проблемите ми ще бъде решена ако науча терминологията за ситуацията ми, защото не намирам нищо в гугъл.

А между другото "клиента" има на разположение буквално около 100 KB storage space, така че съм много ограничен в това какво мога да инсталирам и трябва да може да върви на линукс без много dependencies, например ако е С код който мога да напиша или да взема от някъде, може и Bash. Колкото по-малко допълнително място се ползва, толкова по-добре. Имам на разположение wget и някои други команди. Настроен е така, че да може да се SSH-ва към него от локалната мрежа.

Едит: Мисля че може и С++. Най-вероятно може и Rust, като цяло всичко което може да се крос-компилира към ARM, но ползваме специален крос-компилатор така че съм сигурен само за С и май С++.

Едит 2: Знам че всичко е възможно ако конфигурираме рутера / firewall-a на клиента, но търсим решение в което не пипаме нищо при клиента освен софтуера му.

StringTheoryPracticist
06-16-2015, 11:28
Реших първа част от проблема си (уеб рекуест) :) остава втора - ssh от сървър до клиент. В идеалния вариант, ще може трето лице да може да прави SSH с клиента чрез сървъра, без да има руут достъп до сървъра, само юзърнейм и парола.

NomNomNom
06-16-2015, 11:47
Основни неща не си пояснил, не ми става ясно къде ти е проблема - искаш да напишеш софтуер/пакет генератор, или имаш проблем с мрежовата или сървърната конфигурация.
Или - искаш да направиш клиентската машина да се държи като сървър ? ( т.е. да ти отговаря на GET/POST , изпратени от сървъра? )

Ако искаш от server-a да пращаш GET/POST към клиента, то това означава, че клиента ти става логически сървър, т.е. трябва да го накараш да слуша на TCP порт 80/443. С wget няма да стане, а имаш ли apache?
Също, в iptables позволено ли ти е да слушаш на тези портове?

И всъщност искаш да напишеш софтуер, който ти създава сокет на клиентската машина и слуша, и отговаря на заявки?

А защо намесваш мрежовите устройства, и бтв в една лан мрежа ли са клиента и сървъра логически, routing и NAT в изрядност ли са?

едит: сега видях, че си си отговорил, ениуей.

StringTheoryPracticist
06-16-2015, 12:19
Основни неща не си пояснил, не ми става ясно къде ти е проблема - искаш да напишеш софтуер/пакет генератор, или имаш проблем с мрежовата или сървърната конфигурация.
Или - искаш да направиш клиентската машина да се държи като сървър ? ( т.е. да ти отговаря на GET/POST , изпратени от сървъра? )
Да, клиента е един вид сървър, ползвам думата "клиент" с целта да има по-малко объркване. Той вече си отговаря на локални HTTP рекуестове, но е с вътрешно/динамично IP което затруднява комуникацията с него от външния сървър.



а имаш ли apache?

Почти сигурен съм че нямам. Ползвам това което идва с BusyBox, мисля. Всичките програми в устройството заемат общо около мегабайт.



Също, в iptables позволено ли ти е да слушаш на тези портове?

-sh: iptables: not found
По принцип мога да правя изброените неща чрез локалната мрежа (HTTP и SSH). Проблема е да го направя чрез външен сървър, който ми знае IP-то.



И всъщност искаш да напишеш софтуер, който ти създава сокет на клиентската машина и слуша, и отговаря на заявки?

Не задължително, просто искам външния сървър да има достъп до изброената информация. Може да се получава като "клиента" говори със сървъра всеки няколко секунди, ще опиша с повече детайли това най-долу.



А защо намесваш мрежовите устройства, и бтв в една лан мрежа ли са клиента и сървъра логически, routing и NAT в изрядност ли са?

Знам, че ако можех да бъзикам мрежовите устройства, всичките ми проблеми щяха да се решат - просто някак казвам на рутера примерно да знае какво да пренасочва към "клиента", по този начин сървъра ще може да получи директен достъп до клиента. (Това е невъзможно защото имаме доста клиенти и не е изгодно да конфигурираме рутера на всеки един, тъй като някои са от различни континенти).




Връзката ще се започва от заявките от клиента към сървъра. След това, не знам какви са ми възможностите - може ли сървъра да ползва новонаученото IP и да му праща каквито иска рекуести? Или единственото което може е да му отговори на рекуеста с каквато иска информация.

Реших първия си проблем като ползвам изцяло заявки от клиента до сървъра - клиента пита сървъра чрез wget към динамична страница, ако сървъра иска да прати команда тогава в отговора си я изписва и клиента я изпълнява когато го получи. След това клиента може да прати своя отговор към сървъра пак чрез wget. Така може да се симулира уеб рекуест от сървъра към клиента: по заявка на сървъра, клиента може да прати wget към себе си (localhost) и да пренасочи отговора обратно към сървъра. Проблема с това е, че за да е responsive трябва да пращам заявки примерно веднъж на секунда, а това генерира трафик. (Може би има workarounds, но не съм сигурен дали ще работят тези които ми хрумнаха)

Все още не съм измислил решение на SSH. Готов съм да приема че не съществува решение ако е така, имам алтернативен план.

Най-вече ще ми е от помощ какво мога да направя от сървър към дадено IP.

StringTheoryPracticist
06-16-2015, 13:06
Сега осъзнах, че има и по-лесен начин - трябва да установя връзка от клиента до сървъра, която да трае безкрайно и да генерира възможно най-малко трафик докато не се ползва. Досега не съм работил с мрежи на такова ниво, някакви препоръки / релевантни статии?

NomNomNom
06-17-2015, 09:10
Кажи ми, каква е задачата като цяло, какво е заданието?
Защото тук виждам идеите, които ти имаш, но не виждам конкретно какво е заданието.

Трябва да направиш така, че сървъра да ти е като proxy между комуникацията между 3то лице и клиента?

StringTheoryPracticist
06-17-2015, 10:54
http://www.bath-o-matic.com

Произвеждаме high-end вани и душове както и подобни продукти, които имат микроконтролери вътре, така че могат да се управляват или конфигурират чрез уеб интерфейс без предварителна настройка - пишеш IP-то на устройството в браузъра и ти изкарва уеб апликацията. Искаме да направим така, че това да бъде достъпно и извън локалната мрежа, тъй като ваната отнема време да се напълни, така че като се прибереш вкъщи да ти е пълна вече примерно, а и поради други причини.

Не искаме да правим конфигурация на рутера на всеки клиент, затова системата трябва да работи даже и когато устройството е с вътрешно IP. Проблема е, че искаме да пращаме съобщения от сървъра до устройството, а не обратно.



Също така ъпдейт от вчера: проучвах още и засега най-доброто ми решение е да не поддържаме SSH сесии, а вместо това да има команда ShellExec, чрез която пращаш Bash код който устройството ("клиента") изпълнява. А връзката между тях мисля да направя чрез някакъв socketing API, просто инициирам от клиента енкриптирана връзка (обновявам всеки път като се прекъсне) и слушам за съобщения.

Въпросите ми обаче още важат, мисля че може да се получи по-добре ако можех да пращам неща от сървъра до клиента.

Edit: Забравих да кажа, че да, хората ще управляват устройството си чрез сървъра. Обаче това няма значение - ако мога да направя така че сървъра да управлява устройството, знам как да реша останалото.

NomNomNom
06-19-2015, 08:12
^ ако на клиента имаш wget, това ще е готино, защото като изпратиш get/post заявка, можеш да вземеш ip-то на клиента, което ще е натнато разбира се, за source tcp порт-а не съм сигурна, а там каква е схемата:

Като имаш натна рутерчето и всичко ти излиза зад едно публик ип, има нат таблица, в което е разписано точно кое вътрешно ип с какъв сорс порт комуникира, и когато комуникацията се връща наобратно, ще бъдат върнати към него.

Проблемът е наистина, че ако ти затвориш http сесията, сървърът няма да може обратно да я инициира.


Точно,трябва ти нещо, което да ти вдигне tcp сесия от клиента към рутера и от там нататък ти да си къстъмизираш пакетите, да си имаш някакви keepalive съобщения на application layer, съобщения за набиване на команди на контролера, и съобщения за обратна връзка, т.е. например връщане на някаква грешка или статус.
Но, енкрипцията как мислиш да я направиш?

StringTheoryPracticist
06-19-2015, 11:01
Аха, значи правилно съм се насочил.

За енкрипцията ще имам TLS сертификат на сървъра и от там ще разменят ключове за да енкриптират сесията. Доколкото виждам трябва сам да пиша кода за това (или да го копирам от някъде, което е г/д същото), което е притеснително, но ако внимавам сигурно ще съм ок. Ще ползвам OpenSSL. Тоя пост изглежда прави това което искам: http://www.riskcompletefailure.com/2012/09/tls-and-zeromq.html

NomNomNom
06-19-2015, 11:32
Наайс, при това на С ^ ами значи успех с писането.