我注意到BT Home正在从它们的DNS服务器发回虚假的DNS结果,并且这允许网站绕过我在防火墙中阻止的IP地址,所以我期待创建我自己的DNS中继/服务器。端口53上的DNS中继UDP
到目前为止,我可以接收UDP端口53上的请求,并将它们发送到DNS服务器并获取有效的byte []流结果,然后使用远程客户端端口向浏览器发回请求,但是浏览器只是再次发送请求。
我测试了套接字的代码,结果工作正常,但由于某种原因IE/FF根本不会除结果。
public void Listen()
{
receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
receiveEndPoint = new IPEndPoint(IPAddress.Any, receivePort); receiveSocket.Bind(receiveEndPoint);
receivePort = (receiveSocket.LocalEndPoint as IPEndPoint).Port;
receiveBuffer = new byte[BufferSize];
receiveAsyncResult = receiveSocket.BeginReceiveFrom(receiveBuffer, 0, receiveBuffer.Length, SocketFlags.None, ref receiveEndPoint, new AsyncCallback(NetworkMessageReceivedCallback), receiveSocket);
}
public void NetworkMessageReceivedCallback(IAsyncResult asyncResult)
{
EndPoint remoteEndPoint = null;
byte[] bytes = null;
remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); //Will contain the clients port
int bytesRead = receiveSocket.EndReceiveFrom(asyncResult, ref remoteEndPoint);
bytes = new Byte[bytesRead];
Buffer.BlockCopy(receiveBuffer, 0, bytes, 0, bytesRead);
//string ip = "208.67.222.222";
string ip = "192.168.1.254";
IPAddress dnsServer = IPAddress.Parse(ip);
Response R = Resolver.Lookup(bytes, dnsServer);
receiveSocket.SendTo(R.Message , remoteEndPoint);//127.0.0.1
receiveSocket.Close();
Listen();
}
几乎所有的操作都是UDP。只有AFXR,DNSSEC和不常见的大于512字节响应的情况才需要TCP。 – jweyrich 2010-10-13 23:31:55