PHP ssh2_tunnel: Използване на прокси/socks хвърляне на ssh сървър?

Искам да използвам proxy/socks throw ssh сървър и намерих хубав пример от тук Как проксиирате сървър, използващ ssh (socks…), използвайки CURL на php?, но примерът не работи, ето моят код.

<?php
$connection = ssh2_connect("64.246.126.25", 22);
if(ssh2_auth_password($connection, "ubnt", "ubnt"))
{
    if ($tunnel = ssh2_tunnel($connection, "127.0.0.1", 9999))
    {
        $url = "http://checkip.dyndns.com/";
        $agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, $agent);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:9999");
        curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
        $result = curl_exec($ch);   
        echo $result;

    }else{
        echo "Tunnel creation failed.\n";
    }
} 
else
{
    echo "failed!";
}
?>

Когато изпълня този скрипт, имам отговор за грешка:

Warning: ssh2_tunnel() [function.ssh2-tunnel]: Unable to request a channel from remote host in /home/domain.com/ssh2/index.php on line 7
Tunnel creation failed. 

Ще потърся в Google тази грешка и ще се опитам да я поправя, но не мога да реша проблемите.

Някой може ли да ми помогне?


person Johnny Nguyen    schedule 31.03.2014    source източник


Отговори (1)


Изглежда, че ssh_tunnel не работи по този начин, ssh_tunnel ще поиска "$connection", за да извърши тунел към посочения ip/порт.

Във вашия код предполагам, че се опитвате да създадете локален порт, който слуша за cURL заявките като прокси, но основно вие молите ssh сървъра да се свърже със себе си (127.0.0.1).

Както можете да видите в моя пример, тунелът към Google е само поток, през който можете да изпращате заявки за поток

$connection = ssh2_connect($sshServerIP, 22);
ssh2_auth_password($connection, $sshServerUser, $sshServerPass);
$sock = ssh2_tunnel($connection, "google.com", 80);
fwrite($sock, "GET /? HTTP/1.0\r\n\r\n");
$body = "";
while (!feof($sock))
$body .= fgets($sock);
echo $body;

Можете да отворите локален порт, преди да поискате тунела към вашия ip/порт чрез:

$localsock = socket_create_listen(0);
socket_getsockname($localsock, $YourInternetIPaccessible, $openedPort);

И след това вашият код с тези промени:

$connection = ssh2_connect("64.246.126.25", 22);
if(ssh2_auth_password($connection, "ubnt", "ubnt"))
{
    if ($tunnel = ssh2_tunnel($connection, $YourInternetIPaccessible, $openedPort))
    {
        $url = "http://checkip.dyndns.com/";
        $agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, $agent);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:$openedPort");
        curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
        $result = curl_exec($ch);   
        echo $result;

    }else{
        echo "Tunnel creation failed.\n";
    }
} 
else
{
    echo "failed!";
}
person ion    schedule 20.08.2014
comment
Опитах вашия код, но сървърът не отговори, когато добавих този ред socket_getsockname($localsock, $YourInternetIPaccessible, $openedPort);. И как мога да получа $YourInternetIPaccessible в ubuntu terminal? Благодаря. - person EastBK; 20.11.2015
comment
Опитайте това stackoverflow.com/questions/18773452/ - person ion; 21.11.2015
comment
Тествахте ли вече своя код? Опитах, но получавам грешка на този ред socket_getsockname($localsock, $YourInternetIPaccessible, $openedPort);. - person EastBK; 21.11.2015
comment
Каква е грешката, не може да създаде сокет за слушане? - person ion; 22.11.2015