实现具有动态主机IP的域名解析
2024年03月10日
目的利用一台INTERNET DNS HOST将域名定向到家中(个人)的主机上.目前CABLEMODEM已经很快了,而且有动态IP,所以就有了将域名解析到个人机器的上可能.
只要通过很简单的设置就可以搞定.
例如你有一个域名叫yourdomain.com,你可以将此域名解析任意的主机.
1.服务器(IP:A.A.A.A)启动DNS动态解析的一个小进程.
yourdomain.com的域名文件为/var/named/yourdomain.com
再建个/var/named/yourdomain.com.static(模板文件可以用来生成yourdomain.com的)
(JDK1.3,linux,找个网管帮一下吧:)
=================================================
#原代码如下:ThreadDNSReloadServer.java
import java.io.*;
import java.net.*;
public class ThreadDNSReloadServer
{public static void main(String[]args)
{int i=1;
try
{ServerSocket s=new ServerSocket(8189);
for(;;)
{Socket incoming=s.accept();
System.out.println("accept new client:"+i);
new ThreadDNSReloadHandle(incoming,i).start();
i++;
}
}
catch(Exception e)
{System.out.println(e);
}
}
}
class ThreadDNSReloadHandle extends Thread
{public ThreadDNSReloadHandle(Socket i,int c)
{incoming=i;counter=c;}
public void run()
{try
{BufferedReader in=new BufferedReader(new InputStreamReader(incoming.getInputStream()));
String User="Unkown";
String DNSFILEPATH="/var/named/";
String DNSFILE="yourdomain.com";
String HOSTIP="127.0.0.1";
boolean USER_VALIDATED=true;
boolean done=false;
while(!done)
{String str=in.readLine();
//validate user;
if(str==null)done=true;
else
{
str=str.trim();
if(str.substring(0,2).equals("LA"))
{if(str.length()>2)User=str.substring(2);
}
if(str.substring(0,2).equals("LB"))
{if(str.length()>2)DNSFILE=str.substring(2);
}
if(str.substring(0,2).equals("LC"))
{if(str.length()>2)HOSTIP=str.substring(2);
}
if(str.trim().equals("BYE"))done=true;
}
}
incoming.close();
//加入用户验证.
//将服务器中的yourdomain.com.cn.static文件写入yourdomain.com.cn中
String DNSTMP=DNSFILEPATH+DNSFILE+".static";
BufferedReader sin=new BufferedReader(new FileReader(DNSTMP));
PrintWriter sout=new PrintWriter(new FileWriter(DNSFILEPATH+DNSFILE),true);
String s;
while((s=sin.readLine())!=null)
{
if(s.startsWith("host"))
{s="host IN A"+HOSTIP;
sout.println(s);
s=" IN A"+HOSTIP;
}
sout.println(s);
}
//System.out.println("User:"+User);
//System.out.println("DNSFILE:"+DNSFILE);
//System.out.println("HOSTIP:"+HOSTIP);
//ndc reload
String command="ndc reload"+DNSFILE;
java.lang.Runtime.getRuntime().exec(command);
}
catch(Exception e)
{System.out.println(e);
}
}
private Socket incoming;
private int counter;
}
2.客户机(windows/linux)
==============================================================
#客户端每次启动时加入到开机启动(或进程中):SockTest.java
import java.io.*;
import java.net.*;
public class SocketTest
{public static void main(String[]args)
{try
{Socket s=new Socket("A.A.A.A",8189);
BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
InetAddress localHostAddress=InetAddress.getLocalHost();//get LocalHost Ip
out.println("LAguest");
out.println("LByourdomain.com");
out.println("LC"+localHostAddress.getHostAddress());
out.close();
s.close();
}
catch(IOException e)
{System.out.println(e);
}
}
}
=========================================================
dns样本文件:(yourdomain.com.static)
ns.dnsserver.com xxxxx
xxxx
......
host IN A 127.0.0.1//此处就是要更改的地方
www IN CNAME host
...