21Oct/091
MSN机器人 – 另类内外网通信方法
一直想学习学习linux,于是乎便在工作室的服务器上放了一个fedora的虚拟机。平日在工作室想玩linux的时候就ssh登陆过去,不想玩了就关掉,“不亦悦乎”。可是工作室的服务器是校园网的,宿舍的网络是电信网的。于是在宿舍时就没法用了,这么放弃?显然不符合我的风格。于是琢磨着如何实现在宿舍与工作室的通信。
首先想到的就是教育网代理,但教育网代理不稳定,而且经常挂掉,于是pass。接着便想到自己来写一个代理。反正ssh是基于tcp的,写个tcp的代理就可以对所有基于tcp的协议有用。为了实验可行性,随手建了一个Console Application. 分别new 一个TcpClient和TcpListener. TcpClient 用于同linux通信,Tcplistener用于与ssh客服端通信。然后建立两个线程,一个用于将从TcpClient收到的数据交给TcpListener,另一个相反。如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace TestSSH
{
class Program
{
static void Main(string[] args)
{
//A local port for ssh client
TcpListener listener = new TcpListener(new IPEndPoint(new IPAddress(new byte[] { 127, 0, 0, 1 }), 1243));
listener.Start();
var socket = listener.AcceptSocket();
var client = new TcpClient();
//The target linux.
client.Connect(new IPEndPoint(new IPAddress(new byte[] { 114, 212, 2, 36 }), 22));
var cl = client.GetStream();
byte[] buff1 = new byte[4096];
byte[] buff2 = new byte[4096];
new Thread(() =>
{
while (true)
{
int len = socket.Receive(buff1, 0, 4096, SocketFlags.None);
if (len > 0) { cl.Write(buff1, 0, len); }
}
}).Start();
new Thread(() =>
{
while (true)
{
int len = cl.Read(buff2, 0, 4096);
int offset = 0;
while (offset < len)
{
offset += socket.Send(buff2, offset, len - offset, SocketFlags.None);
}
}
}
).Start();
}
}
}
然后打开PuTTY, 连接本地1243端口,顺利建立连接,屏幕显示:"Login As:"。
于是第一步就算完成了,证明了TCP代理可行。
下一步就是寻找一个宿舍和工作室都能访问到的地方来放这个代理了。不过这到成了一个难题,手头没有公网服务器,临时租个VPS又不太现实。
于是面临两种选择,要么,放到同学的服务器上,要么另寻出路。于是乎想到了MSN机器人。即利用MSN机器人做消息的转发。
举个例子,用ssh登录时,linux首先要发送自身的信息给客户端,如果用MSN机器人转发,消息的传递路径如下:

转载请注明出处:http://pnuts.cc/2009/10/msnrobot/
To be Continued...

October 30th, 2011 - 18:07
Carson awesome blog, i really love it!