LINUX.ORG.RU

TCP, файрвол. Как соединиться?


0

1

К примеру есть 2 компа - А и Б. На обоих стоит фаэрвол, блочащий запросы - т.е. никакой из компов к другому просто так подключится не может. По логике заводится 3-й комп - сервак С, который не заблочет запросы от А и Б. Вопрос - как с помощью этого сервака связать А и Б, без его дальнейшего участия в обмене данными. Т.е. он нужен только временно, чтоб связать А и Б. Зы. Решение, как понимаю есть, но где искать его описание или примеры реализации - х3.

без его дальнейшего участия в обмене данными.

ИМХО так не получится.

А открыть нужные порты на файрфолах и настроить взаимное разрешающее правило в файрволе А только для хоста В по нужному порту, и наоборот в файрволе В только для хоста А по нужному порту, а всех остальных реджектить?

adriano32 ★★★
()
Ответ на: комментарий от adriano32

А как, допустим, аудиоконфереенции в скайпе работают? Неужели весь траффик через скайпоские серваке идёт?

rip86oz
() автор топика
Ответ на: комментарий от rip86oz

Сколько раз мне ещё придётся постить эту ссылку на статью Криса?
http://www.xakep.ru/post/38543/default.asp

Как я не люблю, когда ТС не описав задачу целиком, отвергает логичные решения, вытекающие из буквального парсинга ОП.

Ты хочешь пользоваться скайпом исключительно в локальной сети, перекрыв ему кислород наружу, закрыв все порты, при этом чтобы он не мог в интернеты достучаться, но представить как это будет работать с закрытыми портами не можешь, верно?

Настрой SIP и не морочь голову.

adriano32 ★★★
()

очевидно что никак раз прямой обмен пакетами запрещён. Надеюсь ты не путаешь фаэрвол с nat.

true_admin ★★★★★
()
Ответ на: комментарий от adriano32

Нет - скайп меня не интересует. Разве что - использованные приёмы. За статью спасибо. А что такое ОП? (извините не знаю)

Мне надо установить соединение когда на обоих компах стоит брандмауэр. Пишу прогу, надо тестить не только на локалхосте, приятелю кидаю - он её тоже запускает. Но т.к. порты разные всё время , то надо проге как-то «подружится» с фаерволом. И вот не знаю как.

rip86oz
() автор топика
Ответ на: комментарий от rip86oz

Запрещёно установление соединения извне.

тогда облом.

Но т.к. порты разные всё время , то надо проге как-то «подружится» с фаерволом.

Это ещё что за трава?

Короче, ты явно с nat путаешь. Читай про universal plug and play и nat traversal.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Ничего я не путаю)) NAT, PAT и т.п. не интересует. Все порты для входящих закрыты - а пробиться надо.

Решение, отчасти костыльно, вобщем нашёл - «Одновременное открытие». Т.е. когда каждая сторона выступает в роли активной роли - клиента, и постоянно посылает SYN. И появлятся веротяность что SYN-ы от двух сторон пересекутся и они примут ответные SYN-ы как ответы от сервера. Тыц

На питоне уже скрипт опробовал - фаервол пробивается без проблем.

rip86oz
() автор топика
Ответ на: комментарий от rip86oz

Собстно если это работает то ты третий хост можешь использовать для координирование двух хостов чтобы они одновременно начали открытие и согласовали порты между собой.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Одна сторона (вторая аналогичная, только надо айпишники прописать, и поставить порты наоборот, ну и что там передавать или принимать - код уже сами пишите, т.к. этот пример только для тестирования самого коннекта, который будет использоваться в другой проге):

s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s1.bind((socket.gethostname() , port))
s1.settimeout(0.1) 

# тут надо ваш код - определение удалённого хоста и портов.... 

try :
    while True:
        try:
            s1.connect((dsthost, dstport))
            print("Will not be printed")
            break
        except socket.timeout:
            print("timeout")
        except socket.error, (errno, string):
            if errno == 10022:
                time.sleep(0.01)
            elif errno == 10056:
                print("bingo!")
                break
            elif errno == 10048:
                print("Socket already in use")
                break
            else:    
                print(errno)
        except Exception, msg:
            print(msg)

    print(str(s1.getsockname()) + " -> " + str(s1.getpeername()))

    # тут ваш код - передача данных....

    s1.close()
except Exception, msg:
    print(msg)

raw_input()

Есть некоторые ньюансы:
- постоянно, пока ещё не соединился, выдаёт 10022 ошибку, наверное из-за того что активно коннекчусь через bind-еный пассивный сокет. Кочевряжится, конечно, но таки работает.
- соединение устанавливается несколько странно - когда коннект есть, вываливается 10056 ошибка, однако после неё можно нормально передавать данные, что собственно и получилось (сами дописыайте код, если интересно, для двух сторон)
- На одной из сторон сокет почему-то не закрывается, когда close() вызываю... х3 почему. 10048 ошибка - когда опять сокет пытаюсь взять на уже открытом порту при следующем запуске скрипта

Ещё могут возникнуть вопросы зачем блокировка 0.1 секунды или сон на 10022 ошибке - ну это методом тыка всё, и не факт что вообще они нужны или значения оптимальны. Блок 0.1 думаю должен позволить дождаться SYN от другой стороны, хотя сомневаюсь, а сон - чтоб проц не жрался на цикле. Коннект устанавливается почти что сразу.

Почитал - UDP пакеты фаерволом не блочатся (хотя КИС в обучающем режиме таки спрашивает - резрешить или нет), - то можно и через UDP договариваться о TCP. Ну а так верно - 3-й комп (серв-посредник) конечно может использоваться, чтобы связать те 2 компа.

Если есть мысли по поводу того, почему сокет не закрывается или 10056 ошибки - буду рад выслушать.

rip86oz
() автор топика
Ответ на: комментарий от rip86oz

Если есть мысли по поводу того, почему сокет не закрывается или 10056 ошибки - буду рад выслушать.

ё-маё, у тебя винда... Не, не знаю :).

Маленькое замечание по коду: используй модуль errno чтобы не хардкодить номера. Это и читабельность улучшит.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Венда на работе и на ноуте - лицуха, халява... хех) Линукс дома родичам за 90 км оставил. errno - ok, в основной проге буду использовать.

rip86oz
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.