Что нового

Порт-форвардинг, поброс портов средствами AutoIt

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Всем доброго времени суток...
Задача написать на AutoIt :IL_AutoIt_1: простенький апп, суть-задача которого проброс портов (port forwarding). А именно функционал который перенаправляет TCP трафик принятый на одном порту, на конкретный порт другого адреса в сети.

А вопрос собственно, не столько в проблеме реализации, сколько в концепции.
Какие могут быть "подводные камни" ? О чем следует позаботится ?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Отправитель (можно запускать скрипт из окна SciTE)
Код:
$address = "127.0.0.1"
$port = 12345

UDPStartup()

$sock = UDPOpen($address, $port)

$hGUI = GUICreate("отправка сообщения", 500, 80, -1, -1, -2134376448, -1)
GUICtrlCreateLabel("отправка сообщения", 10, 20, 110)
$nInput = GUICtrlCreateInput("", 130, 18, 350, 20)
$nOk_Btn = GUICtrlCreateButton("Отправить", 110, 50, 90, 25)
$nCancel_Btn = GUICtrlCreateButton("Выход", 305, 50, 90, 25)

GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case -3, $nCancel_Btn
            ExitLoop
		Case $nOk_Btn
			$message = GUICtrlRead($nInput)	; <--- главное
			UDPSend($sock, $message)		; <--- тут
			GUICtrlSetData($nInput, "")
	EndSwitch
WEnd

GUIDelete($hGUI)

ПЕРЕКЛАДЫВАТЕЛЬ :rofl: (откомпилировать и запустить exe-шник)
Код:
$in_address = "127.0.0.1"
$in_port = 12345

$out_address = "127.0.0.1"
$out_port = 12346

UDPStartup()

OnAutoItExitRegister("Cleanup")  ; это нужно для закрытия порта при выходе

$in_socket = UDPBind($in_address, $in_port)  ; слушать port
If @error <> 0 Then Exit
$out_socket = UDPOpen($out_address, $out_port)

While 1
    Local $data = UDPRecv($in_socket, 50)
    If $data <> "" Then
		ToolTip("перебрасываю: " & $data, 0, 0)
        UDPSend($out_socket, $data)
    EndIf
    Sleep(100)
WEnd

Func Cleanup()
    UDPCloseSocket($in_socket)
    UDPShutdown()
EndFunc

Получатель (откомпилировать и запустить exe-шник)
Код:
$address = "127.0.0.1"
$port = 12346

UDPStartup()

OnAutoItExitRegister("Cleanup")  ; это нужно для закрытия порта при выходе

Local $socket = UDPBind($address, $port)  ; слушать port
If @error <> 0 Then Exit

While 1
    Local $data = UDPRecv($socket, 50)
    If $data <> "" Then
        MsgBox(4096, "UDP DATA", $data, 1)
    EndIf
    Sleep(100)
WEnd

Func Cleanup()
    UDPCloseSocket($socket)
    UDPShutdown()
EndFunc

:stars: :beer:
 
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Спасибо,C2H5OH
Мне просто интересно, почему UDP ? :scratch:
т.к. я даже не могу придумать юзкейс :smile:
Я конечно имел в виду TCP трафик.

Моя проблема в том, что я практикую Qt(GUI), node.js(server side), а соответсвенно ООП, или функциональное программирование, при том многопточное :blink:

А в данном контексте передо мной стоит задача реализации сего по правилам процедурного программирования, и я не могу разложить для себя концепт,
т.е. логику.
Основным вопросом, для меня остается правильный размер чанка(chunk), ну т.е. куска принятой информации, перенаправляемой.
Ну и собственно конкуренция буфферов, во время ожидания ответа.
Не могу определиться, делать ли так что 1апп - 1порт, или все таки заложить все в один апп.



Добавлено:
Сообщение автоматически объединено:

PS: Я бы с радостью сменил инструмент... У AutoIt есть множество более практичных применений.
Но в данном случае так надо, ну и я все таки питаю спортивный интерес по этому поводу.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Мне просто интересно, почему UDP ?
Да просто под рукой готовые скрипты были. ;D
http://autoit-script.ru/index.php/topic,9243.msg61935.html#msg61935

Кстати, посмотри в Help пример по TCPRecv :smile:
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Вот то с чем я работал :smile:
Но напомню что в автоит нет многопоточности, что будет очень тормозить передачу данных через это
Код:
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.8.0
 Author:         WINSTAN

 Script Function:
	Зеркало портов

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here
$t=16
Global $ConnectedSocket[$t], $SendSocket[$t]
$ip="127.0.0.1"
$port=2105

TCPStartup()
$MainSocket = TCPListen('127.0.0.1', 2106,  $t+1 )
For $i=1 to $t-1
$ConnectedSocket[$i]=-1
Next

While 1
For $i=1 to $t-1
if $ConnectedSocket[$i]=-1 Then
	$ConnectedSocket[$i]=TCPAccept($MainSocket )
	If $ConnectedSocket[$i]=-1 Then
		ExitLoop
	Else
		$SendSocket[$i]=TCPConnect($ip,$port)
		ConsoleWrite("Поток № "&$i&" Открыт"& @CRLF)
	EndIf
Else

	$data=TCPRecv ($ConnectedSocket[$i],1000000)
	if @error Then $ConnectedSocket[$i]=-1
		if $data<>""Then
			TCPSend($SendSocket[$i],$data)
			if @error Then $ConnectedSocket[$i]=-1
			ConsoleWrite("Поток № "&$i&" Отправка [Начало]>>>>>>>>>>=========================="& @CRLF)
			ConsoleWrite($data& @CRLF)
			ConsoleWrite("Поток № "&$i&" Отправка [Конец] >>>>>>>>>>=========================="& @CRLF)
		EndIf

	$data=TCPRecv ($SendSocket[$i],1000000)
	if @error Then $ConnectedSocket[$i]=-1
		if $data<>""Then
			TCPSend($ConnectedSocket[$i],$data)
			if @error Then $ConnectedSocket[$i]=-1
			ConsoleWrite("Поток № "&$i&" Приём [Начало]<<<<<<<<<<============================="& @CRLF)
			ConsoleWrite($data& @CRLF)
			ConsoleWrite("Поток № "&$i&" Приём [Конец] <<<<<<<<<<============================="& @CRLF)
		EndIf
EndIf
Next
WEnd
 

forumrulez

Новичок
Сообщения
3
Репутация
0
Давно ищу способы пробросса порта, это действительно будет работать?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Писал человеку за деньгу подобную программу, только она вдобавок еще и на другой IP перенаправляла. Но заказчика не устроила скорость передачи данных (ну кто же знал что ему в секунду нужно мегабиты данных передавать). Программа так и лежит.
Кстати в связи с отсутствием многопоточности программа работает очень очень медленно.
 

forumrulez

Новичок
Сообщения
3
Репутация
0
Скажите а каким образом у Вас получается задать настройки роутеру если на нем установлен логин и пароль?, я пробовал подключаться через telnet\ssh для выполнения проброса порта, но без указания пароля фиг, Вы вашу программу сможете выложить или продать?, если да, за сколько?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
forumrulez
Программа ничего не обходила. Просто человеку требовалось пересылать принимаемые HEX данные на другой ip и порт. Вот и все.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
forumrulez сказал(а):
Скажите а каким образом у Вас получается задать настройки роутеру если на нем установлен логин и пароль?

Единственный способ - UPnP (реализовано в большинстве торрент клиентах), но в "правильном" роутере он, как правило, отключен.
 

forumrulez

Новичок
Сообщения
3
Репутация
0
UPnP, да, но какими средствами его настроить, я слышал мол многопоточные сокеты могут..
 

djasup

Новичок
Сообщения
64
Репутация
1
подскажите пожалуйста как отправить данный с определенного порта, у нас в сети многие порты блоикируются например код
Код:
Local $g_IP = "127.0.0.1"

; Start The TCP Services
;==============================================
TCPStartup()

; Connect to a Listening "SOCKET"
;==============================================
Local $socket = TCPConnect($g_IP, 65432)

настраивается на отправку по айпи 127.0.0.1 и порт 65432 , а вот с какого порт он будет отправлять, когда я буду использовать TCPSend ?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
а вот с какого порт он будет отправлять, когда я буду использовать TCPSend ?

У меня такой же интернет как и у Вас

http://ru.wikibooks.org/wiki/TCP/IP
Код:
Клиент, начиная соединение, запрашивает у своей ОС какой-нибудь незанятый порт во временное пользование, и указывает его в посланных пакетах как порт источника. Затем на этот порт он получит ответные пакеты от сервера.
 
Верх