windows server 2008 DNS ,DHCP(支持IPv6) 配置说明:
在配置之前首先为本机设置好静态IP,包括ipv4 和ipv6 还有相应的网关和dns服务器。
配置 DNS服务器:
打开 开始->管理工具->服务器管理器,单击角色 在右边会出现角色窗口,选择 添加角色。然后依照服务器安装向导依次添加相关的信息。创建正向查找区域(主要负责解析本地资源的DNS名称)-〉选择“这台服务器维护该区域”-〉输入本地域名或者一个域的一部分(如ingrasys.com.cn)-〉创建该域名对应的文件(ingrasys.com.cn.dns)-〉选择是否动态更新-〉选择是否转发查询-〉完成。
为DNS服务器添加相应的记录,添加主机到相应域。(首先在正向查找域内添加本机的记录ipv4的和ipv6的都需要添加)打开要添加主机的域,在域内右键单击,选择下拉菜单的新建主机(A或AAAA)(需要输入主机名 和主机对应的IP地址,A代表ipv4的主机 AAAA代表ipv6的主机)。此外还可以添加别名,就是为已经存在的主机 另起一个名字去指向它。
添加反向查找区域(如果是小型网络可以不添加),这样的区域一般都是对应已经存在的正向查找区域的,反向查找区域包括ipv4区域和ipv6区域,注意的是 反向查找区域 ipv4 的文件名会自动出现,但是ipv6的需要自己添加应该是网段的反写后面加上ip6.arpa.dns(例如 网段是2001:da8:207::0/64 文件名为 0.0.0.0.7.0.2.0.8.a.d.0.1.0.0.2.ip6.arpa.dns).在区域内右键选择 新建指针 然后再新出现的窗口上浏览选择要指向的主机则主机地址会自动出现(ipv4 的相同)。
如果一个主机要加入域,应该由域管理员在正向查找域内添加新的记录,在反向查找域内添加相应的指针。
配置DHCP服务器:
单击添加角色,选择DHCP服务器 按照服务器安装向导依次填写相应信息。填写的时候一定注意自己前面设置的相关内容,需要 对应的域名 本机的ipv4 地址 ipv6地址 和 网关 。设置DHCP动态分配的ip地址的范围。(注意验证服务器是否有效。)
这样基本就配置完成了。
目前来看:ipv6 windows XP还不能很好的支持,在DHCP服务器自动分配的时候会无法获得 应该打sp4补丁包才行。或者windows visita 以上版本都可以(winserver 2008,win7等等)
Linux 下配置DNS,DHCP注意事项:
解析器文件
a. /etc/hosts.conf (确定本机域名解析顺序)
b /etc/hosts (客户机混存dns数据库)
c /etc/resolv.conf (定义了搜索域,定义dns服务器地址)
linux默认解析顺序 hosts.conf->hosts->resolv.conf->DNS服务器
设置开机自动启动DNS: #setup 进入图形化设置
服务控制脚本位置: /etc/rc.d/init.d/
设置主机名 /etc/sysconfig/network ,网卡设置 /etc/sysconfig/network-scripts/ifcfg-eth0
BIND软件
]
安装后 一般分为两部分, 配置文件 在/etc下, DNS记录文件 /var/named 目录下 一般named.conf为主配置文件 需要自己根据样例自己编写。named.ca 指向根域名服务器, named.local 用于本地转换回送地址 ,named.hosts 将主机名影射为IP地址
在正向解析文件 和反向解析文件中 IN不能顶格写,而主机名必须顶格写 否则会出错。 在反解析文件中PRT最前面的数字是IP地址的最后一段数字。
VC下的解析hostname 到IP地址的函数
1 解析IP地址的程序
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib, "ws2_32.lib ")
using namespace std;
//**********************************************************************************************************//
// 功能: 将已知的主机名解析成对应的IP地址。
// 参数:要转换的hostname。
// 参数:一个指针数组,用于存放解析好的IP地址。
// 返回值:如果查询正常,返回IP地址的个数;否则,返回。
// 注意:由于在程序中为参数的指针动态分配了存储空间,使用后需释放掉;
//**********************************************************************************************************//
int hostname_addr(char *hostname,char *ip_addr[])
{
int ip_num = 0;
char buffer[MAX_PATH] = {0};
char str_error[MAX_PATH] = {0};
struct addrinfo *ailist, *aip;
struct sockaddr_in6 *sinp6;
struct sockaddr_in *sinp4;
char buf[INET_ADDRSTRLEN] = {0};
char *server = "3294"; /* 这是服务端口号*/
const char *addr;
int ilRc = 0;
ilRc = getaddrinfo(hostname, server,NULL, &ailist);
if (ilRc < 0)
{
ZeroMemory(str_error,sizeof(str_error));
strcpy(str_error,(char *)gai_strerror(errno));
printf("str_error = %s", str_error);
return 0;
}
if(ailist == NULL)
{
printf("sorry not find the IP address,please try again \n");
return 0;
}
for (aip = ailist; aip != NULL; aip = aip->ai_next) /* 遍历该链表,提取获取的信息*/
{
ip_addr[ip_num] = (char *)malloc(50);
if(aip->ai_family == AF_INET) /* IPv4 地址处理*/
{
sinp4 = (struct sockaddr_in *)aip->ai_addr;
addr = inet_ntoa( sinp4->sin_addr);
strcpy(ip_addr[ip_num],addr);
}
else if(aip->ai_family == AF_INET6) /* IPv6 地址处理*/
{
sinp6 = (struct sockaddr_in6 *)aip->ai_addr;
int i;
*ip_addr[ip_num] = '\0';
for(i = 0; i < 16; i++)
{
if(((i-1)%2) && (i>0))
{
sprintf(buffer,"%s",":");
strcat(ip_addr[ip_num],buffer);
}
sprintf(buffer,"%02x",sinp6->sin6_addr.u.Byte[i]);
strcat(ip_addr[ip_num],buffer);
}
}
ip_num++;
}
freeaddrinfo( ailist ); /* 由于getaddrinfo返回的所有存储空间都是动态获取的,
这些存储空间必须通过调用freeaddrinfo返回给系统*/
return ip_num;
}
int main(){
WORD wVersionRequested = 0;
WSADATA wsaData;
int err = 0;
char *ip_addr[MAX_PATH] = {0};
int num = 0;
char hostname[MAX_PATH] = {0};
int i = 0;
char szTemp[MAX_PATH] = {0};
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );//initiate the ws2_32.dll and match the version
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || //if the version is not matched ,then quit and terminate the ws3_32.dll
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
cout<<"Please input target hostname:\n";
cin>>hostname;
num = hostname_addr(hostname,ip_addr);
for(i = 0; i < num; i++)
{
ZeroMemory(szTemp,sizeof(szTemp));
sprintf(szTemp,"Target IP %d:\n",i);
cout< cout< free(ip_addr[i]); } while (1) { ZeroMemory(szTemp,sizeof(szTemp)); cout<<"Please input 'continue' or 'exit'\n"; cin>>szTemp; if (strcmp(szTemp,"exit") == 0) { break; } if (strcmp(szTemp,"continue") == 0) { cout<<"Please input target hostname:\n"; cin>>hostname; num = hostname_addr(hostname,ip_addr); for(i = 0; i < num; i++) { ZeroMemory(szTemp,sizeof(szTemp)); sprintf(szTemp,"Target IP %d:\n",i); cout< cout< free(ip_addr[i]); } } } WSACleanup( ); return 0; }