conexión a través de 'proxy'

NeB1

Buenas a todos,

Tengo una aplicación que se instala en clientes, y periódicamente hace consultas a un servidor en internet. Pero resulta que hay un cliente que cada vez que abre el internet explorer por ejemplo, la conexión le redirige a una web 'http.internetpsa.inetpsa.com' y les obliga a poner usuario y contraseña.

Por lo tanto mi conexión no consigue acceder a internet. Conoceis como configurar estas opciones antes de realizar una conexión en tu propia aplicación? el tema es que ni siquiera es lo típico de 'usar servidor proxy: 167.120.3.10' o sí que es lo mismo y yo no lo sabía, nuse.

Voy a seguir investigando, pero si alguien conoce algo me hace un favor.

Estoy gastando c#.net

Soltrac

Con qué te conectas? Es decir, pastéame tus código de conexión.

NeB1

Mediante Xml-rpc


[XmlRpcUrl("http://direccion")]
public interface IMblue : IXmlRpcProxy
{
    [XmlRpcMethod("server.campanyasActivas")]
    string campanyasActivas(int data);
    [XmlRpcMethod("server.comprobarMovil")]
    string comprobarMovil(string btAddress, string idCampanya);
    [XmlRpcMethod("server.resultadoEnvio")]
    string resultadoEnvio(string idCampanya, string btAddress, int responseCode);
    [XmlRpcMethod("server.entradaWatchdog")]
    string entradaWatchdog(string message, int messageCode, string idCampanya);
    [XmlRpcMethod("server.dispositivoEncontrado")]
    string dispositivoEncontrado(string idCampanya, string btAddress);
    [XmlRpcMethod("server.testServer")]
    string testServer();
    [XmlRpcMethod("server.comprobarPass")]
    string comprobarPass(string mac);
    [XmlRpcMethod("server.actualizarPass")]
    string actualizarPass(string newPass);
    [XmlRpcMethod("server.descargarCampanyas")]
    bool descargarCampanyas(string mac);
    [XmlRpcMethod("server.cargarEstadisticas")]
    bool cargarEstadisticas(string mac);
}
LOc0

NO es la solución que buscas, pero temporalmente a lo mejor te sirve conectar a través de una web tipo anonymouse. Por ejemplo:

http://anonymouse.org/cgi-bin/anon-www.cgi/http://www.mediavida.com

Salu2 ;)

NeB1

no podrá acceder a dicha web supongo, no?. Es una empresa que capa la conexión a internet a no ser que pases por su 'proxy'.

dagavi

No tendría mucha lógica. Si para acceder a una web pasas por el proxy ese, para acceder a anonymouse también.

LOc0

No lo había entendido bien. Pensé que el proxy era cosa del explorer. Por lo visto no hay salida a internet si no es a través del proxy y con autenticación. Con sockets a pelo es cuestión de usar las cabecera Proxy-Authorization pero en .Net no sé, sorry :(

Salu2 ;)

NeB1

#7 si te dijera de hacerlo en php por ejemplo, ¿Sabrías? es algo rollo las cabeceras que envías con fsockopen cuando quieres enviar datos por post??


$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

o sea, son cabeceras http??

LOc0

Hola. Sip, es una cabecera HTTP. Suponiendo que es autorización básica la del proxy:

$fp = fsockopen(IP_PROXY, PUERTO_PROXY, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: http://www.example.com\r\n";
$out . = "Proxy-Authorization: Basic " . base64_encode( "$user:$pass" ) . "\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}

Salu2 ;)

NeB1

#9 eres el amo pues, mañana podré probar a ver si así funciona, aun estoy un poco exceptico porque es un poco rara la forma de funcionar ese 'proxy'. Pero los informáticos de allí me han dicho que es un proxy... veremos

thanks!!

LOc0

Y haces bien en ser escéptico Nah, es coña :P. De todas formas, hay 3 tipos de autenticación:

Basic: user y pass en claro (BASE64, pero en claro).
Digest: envías un hash de la pass.
NTLM: historieta de Microsoft con pregunta-respuesta (tito Google).

¡Suerte!

PD: si tienes una máquina de prueba en esa red con Linux, instálate el comando curl y prueba a conectar a alguna web poniendo los datos de proxy, pass, etc (curl soporta todos los tipos de autenticación HTTP). http://linux.about.com/od/commands/l/blcmdl1_curl.htm También tienes CURL desde PHP http://php.net/manual/es/book.curl.php

NeB1

gracias ^^

Me es imposible siquiera hacer pruebas con esa máquina. Mañana me dejan abierto un escritorio remoto de 12 a 3, bajo supervisión en directo de dos informáticos xDDDD Así que voy a preparar un par de scripts que realicen la authentificación y me envien algún dato. En caso de recibirlo ya les puedo crear un instalador de la aplicación real.

El cliente se encuentra en portugal, y la empresa es bastante tocha (de hecho todos la conoceis) y tienen una seguridad muy estricta. Además me juego el culo a que está todo basado en windows server.

De todas formas gracias porque no tenía ni idea de esto de la autentificación de los proxys y no sabía como conseguir información, porque proxy + cualquier cosa me daba billones de resultados!

erdanblo

mpsa? ¿citroën / peugeot?

mmm

Si, es un proxy. De hecho, si abres un terminal e intentas hacer un ping, no te va a responder (como si no tuviese conexión).

Lo que hay que ver es como hace el auth, porque donde yo trabaje y lo usaban (con ISA Server), la autentificación se hacía contra el dominio, pero para navegar no tenias que ir a ninguna página a poner usuario / pw, directamente al loguear con tu cuenta de usuario en el equipo, ya te dejaba acceder o no a internet el proxy (Isa server).

LOc0

#13

Es que falta el cuarto tipo de autenticación: C-U-S-T-O-M pero tp quería que Neb1 se fuera a la cama llorando xD

Salu2 ;)

NeB1

#13 citröen. Que conocías el servidor proxy que he puesto? Ellos acceden a una web para hacer la autentificación, eso es lo que me rallaba, pero de todas formas no sé nada de autentificación a través de proxys, voy a empaparme un poco.

#14 xDDD

NeB1

Al final no han podido dejarme el escritorio remoto hoy, se aplaza el resultado :(.

NeB1

Una pregunta sabios de mediavida. Como el tio está en portugal, para ir yo haciendo pruebas de la aplicación, me gustaría saber si hay proxys con autentificación de prueba, gratuitos, para realizar una conexión a internet a través de ellos

LOc0

En tu caso lo mejor sería con un sniffer intentar ver cómo se autentica el navegador web con el proxy para salir de dudas, pero no tienes acceso a la red de momento :(... Podrías montarte un proxy y trastear (freeproxy o squid por ejemplo), pero al final puede que allí tengan un método de autenticación "especial".

¡Suerte!

Salu2 ;)

NeB1

me han dicho que gastan una conexión vía proxy normal, Basic :D

Ahora quiero enviarles una pequeña app para verificar que consiguen conectar a mi dominio.he hecho lo siguiente:

WebRequest webRequest = WebRequest.Create("http://publitool.managerbluetooth.com/test.php");            
WebProxy myProxy = new WebProxy(); MessageBox.Show("http://" + this.url.Text + ":" + this.puerto.Text); Uri newUri = new Uri("http://" + this.url.Text + ":" + this.puerto.Text); myProxy.Address = newUri; //myProxy.Credentials = new NetworkCredential(this.user.ToString(),this.pass.ToString()); webRequest.Proxy = myProxy; webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.Method = "POST"; byte[] bytes = Encoding.ASCII.GetBytes("nombre=jordi&apellido=nebot"); Stream os = null; try { webRequest.ContentLength = bytes.Length;
os = webRequest.GetRequestStream(); os.Write(bytes, 0, bytes.Length);
} catch (WebException ex) { MessageBox.Show(ex.Message, "ERROR HTTP", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { if (os != null) { os.Close(); } } try { WebResponse webResponse = webRequest.GetResponse(); if (webResponse == null) { ReceivedData.Text = "No hay datos recibidos"; } StreamReader sr = new StreamReader(webResponse.GetResponseStream()); ReceivedData.Text = sr.ReadToEnd().Trim(); } catch (WebException ex) { MessageBox.Show(ex.Message, "Error HTTP", MessageBoxButtons.OK, MessageBoxIcon.Error); }

Y estoy intentando conectar al archivo 'test.php' que me dice 4 tonterías. Si no uso proxy (comento las lineas relativas al proxy) va bien. Si uso un proxy sin credenciales, usando un proxy de por ahí, ya no funciona.

Alguna idea?

LOc0

Lo primero es conseguir un BUEN proxy para pruebas. Algunos no admiten POST. Te pongo unos cuantos probados hace una hora:

[i]Editar 	Borrar 	221.130.13.48 	80
Editar 	Borrar 	221.130.13.38 	80
Editar 	Borrar 	221.130.17.62 	80
Editar 	Borrar 	221.130.7.227 	80
Editar 	Borrar 	211.138.124.211 	80
Editar 	Borrar 	221.130.17.61 	80
Editar 	Borrar 	41.208.14.4 	80
Editar 	Borrar 	194.42.116.106 	80
Editar 	Borrar 	221.179.35.87 	80
Editar 	Borrar 	221.130.162.244 	80
Editar 	Borrar 	61.138.99.178 	808
Editar 	Borrar 	221.130.7.226 	80
Editar 	Borrar 	221.130.13.41 	80
Editar 	Borrar 	221.130.13.39 	80
Editar 	Borrar 	221.130.17.128 	80
Editar 	Borrar 	221.130.17.137 	80
Editar 	Borrar 	218.201.21.176 	80

Salu2 ;)

NeB1

#20 Ostia pues tienes razón, no sabía que desactivaban peticiones post. La primera en la frente, 4 servers de esa lista que he probado, 4 que ván.

Te ví a tener que invitar a una cerveza o algo xD

Voy a buscar a ver si hay alguno que tenga autentificación habilitada y algún usuario con password, pero vamos, me extrañaría mogollón xD. Si nos me arriesgaré y le envío directamente el ejecutable tal y como está, y rezaré para que la parte de usuario y password no dé errores.

NeB1

Se me ha olvidado ponerlo, pero ha ido todo perfecto a la primera, el primer ejecutable que le he pasado y a ido bien, y después le he pasado para hacer lo mismo pero con otro método, y también ha funcionado.

Muchas gracias!

LOc0

¡ Prueba superada ;) !

Salu2 ;)

NeB1

#23 bueno, ahora si que prueba superada, porque eso era la parte .net, después tenía que hacer algo parecido pero en PHP para otra cosa, y el código ha quedado así:


	if( empty($this->proxy) )
	{
		$fp = @fsockopen($this->server, $this->port);
		$request  = "POST {$this->path} HTTP/1.0$r";
		$request .= "Host: {$this->server}$r";
		$request .= "Content-Type: text/xml$r";
		$request .= "User-Agent: {$this->useragent}$r";
		$request .= "Content-length: {$length}$r$r";
		$request .= $xml;
	}
	else
	{
		$fp = @fsockopen($this->proxy, $this->port);
		$request  = "POST {$this->path} HTTP/1.0$r";
		$request .= "Host: {$this->server}$r";
		if(!empty($this->userproxy))
			$request .= "Proxy-Authorization: ".base64_encode($this->userproxy.":".$this->passproxy)."$r";
		$request .= "Content-Type: text/xml$r";
		$request .= "User-Agent: {$this->useragent}$r";
		$request .= "Content-length: {$length}$r$r";
		$request .= $xml;			
	}

y nada, ningún error, aparte de haber estado 10 minutos haciendo el gilipollas probando a conectarme a local a través de un proxy sin darme cuenta xD

ahí dejo el código por si a alguien le interesa.

Bueno! falta testear la autentificación, pero si es esa cabecera, todo debería ir guay.

LOc0

No te olvides del Basic (si es que es Basic):

"Proxy-Authorization: Basic " . base64_encode( "$user:$pass" ) . "\r\n";

El Basic puede ser case-sensitive.

Salu2 ;)

NeB1

#25 al escribir Basic o basic?

LOc0

La palabra Basic es la que en algunos servers tiene que ser tal cual (otros se tragarán bAsIc o lo que sea xD).

Edito: si tienes que trastear en PHP (o para otros proyectos) a lo mejor te viene bien -> http://www.mediavida.com/foro/9/fastcurl-388430

<?php

require_once('FastCurl/FastCurl.inc');

$fc=new FastCurl('http://loquesea');
$fc->proxy='123.123.123.123:8080';
$fc->proxyuserpwd='user:password';
$fc->enable_post($xml, ' text/xml');

echo $fc->exec();

unset($fc);

?>

Salu2 ;)

Usuarios habituales

  • LOc0
  • NeB1
  • erdanblo
  • dagavi
  • Soltrac