用netfilter_queue在用户态实现NAT

用netfilter_queue在用户态实现NAT
用netfilter_queue在用户态实现NAT

用netfilter_queue在用户态实现NAT

偶尔在网上看到了<<用netfilter_queue 在用户态修改网络数据包的例子程序>>这篇文章,

并结合libnetfilter_queue-0.0.17.tar.bz2中的例子,

然后修改了一下tcp计算checksum部分,在linux2.6.24上用netfilter_queue在用户态实现NAT

程序功能: 将输出端目的地为 220.181.37.55 的包,都改为目的地为 202.118.236.130,输入段反之,达到DNAT的一小半功能,完整的NAT要做状态记录的.

直接上代码:

nf_queue_test.c

/*

* =====================================================================================

*

* Filename: nf_queue_test.c

*

* Description: 用netfilter_queue 在用户态修改网络数据包的例子程序

*

* Version: 1.0

* Created: 04/02/2010 09:49:48 AM

* Revision: none

* Compiler: gcc

*

* Author: LeiuX (xulei), xulei@https://www.360docs.net/doc/546713267.html,

* Company: HIT

*

* =====================================================================================

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#ifdef__LITTLE_ENDIAN

#define IPQUAD(addr)\

((unsigned char*)&addr)[0],\

((unsigned char*)&addr)[1],\

((unsigned char*)&addr)[2],\

((unsigned char*)&addr)[3]

#else

#define IPQUAD(addr)\

((unsigned char*)&addr)[3],\

((unsigned char*)&addr)[2],\

((unsigned char*)&addr)[1],\

((unsigned char*)&addr)[0]

#endif

struct tcp_pseudo /*the tcp pseudo header*/

{

__u32 src_addr;

__u32 dst_addr;

__u8 zero;

__u8 proto;

__u16 length;

}pseudohead;

long checksum(unsigned short*addr,unsigned int count){

/* Compute Internet Checksum for "count" bytes

* beginning at location "addr".

*/

register long sum =0;

while(count> 1 ){

/* This is the inner loop */

sum +=*addr++;

count-=2;

}

/* Add left-over byte, if any */

if(count>0 )

sum +=*(unsigned char*)addr;

/* Fold 32-bit sum to 16 bits */

while(sum>>16)

sum =(sum &0xffff)+(sum >>16);

return~sum;

}

/*************************tcp checksum**********************/

long get_tcp_checksum(struct iphdr *myip,struct tcphdr *mytcp){

__u16 total_len =ntohs(myip->tot_len);

int tcpopt_len =mytcp->doff*4 -20;

int tcpdatalen =total_len -(mytcp->doff*4)-(myip->ihl*4);

pseudohead.src_addr=myip->saddr;

pseudohead.dst_addr=myip->daddr;

pseudohead.zero=0;

pseudohead.proto=IPPROTO_TCP;

pseudohead.length=htons(sizeof(struct tcphdr)+tcpopt_len +tcpdatalen);

int totaltcp_len =sizeof(struct tcp_pseudo)+sizeof(struct tcphdr)+tcpopt_len +tcpdatalen;

//unsigned short * tcp = new unsigned short[totaltcp_len];

unsigned short*tcp =malloc(totaltcp_len);

memcpy((unsigned char*)tcp,&pseudohead,sizeof(struct tcp_pseudo));

memcpy((unsigned char*)tcp+sizeof(struct tcp_pseudo),(unsigned char*)mytcp,sizeof(struct tcphdr));

memcpy((unsigned char*)tcp+sizeof(struct tcp_pseudo)+sizeof(struct tcphdr),(unsigned char*)myip+ (myip->ihl*4)+(sizeof(struct tcphdr)),tcpopt_len);

memcpy((unsigned char*)tcp+sizeof(struct tcp_pseudo)+sizeof(struct tcphdr)+tcpopt_len,(unsigned ch ar*)mytcp+(mytcp->doff*4),tcpdatalen);

/* printf("pseud length: %d\n",pseudohead.length);

printf("tcp hdr length: %d\n",mytcp->doff*4);

printf("tcp hdr struct length: %d\n",sizeof(struct tcphdr));

printf("tcp opt length: %d\n",tcpopt_len);

printf("tcp total+psuedo length: %d\n",totaltcp_len);

fflush(stdout);

printf("tcp data len: %d, data start %u\n", tcpdatalen,mytcp + (mytcp->doff*4));

*/

return checksum(tcp,totaltcp_len);

static u_int16_t tcp_checksum(struct iphdr*iphdrp){

struct tcphdr *tcphdrp =

(struct tcphdr*)((u_int8_t*)iphdrp +(iphdrp->ihl<<2));

return get_tcp_checksum(iphdrp,tcphdrp);

}

static void set_tcp_checksum(struct iphdr*iphdrp){

struct tcphdr *tcphdrp =

(struct tcphdr*)((u_int8_t*)iphdrp +(iphdrp->ihl<<2));

tcphdrp->check =0;

tcphdrp->check =get_tcp_checksum(iphdrp,tcphdrp);

}

/****************************tcp checksum end****************************/

/********************************Ip checksum*****************************/ static u_int16_t ip_checksum(struct iphdr*iphdrp){

return checksum((unsigned short*)iphdrp,iphdrp->ihl<<2);

}

static void set_ip_checksum(struct iphdr*iphdrp){

iphdrp->check =0;

iphdrp->check =checksum((unsigned short*)iphdrp,iphdrp->ihl<<2); }

/****************************Ip checksum end******************************/

static int cb(struct nfq_q_handle *qh,struct nfgenmsg *nfmsg, struct nfq_data *nfa,void*data){

(void)nfmsg;

(void)data;

u_int32_t id =0;

struct nfqnl_msg_packet_hdr *ph;

unsigned char*pdata =NULL;

int pdata_len;

ph =nfq_get_msg_packet_hdr(nfa);

if(ph){

id =ntohl(ph->packet_id);

}

pdata_len =nfq_get_payload(nfa,(char**)&pdata);

if(pdata_len ==-1){

pdata_len =0;

}

struct iphdr *iphdrp =(struct iphdr *)pdata;

printf("len %d iphdr %d %u.%u.%u.%u ->",

pdata_len,

iphdrp->ihl<<2,

IPQUAD(iphdrp->saddr));

printf(" %u.%u.%u.%u %s",

IPQUAD(iphdrp->daddr),

getprotobynumber(iphdrp->protocol)->p_name);

printf(" ipsum %hu",ip_checksum(iphdrp));

if(iphdrp->protocol ==IPPROTO_TCP){

printf(" tcpsum %hu",tcp_checksum(iphdrp));

}

#define TO "220.181.37.55"

#define DNAT_TO "202.118.236.130"

if(iphdrp->daddr ==inet_addr(TO)){

printf(" !hacked!");

iphdrp->daddr =inet_addr(DNAT_TO);

set_ip_checksum(iphdrp);

if(iphdrp->protocol ==IPPROTO_TCP){

set_tcp_checksum(iphdrp);

printf(" ipsum+ %hu tcpsum+ %hu",

ip_checksum(iphdrp),tcp_checksum(iphdrp));

}

}

if(iphdrp->saddr ==inet_addr(DNAT_TO)){

iphdrp->saddr =inet_addr(TO);

printf(" !hacked!");

set_ip_checksum(iphdrp);

if(iphdrp->protocol ==IPPROTO_TCP){

set_tcp_checksum(iphdrp);

printf(" ipsum+ %hu tcpsum+ %hu",

ip_checksum(iphdrp),tcp_checksum(iphdrp));

}

}

printf("\n");

return nfq_set_verdict_mark(qh,id,NF_REPEAT,1,

(u_int32_t)pdata_len,pdata);

}

int main(int argc,char**argv)

{

struct nfq_handle *h;

struct nfq_q_handle *qh;

struct nfnl_handle *nh;

int fd;

int rv;

char buf[4096];

h =nfq_open();

if(!h){

exit(1);

}

nfq_unbind_pf(h,AF_INET);

/*2.6.24 的内核有BUG, nfq_unbind_pf 返回值不正确,

见:https://www.360docs.net/doc/546713267.html,/gmane.c ... ilter.general/33573*/

/*

if (nfq_unbind_pf(h, AF_INET) < 0){

exit(1);

}

*/

if(nfq_bind_pf(h,AF_INET)<0){

exit(1);

}

int qid =0;

if(argc ==2){

qid =atoi(argv[1]);

}

printf("binding this socket to queue %d\n",qid);

qh =nfq_create_queue(h,qid,&cb,NULL);

if(!qh){

exit(1);

}

if(nfq_set_mode(qh,NFQNL_COPY_PACKET,0xffff)<0){

load.sh

#!/bin/bash

#=============================================================================== #

#FILE:load.sh

#

#USAGE:./load.sh

#

#DESCRIPTION:

#

#OPTIONS:---

#REQUIREMENTS:---

#BUGS:---

#NOTES:---

#AUTHOR:LeiuX (),marksman.xu@https://www.360docs.net/doc/546713267.html,

#COMPANY:HIT

#VERSION:1.0

#CREATED:04/02/2010 09:51:36 AM CST

#REVISION:---

#=============================================================================== #!/bin/sh

TABLE=mangle

function remove_chain(){

echo -n removing chain...

{

sudo /sbin/iptables -t ${TABLE}-D PREROUTING -j NF_QUEUE_CHAIN

sudo /sbin/iptables -t ${TABLE}-D OUTPUT -j NF_QUEUE_CHAIN

sudo /sbin/iptables -t ${TABLE}-F NF_QUEUE_CHAIN

sudo /sbin/iptables -t ${TABLE}-X NF_QUEUE_CHAIN

}&>/dev/null

echo done

}

function create_chain(){

echo -n creating chain...

sudo /sbin/iptables -t ${TABLE}-N NF_QUEUE_CHAIN

运行loader.sh就好了,如果你没有sudo,那就改改脚本自己用root运行吧

要看效果,就ping 220.181.37.55,然后连 220.181.37.55 的80端口试试,并且注意程序的输出. PS: 220.181.37.55 是 baidu 的一个服务器的IP, 另外一个IP是 pact lab 的.

reference:

<<用netfilter_queue 在用户态修改网络数据包的例子程序>>

libnetfilter_queue-0.0.17.tar.bz2

tcp计算checksum

<>

https://www.360docs.net/doc/546713267.html,/woods2001/article/details/8373628

NAT技术原理

nat网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。编辑本段网络地址转换(NAT)简介NAT概述NAT(Network Address Translation,网络地址转换)是将IP 数据报报头中的IP 地址转换为另一个IP 地址的过程。在实际应用中,NAT 主要用于实现私有网络访问公共网络的功能。这种通过使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用IP 地址空间的枯竭。[1] 说明:私有IP 地址是指内部网络或主机的IP 地址,公有IP 地址是指在因特网上全球唯一的IP 地址。RFC 1918 为私有网络预留出了三个IP 地址块,如下: A 类:10.0.0.0~10.255.255.255 B 类:172.16.0.0~172.31.255.255 C 类:192.168.0.0~192.168.255.255 上述三个范围内的地址不会在因特网上被分配,因此可以不必向ISP 或注册中心申请而在公司或企业内部自由使用。NAT技术的产生虽然NAT可以借助于某些代理服务器来实现,但考虑到运算成本和网络性能,很多时候都是在路由器上来实现的。随着接入Internet的计算机数量的不断猛增,IP地址资源也就愈加显得捉襟见肘。事实上,除了中国教育和科研计算机网(CERNET)外,一般用户几乎申请不到整段的C类IP地址。在其他ISP那里,即使是拥有几百台计算机的大型局域网用户,当他们申请IP地址时,所分配的地址也不过只有几个或十几个IP地址。显然,这样少的IP地址根本无法满足网络用户的需求,于是也就产生了NAT技术。NAT技术的作用借助于NAT,私有(保留)地址的"内部"网络通过路由器发送数据包时,私有地址被转换成合法的IP地址,一个局域网只需使用少量IP地址(甚至是1个)即可实现私有地址网络内所有计算机与Internet的通信需求。NAT将自动修改IP报文的源IP 地址和目的IP地址,Ip地址校验则在NAT处理过程中自动完成。有些应用程序将源IP 地址嵌入到IP报文的数据部分中,所以还需要同时对报文的数据部分进行修改,以匹配IP头中已经修改过的源IP地址。否则,在报文数据都分别嵌入IP地址的应用程序就不能正常工作。NAT技术实现方式NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat 和端口多路复用OverLoad。静态转换是指将

NAT网络地址转换技术的应用与实现

编号:_______________ 商丘科技职业学院 毕业论文 题目: NAT技术在网络中的应用与实现 系别计算机科学系 专业 学生姓名 成绩 指导教师 2011年 4月

商丘科技职业学院毕业论文 摘要 随着互联网的普及,IP地址缺乏问题日益恶化,为了缓解问题,在IP地址分配和保留IP地址方面提出了许多办法,甚至提出新一代的IPv6技术从根本上解决地址空间问题。但由于多方面的原因,NA T成为了事实上广泛使用的解决方法,是我们至今在互联网上没有使用完合法IPv4地址的真实原因。它主要思想是把本地的私有IP地址映射到公网的合法IP地址,以缓解可用IP地址空间的消耗。本课程设计主要对NAT技术进行系统分析,并举出一个应用实例,在网络模拟器中将其具体实现,深入了解其工作原理与数据包每次被修改的情况,了解技术存在的缺点。 关键词:IP地址分配保留IP地址 NAT

NAT技术在网络中的应用与实现 目录 绪论 (1) 第1章背景简述 (2) 1.1IP地址现状 (2) 1.2现存解决方案 (2) 第二章NAT技术分析 (3) 2.1NAT类型 (3) 2.2NAT术语 (4) 2.3NAT工作原理 (4) 第三章NAT的应用实例 (6) 3.1实例描述 (6) 3.2实例的设计方案 (7) 3.3实例的配置重点 (8) 3.4实例的分析 (10) 结束语 (12) 参考文献 (13)

商丘科技职业学院毕业论文 绪论 随着互联网的普及,接入网络的计算机数量增长非常迅速,目前使用的IPv4地址空间有限,可用的公网合法IP非常短缺。人们为了缓解日益恶化的地址缺乏问题,在IP地址的分配和保留IP地址方面采取了许多办法。现存的解决办法包括ISP方面对公网地址的动态分配与回收、使用DHCP动态分配与回收、可变长子网掩码(VLSM)[1]技术、无类域间路由(CIDR)技术,甚至提出新一代的IPv6[3]技术从根本上解决地址空间问题,但由于多方面的原因,IPv6到目前还没有得到普及,而网络地址转换(NA T)[2]技术的使用,是我们至今在互联网上没有使用完合法IPv4地址的真实原因。它主要思想是把本地的私有IP地址映射到公网的合法IP 地址,以缓解可用IP地址空间的消耗。虽然,它没有像IPv6那种从根本上解决问题,但在IPv6没有得到普及的今天,成为了事实上广泛使用的解决方法。

三种NAT实现方式配置实例

NAT有3种实现方式,包括有静态NAT动态地址NAT和端口多路复用地址转换三种技术类型。静态NAT是把内部网络中的每个主机地址永久映射成外部网络中的某个合法地址;动态地址NAT是采用把外部网络中的一系列合法地址使用动态分配的方法映射到内部网络;端口多路复用地址转换是把内部地址映射到外部网络的一个IP地址的不同端口上。根据不同的需要,选择相应的NAT技术类型。 一般我们实际工作中都使用复用NAT,即复用断口NAT,也叫PNAT. 所以掌握最后配置就可以了。 静态NAT 配置步骤: 首先,配置各接口的IP地址。内网使用私有IP.外网使用公网IP.并指定其属于内外接口。 其次,定义静态建立IP 地址之间的静态映射。最后,指定其默认路由。 Router>en (进入特权模式) Router#config (进入全局配置模式) Configuring From terminal, memory, or network [terminal]? Enter configuration commands, one per line. End with CNTL/Z. Router(config)#ho R3 (命名为R3) R3(config)#no ip domain-lo (关闭域名查询,在实验环境中,敲入错误的命令, 它将进行域名查询,故关闭他) R3(config)#line c 0 (进入线路CONSOLE 接口0 下) R3(config-line)#logg syn (启用光标跟随,防止日志信息冲断命令显示的位置) R3(config-line)#exec-t 0 0 (防止超时,0 0 为永不超时) R3(config-line)#exit R3(config)#int e0 (进入以太网接口下) R3(config-if)#ip add 192.168.1.1 255.255.255.0(设置IP 地址) R3(config-if)#ip nat inside (设置为内部接口) R3(config-if)#no shut R3(config-if)#exit R3(config)#int ser1 (进入串口下) R3(config-if)#ip add 100.0.0.1 255.255.255.0 R3(config-if)#no shut R3(config-if)#ip nat outside (设置为外部接口) R3(config-if)#exit R3(config)#ip nat inside source static 191.168.1.1 100.0.0.(1 设置静态转换,其中ip nat inside source 为NAT 转换关键字,这里是静态,故为STATIC ) R3(config)#ip classless R3(config)#ip route 0.0.0.0 0.0.0.0 sO这里是出口或者下一跳地址) R3(config)#exit 动态NAT 配置步骤: 首先,配置各需要转换的接口的IP,设置内外网IP等。其次,定义动态地址转换池列表再次,配置ACL 列表,需要转换的内网IP 地址(或者网段)。最后,设置转换后的出口地址段及MASK (多IP 可以多分流,减轻转换后的负担)

三种NAT实现方式配置实例

NAT有3种实现方式,包括有静态NAT、动态地址NAT和端口多路复用地址转换三种技术类型。静态NAT是把内部网络中的每个主机地址永久映射成外部网络中的某个合法地址;动态地址NAT是采用把外部网络中的一系列合法地址使用动态分配的方法映射到内部网络;端口多路复用地址转换是把内部地址映射到外部网络的一个IP地址的不同端口上。根据不同的需要,选择相应的NAT技术类型。 一般我们实际工作中都使用复用NAT,即复用断口NAT,也叫PNAT. 所以掌握最后配置就可以了。 静态NAT配置步骤: 首先,配置各接口的IP地址。内网使用私有IP.外网使用公网IP.并指定其属于内外接口。 其次,定义静态建立IP地址之间的静态映射。 最后,指定其默认路由。 Router>en(进入特权模式) Router#config (进入全局配置模式) Configuring From terminal, memory, or network [terminal]? Enter configuration commands, one per line. End with CNTL/Z. Router(config)#ho R3(命名为R3) R3(config)#no ip domain-lo(关闭域名查询,在实验环境中,敲入错误的命令,它将进行域名查询,故关闭他) R3(config)#line c 0(进入线路CONSOLE接口0下) R3(config-line)#logg syn(启用光标跟随,防止日志信息冲断命令显示的位置)R3(config-line)#exec-t 0 0(防止超时,0 0为永不超时) R3(config-line)#exit R3(config)#int e0(进入以太网接口下) R3(config-if)#ip add 192.168.1.1 255.255.255.0(设置IP地址) R3(config-if)#ip nat inside(设置为内部接口) R3(config-if)#no shut R3(config-if)#exit R3(config)#int ser1 (进入串口下) R3(config-if)#ip add 100.0.0.1 255.255.255.0 R3(config-if)#no shut R3(config-if)#ip nat outside(设置为外部接口) R3(config-if)#exit R3(config)#ip nat inside source static 191.168.1.1 100.0.0.1(设置静态转换,其中ip nat inside source为NAT转换关键字,这里是静态,故为STATIC)R3(config)#ip classless R3(config)#ip route 0.0.0.0 0.0.0.0 s0(这里是出口或者下一跳地址) R3(config)#exit

NAT的3种实现方式配置示范

NAT包括有静态NAT、动态地址NAT和端口多路复用地址转换三种技术类型。静态 NAT是把内部网络中的每个主机地址永久映射成外部网络中的某个合法地址;动态地址NAT是采用把外部网络中的一系列合法地址使用动态分配的方法映射到内部网络;端口多路复用地址转换是把内部地址映射到外部网络的一个IP 地址的不同端口上。根据不同的需要,选择相应的NAT技术类型。—— 《//https://www.360docs.net/doc/546713267.html,/article.asp?id=265">网络地址转换(NAT)配置实例》 一般我们实际工作中都使用复用NAT,即复用断口NAT,也叫PNAT. 所以掌握最后配置就可以了。 静态NAT配置步骤: 首先,配置各接口的IP地址。内网使用私有IP.外网使用公网IP.并指定其属于内外接口。 其次,定义静态建立IP地址之间的静态映射。 最后,指定其默认路由。 Router>en (进入特权模式) Router#config (进入全局配置模式) Configuring from terminal, memory, or network [terminal]? Enter configuration commands, one per line. End with CNTL/Z. Router(config)#ho R3 (命名为R3) R3(config)#no ip domain-lo (关闭域名查询,在实验环境中,敲入错误的命令,它将进行域名查询,故关闭他) R3(config)#line c 0 (进入线路CONSOLE接口0 下) R3(config-line)#logg syn (启用光标跟随,防 止日志信息冲断命令显示的位置) R3(config-line)#exec-t 0 0 (防止超时,0 0 为 永不超时) R3(config-line)#exit R3(config)#int e0 (进入以太网接口下) R3(config-if)#ip add 192.168.1.1 255.255.255.0 (设置IP地址) R3(config-if)#ip nat inside (设置为内部接口) R3(config-if)#no shut R3(config-if)#exit R3(config)#int ser1 (进入串口下) R3(config-if)#ip add 100.0.0.1 255.255.255.0

NAT技术的原理与实现

NAT技术的原理与实现 NAT, 原理, 技术 一.NAT技术简介 随着网络的发展,网络地址转换(NAT,Network Address Translation)在网络建设中正发挥着不可替代的作用。从本质上来说,NAT的出现是为了缓解lP地址不足的问题;而在实际应用中,NAT还具备一些衍生功能,诸如隐藏并保护网络内部的计算机,以避免来自网络外部的攻击、方便内部网络地址规划,等等。 二.NAT技术的基本原理。 随着接入Internet的计算机数量的不断猛增,IP地址资源也就显得愈加紧张。在实际应用中,一般用户几乎申请不到整段的C类和B类IP地址。当我们的企业向ISP申请IP 地址时,所分配的地址也不过只有几个或十几个IP地址。显然,这样少的IP地址根本无法满足网络用户的需求。为了缓解供给和需求不可调和的矛盾,使用NAT技术便成为了企 业和ISP的必然选择。 企业使用NAT时,一般认为应当使用RFC1918规定的三段私有地址部署企业内部网络。当企业内部设备试图以私有地址为源,向外部网络(Internet)发送数据包的时候,NAT可以对IP包头进行修改,先前的源IP地址-私有地址被转换成合法的公有IP地址(前提是,该共有IP地址应当是企业已经从ISP申请到的合法公网IP),这样,对于一个局域网来说,无需对内部网络的私有地址分配做大的修改,就可以满足内网设备和外网通信的需求。由于设备的源IP地址被NAT替换成了公网IP地址,设备对于外网用户来说就显得“不透明”,达到了保证设备安全性的目的。在这种情况下,内部私有地址和外部公有地址是一一对应的。甚至,我们只需使用少量公网IP地址(甚至是1个)即可实现私有地址网 络内所有计算机与Internet的通信需求。 三.企业实现NAT的常用方式 在企业网络中,NAT的实现方式有三种,即静态转换NAT、动态转换NAT 以及端口 多路复用(PAT)。下面的章节里将一一介绍。 1.静态转换 静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。私有地址和公有地址的对应

Win2008实现NAT功能

Win2008当路由器配置NAT 分类:网络技术作者:https://www.360docs.net/doc/546713267.html,时间:2011-11-7 14:26:29阅读: 493 在部署局域网时,我们会向ISP运营商申请注册一个固定IP即公用IP地址,然后通过这个公用IP地址为局域网用户提供访问互联网的服务,但由于IP地址数量是有限资源,这时候我们就需要将局域网内的私有IP转换为公有IP才能让局域网用户正常上网,通常路由器已经兼备了网络地址转换(Network Addre ss Translation,NAT)的功能,window server 2008同样具备NAT功能。扮演NAT角色的服务器建议使用独立服务器或域成员服务器,至少要安装两块 网卡,为了便于区别,我们将这两块网卡分别命名为内网卡和外网卡并设置不同 网段的IP地址。 图:1 给内外网卡设置完IP地址以后,我们通过添加角色向导来部署NAT服务器。第一:安装NAT Step 1:选择服务器角色:网络策略和访问服务

Step2: 选择角色服务,勾选路由和远程访问服务及其关联服务

Step3:点击【安装】按钮,完成NAT服务的安装。安装角色还是很简单的, 接下来就是配置服务了。

图:4 Step4:打开服务器管理器,展开【角色】选择下面的【网络策略和访问服务】,这时我们看到的【路由和远程访问服务】是被禁用的,显示的是一个红色停止标识,在右键菜单中点击【配置并启用路由和远程访问】,然后会弹出一个【路由 和远程访问服务器安装向导】,微软的迷人之处就是会在每个命令选项后给出一个友好的提示窗口,依其提示step by step地做下去就OK了。

LINUX用NAT实现IP地址映射

用NAT实现IP地址映射 2008年11月11日星期二 11:54 A.M. 一、概述 1. 什么是NAT 在传统的标准的TCP/IP通 信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说,除了将源MAC地址换成自己的MAC 地址以外,路由器不会对转发的数据包做任何修改。NAT(Network AddressTranslation网络地址翻译)恰恰是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作。 2. 为什么要进行NAT 我们来看看再什么情况下我们需要做NAT。假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW 服务器对外发布信息,这时候我们就可以通过NAT来提供这种服务了。我们可以在防火墙的外部网卡上绑定多个合法IP地址,然后通过NAT技术使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。 再比如使用拨号上网的网吧,因为只有一个合法的IP地址,必须采用某种手段让其他机器也可以上网,通常是采用代理服务器的方式,但是代理服务器,尤其是应用层代理服务器,只能支持有限的协议,如果过了一段时间后又有新的服务出来,则只能等待代理服务器支持该新应用的升级版本。如果采用NAT来解决这个问题,因为只在应用层以下进行处理,不但可以获得很高的访问速度,而且可以无缝的支持任何新的服务或应用。还有一个方面的应用就是重定向,也就是当接收到一个包后,不是转发这个包,而是将其重定向到系统上的某一个应用程序。最常见的应用就是和squid配合使用成为透明代理,在对http流量进行缓存的同时,可以提供对Internet的无缝访问。 3. NAT的类型 在linux2.4的NAT-HOWTO中,作者从原理的角度将NAT分成了两种类型,即源NAT(SNAT)和目的NAT(DNAT),顾名思义,所谓SNAT就是改变转发数据包的源地址,所谓DNAT就是改变转发数据包的目的地址。 二、原理 在“用iptales实现包过虑型防火墙”一文中我们说过,netfilter是Linux核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。并且系统缺省的表是"filter"。但是在使用NAT的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter",所以在使用filter功能时,我们没有必要显式的指明"-t filter"。同filter表一样,nat表也有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是:PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进

思科网络技术——利用路由器NAT实现端口地址映射

[思科网络技术]利用路由器NAT实现端口地址映射 假设现在企业内部有文件、邮件服务器等等。而企业还希望这些服务器能够被外部网络的用户访问。如企业可能在异地有一个销售办事处,或者有些员工经常需要出差。为了方便他们的工作,就需要允许这些员工来访问企业内部的这些应用服务器。但是现实情况是,大部分企业可能仅仅拥有一个到连个合法的IP地址。而需要让外部用户能够访问企业内部的应用服务器,首要的一个条件就是企业有足够多数量的合法IP地址。笔者这里要给大家介绍的是,如何通过路由器自带NA T功能,来实现一个合法IP地址同时绑定多台应用服务器。一、选择合适的NA T类型 NA T,又叫做网络地址类型转换,其主要有三种类型,分别为静态NAT、动态NAT与端口地址映射。这里需要注意,这三种类型之间有很大的差异。网络管理员在使用这个技术的时候,必须要了解它们之间的差异,然后结合企业的实际情况,选择合适的实现手段。 第一种类型是静态网络地址转换。其主要的特点是一对一。也就是说,这种类型的网络地址转换是为了在本地和全球地址之间进行一对一的映射而设计的。这就要求网络中的每一台主机都有用一个真实的合法的IP地址。结合上面这个案例,如果企业内部三台服务器都需要被外部用户访问的话,那么就需要至少三个IP地址。显然这种方式并不能够达到节省IP地址的目的。一般来说,静态NA T主要的目的是为了隐藏企业内部服务器的IP地址,以达到保护服务器的目的。 第二种类型是动态NA T。这种类型的网络地址转换是将一个企业内部的IP地址与一个合法的IP地址进行映射。虽然这也是一对一的关系,但是与静态NAT有很大的差别。前者要求企业内部服务器也必须有一个公网IP地址。而动态NAT则没有这个要求,即企业内部的服务器可以采用内部地址。不过此时一个公网IP地址也只能够解决一台内部服务器的访问问题。这与我们上面提到的需求还是有一定的差异。 第三种类型是端口地址映射。端口地址映射在动态NAT上又进了一步。简单的说,其工作模式就是多对对一。可以将多个内部IP地址(内网地址)对应到一个公网IP地址。具体的说,

华为NAT配置案例

华为NAT配置案例模拟 图表1模拟拓扑图 1、在华为设备上部署静态NAT技术,实现公司员工(私网)访问internet(公网) 静态一对一: AR1# interface GigabitEthernet0/0/1 AR2# [AR2] 结果测试: 查看静态转换表 [AR1]display nat static Static Nat Information: Interface : GigabitEthernet0/0/1 Protocol : ---- VPN instance-name : ---- Acl number : ---- Description : ---- Total : 1 [AR1] 在没有做静态NAT条目的PC2上不能访问公网,可以得出结论:静态NAT是静态一对一的关系 2、在华为设备上部署动态NAT技术,实现公司员工(私网)访问internet(公网) 动态NAT (定义一个地址池存放一个可用公网地址) [AR1]dis cu | begin acl acl number 2000 (定义转换的源IP) interface GigabitEthernet0/0/1(接口调用) nat outbound 2000 address-group 1

结果测试: ? 在出接口下将ACL和地址池关联起来,需要注意华为设备上如果地支持中有不止一个IP地址,后面需加no-pat,本例中只有一个地址可以不加;PC1和PC2都可以访问公网 [AR1-GigabitEthernet0/0/1]nat outbound 2000 address-group 1 ? no-pat Not use PAT Please press ENTER to execute command 3、在华为设备上部署PAT技术实现公司员工(私网)访问internet(公网) AR1# acl number 2000 interface GigabitEthernet0/0/1 nat outbound 2000 (定义复用接口g0/0/1用于PAT转换) 结果测试 [AR1]dis nat outbound NAT Outbound Information: -------------------------------------------------------------------------- Interface Acl Address-group/IP/Interface Type -------------------------------------------------------------------------- -------------------------------------------------------------------------- Total : 1 [AR1] 4、在华为设备上部署静态端口映射技术实现公网用户访问私网服务器 静态端口映射 -------------------------------------------------------------------------- AR1# acl number 2000 interface GigabitEthernet0/0/1 2323 nat outbound 2000 # return [AR1-GigabitEthernet0/0/1] -------------------------------------------------------------------------- AR3# [AR3]dis cu | begin vty user-interface vty 0 4

FortiGate NAT的实现方法

FortiGate NAT的实现方法

目录 1.目的 (3) 2.环境介绍 (3) 3.静态NAT (3) 4.动态NAT (4) 5.端口NAT (5) 6.中央NAT (5) 7.查看NAT信息 (7) 8.参考 (9)

1.目的 NAT(Network Address Translation,网络地址转换)是将IP 数据报报头中的IP 地址转换为另一个IP 地址的过程,本文档针对FortiGate的各种NAT进行说明,如静态NAT,动态NAT,端口NAT,中央NAT。 2.环境介绍 本文使用FortiVMware进行说明, 本文支持的系统版本为FortiOS v4.0MR2 Patch8及更高。 3.静态NAT 静态NAT是将一个私有地址转换为一个固定的公有地址。FortiGate的虚拟IP支持一对一或者范围的IP转发以及一对多的端口转发,包含ADSL动态IP 地址的主机映射。 静态NAT的详细配置请参考FortiGate虚拟IP设定。

4.动态NAT 内部网络中多个主机地址转换为合法外部地址集中的其中一个。 定义动态IP地址的IP池。 新建策略并启用NAT,选择之前建立的动态地址池。 此时,10.1.0.[3-8]在访问外网时,将不使用FortiGate的接口地址进行转换,而使用动态地址池内的地址进行NAT。

5.端口NAT 内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问。端口NAT是最为常见的NAT方式。 可以选择通过使用接口地址进行NAT。 在使用端口NAT时,也可以使用动态IP池使用指定的地址进行NAT,当使用一个地址做端口NAT时,选择保持端口号参数时需要谨慎,如果启用该选项,源地址的源端口NAT的时候将不变更,那么另一个源地址的同样源端口将无法实现NAT。 6.中央NAT 中央NAT是将所有需要NAT的条目单独定义在一个NAT表中,策略在启用中央NAT

NAT技术的实现与应用

一。NAT技术简介 随着网络的发展,网络地址转换(NAT,Network Address Translation)在网络建设中正发挥着不可替代的作用。从本质上来说,NAT的出现是为了缓解lP 地址不足的问题;而在实际应用中,NAT还具备一些衍生功能,诸如隐藏并保护网络内部的计算机,以避免来自网络外部的攻击、方便内部网络地址规划,等等。 二。NAT技术的基本原理。 随着接入Internet的计算机数量的不断猛增,IP地址资源也就显得愈加紧张。在实际应用中,一般用户几乎申请不到整段的C类和B类IP地址。当我们的企业向ISP申请IP地址时,所分配的地址也不过只有几个或十几个IP地址。显然,这样少的IP地址根本无法满足网络用户的需求。为了缓解供给和需求不可调和的矛盾,使用NAT技术便成为了企业和ISP的必然选择。 企业使用NAT时,一般认为应当使用RFC1918规定的三段私有地址部署企业内部网络。当企业内部设备试图以私有地址为源,向外部网络(Internet)发送数据包的时候,NAT可以对IP包头进行修改,先前的源IP地址-私有地址被转换成合法的公有IP地址(前提是,该共有IP地址应当是企业已经从ISP申请到的合法公网IP),这样,对于一个局域网来说,无需对内部网络的私有地址分配做大的修改,就可以满足内网设备和外网通信的需求。由于设备的源IP地址被NAT替换成了公网IP地址,设备对于外网用户来说就显得“不透明”,达到了保证设备安全性的目的。在这种情况下,内部私有地址和外部公有地址是一一对应的。甚至,我们只需使用少量公网IP地址(甚至是1个)即可实现私有地址网络内所有计算机与Internet的通信需求。 三。企业实现NAT的常用方式 在企业网络中,NAT的实现方式有三种,即静态转换NAT、动态转换NAT 以及端口多路复用(PAT)。下面的章节里将一一介绍。 1.静态转换 静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。私有地址和公有地址的对应关系由管理员手工指定。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问,并使该设备在外部用户看来变得“不透明”。 2.动态转换 动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址对并不是一一对应的,而是随机的。所有被管理员授权访问外网的私有IP地址可随机转换为任何指定的公有IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。每个地址的租用时间都有限制。这样,当ISP提供的合法IP地址略少于网络内部的计算机数量时,可以采用动态转换的方式。 3.端口多路复用(Port address Translation,PAT) 通过使用端口多路复用,可以达到一个公网地址对应多个私有地址的一对多转换。在这种工作方式下,内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,来自不同内部主机的流量用不同的随机端口进行标示,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用

SIP ALG穿透NAT的实现

SIP ALG穿透NAT的实现 摘要:为解决SIP应用穿透NAT的问题,剖析了NAT的工作原理,并针对SIP协议信令信令过程的特点,提出了采用ALG设备解决NAT的穿透问题,具体设计了ALG的结构和相关实现算法,并给出了详细的实现方案。关键词:会话发起协议(SIP) 网络地址转换(NAT) 会话描述协议(SDP) 信令 会话发起协议SIP[1](Session Initiation Protocol)是由IETF组织于1999年提出的在Internet网络环境中实现实时通信应用的一种信令协议。SIP引发了现代通信体系结构的变革,然而它却在视频能力、会议控制方面没有一个完善的标准;同时,由于大量企业和驻地网都采用了私有编址[2],并通过网络地址转换NAT(Network Address Translation)来控制与公共网络的通信,而SIP数据包需通过信令消息中的IP地址和端口号端口号来实现目的地寻址,且它的媒体流媒体流端口是动态分配的,这就为在NAT上配置固定的包过滤策略带来了困难。因此,SIP穿透NAT是绝大多数VoIP运营商亟待解决的问题。当前,几种主要的NAT穿透技术有SIP ALG、Full Proxy、MidCom、VPN、隧道穿透、STUN等。其中,SIP ALG 方式是在传统的NAT上进行扩展,使之具备感知SIP呼叫控制协议的能力,从而对基于SIP 呼叫的地址实现穿透。它是一种比较简单的方案,最突出的特点是ALG和具体的SIP系统无关,对于一个SIP系统不需要做任何修改,只要在响应的NAT上加载SIP ALG,就能完成私网到公网甚至私网中的两个用户之间的SIP连接。1 SIP应用穿透NAT面临的问题1.1 NAT 的工作原理NAT[3]被置于两网间的边界。NAT技术使得一个私有网络可以通过Internet 注册IP连接到外部世界。位于内网内网和外网中的NAT路由器在发送数据包之前,负责把内部IP翻译成外部合法地址。当从外网来的含公网地址信息的数据包到达NAT时,NAT使用预设好的规则(其组元包含源地址、源端口、目的地址、目的端口、协议)来修改数据包,然后再转发给内网接收点。NAT的基本工作原理,NAT设备实际上是在维护一个状态表,该表用于把非法的IP地址映射地址映射到合法的IP地址上。 1.2 技术难点与传统NAT支持HTTP等数据的穿透不同,SIP应用中的语音和视频数据需通过信令消息中的IP地址和端口号来实现目的地寻址,因此信令消息在地址穿透中不仅需要对TCP/UCP层的端口信息以及IP层的源地址和目的地址进行变换,还需对IP包载荷中的相关地址信息进行变换。同时,对于SIP应用来说,是在控制信息中动态地协商媒体流端口,信令协议中的IP地址也是私有的,因此要准确把握相关的地址和端口信息,并进行正确的转换。这是本文需要解决的首要技术难点。其次,SIP ALG实现对NAT的穿透会因呼叫方处在内网和外网而不同,因此对进出NAT的SIP消息在解析时要判断是内网之间的呼叫请求(内部消息)、外网呼叫请求内网(对内消息),还是内网呼叫请求外网(对外消息),以便对该消息进行正确处理。这也是本文需要解决的技术难点。2 SIP ALG的设计思想由于媒体流端口是在呼叫双方SIP信令建立连接后动态协商的,因此对SIP消息穿透NAT设备要综合考虑这两个方面因素。 2.1 SIP信令的穿透原理SIP信令穿透NAT与HTTP穿透类似,NAT 设备只要打开固定的端口,就能保证SIP信令穿透NAT并与外界建立连接。本文基于SIP 终端设备的特殊性来考虑信令穿透NAT。SIP终端设备会周期性地发送Register消息[1]到注册服务器上,由于不断有信令消息经过NAT设备,致使NAT设备对通过的消息流始终保持一个确定的端口;同时,当Register消息经过ALG,ALG就会记录信令穿透NAT时经NAT转换后的IP地址和端口等信息,并将此信息与NAT后面的终端用户ID(如890010098)等信息进行绑定。这样,当一个信令到来,ALG将通过NAT上正确的地址和端口发送给被叫方。2.2 媒体流的穿透原理当信令穿透NAT后,NAT后面的SIP终端就可以收到来自外网的呼叫请求。这时呼叫方的Invite消息和响应方的200(OK)消息中都携带了用于描述与会话相关的信息及与流媒体相关参数的SDP(Session Description Protocol)消息体[4]。当该消息通过ALG

NAT技术实现原理和应用

科 技 天 地 48 INTELLIGENCE ························NAT 技术实现原理和应用 天津工业大学计算机与软件学院网络工程 06级 李亚珩 摘 要:为解决IPV4地址空间不足的问题,出现了网络地址转换(NAT)标准, 就是将某些IP 地址留出来供专用网络重复使用。它在方便网络代理者进行客户端配置的同时,也为用户私自共享上网提供了方便。本文将全面介绍NAT 技术实验原理和应用。 关键词:NAT 技术 IPV4地址 公用地址 专用地址 一、NAT 的定义和产生的背景 NAT(Network Address Translation)网络地址转换是一个IETF 标准,用于专用地址的内部网和使用公用地址的Internet 之间。内部网的传出数据包通过NAT 将其专用地址转换为公用地址。而来自Internet 的传入数据包则由NAT 将其公用地址转换为专用地址。使用NAT 不仅能节约公用IP 地址,并用大大降低了组织的Internet 接入成本。NAT 技术是近年来随着网络及网络共享的发展而发展起来的一门新技术,由于IPV4 地址空间不足,无网络访问权限,因此采用NAT 技术解决了地址不足问题,参见下图: 1、专用地址:专用地址是保留给组织内部私有网络使用的IP 地址,不用用于Internet 通信,可以被不同组织重复使用。 2、公用地址: 公用地址用于Internet,可以在Internet 中随意访问。因此,要在Internet 上通信,必须使用由LANA(Internet Assigned Numbers, Internet 号码分配机构)分配的公用地址。 二、NAT 技术的分类 静态NAT,动态NAT,端口NAT(PAT)1、静态NAT 内部网络中的每个主机都被永久的映射成外部网络中的某个合法地址[1]。 2、动态NAT 在外部网络中定义了合法地址后,采用动态分配的方法映射到内部网络。动态地址NAT 仅是转换IP 地址,它为内部网络IP 地址分配一个临时外部IP 地址,主要应用于拨号,对于频繁的远程联接也可以采用动态NAT。 3、端口NAT(PAT) PAT 普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP 地址后面。 上述三种NAT 技术的类型都有各自的独特之处,在实际就用中也有不同的用处,三种类型NAT 技术的实现原理以及其不同点参照以下表1: 静态NAT 动态NAT 网络地址端口转换NAPT 实现原理 将内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址转换IP 地址,为每一个内部的IP 地址分配一个子临时的外部IP 地址 将中小型的网络隐藏在一个合法的IP 地址后面 优点设置简单且容易实现可用于拨号和远程联接可将内部连接映射到外部网络中的一个单独的IP 地址上适用范围 内部网 远程联接 小型办公室 表1 三种NAT 技术的比较三、NAT 的工作过程 1、NAT 的客户端需要与Internet 通信,于是将数据包发给NAT 服务器; 2、NAT 服务器将数据包中的源端口号和专用IP 地址转换为其自己的端口号和公用IP 地址,然后将数据包发给Internet 上的主机,同时将源端口号和专用IP 地址与其自己的端口号和公用IP 地址的映射关系记录下来,以便后续过程使用; 3、Internet 上的主机将因应发送给NAT 服务器的公用IP 地址; 4、NAT 服务器将所收到的数据包的目的端口号和公用IP 地址根据映射关系转换为客户机的端口号和专用IP 地址并转发给客户机。 四、结束语 NAT 技术一开始是作为解决Internet 地址空间不足而提出的一种短期暂时的解决方案, NAT 技术可以给我们带来各种好处。随着NAT 技术的深入研究,它的应用领域也在逐步扩展,但NAT 技术对一些管理和安全机制的潜在威胁仍在。或许随着IPV6技术发展的相当成熟时,以致于将把现有的IPV4网络代替时,NAT 技术也可能就会消失,也有可能会继续延续下去。 参考文献: [1] 刘丽波:《浅析网络地址转换技术》,《长沙通信职业技术学院学报》,2007年第2期。 [2] 黄明泰:《用sFlow 技术管好网络》,《中国计算机用户》,2004年第46期。 [3] 傅坚、胡正名、杨义先:《IPSec 协议与网络地址转换的融合》,《计算机应用研究》,2003年第2期。

NAT功能的配置和实现

计算机网络 课程设计报告书 课题名称 NAT 功能的配置与实现 姓 名 学 号 院 系 专业班级 指导教师 2013年 12月 25日 ※※※※※※※※※ ※※ ※ ※ ※ ※ ※※※※※※※※※ 2011级学生 计算机网络课程设计

目录 一、设计目的及意义 (3) 二、实践内容 (3) 2.1 计算机网络设备的基本功能配置 (3) 2.2 综合设计 (3) 三、交换机的基本配置 (4) 3.1交换机的工作原理: (4) 3.2虚拟局域网VLAN 的原理与功能: (4) 3.3交换机的基本配置举例: (4) 四、路由器的基本配置 (8) 4.1 默认路由的配置方法 (8) 4.2 RIP协议的配置 (15) 4.3 OSPF协议的配置 (19) 4.4 NAT的配置 (24) 五、综合网络配置 (27) 六、总结与收获 (33)

NAT功能的配置与实现 一、设计目的及意义 1.计算机网络课程对于通信工程专业的重要性。 通信技术是以现代的声,光,电技术为硬件基础,辅以相应软件来达到信息交流目的。通信工程专业是信息科学技术发展迅速并极具活力的一个领域,尤其是数字移动通信、光纤通信、Internet网络通信使人们在传递信息和获得信息方面达到了前所未有的便捷程度。 计算机网络就是由通信线路互相连接的许多自主工作的计算机构成的集合体,是计算机发展和通信技术紧密结合并不断发展的一门学科。它的理论发展和应用水平直接反映了一个国家高新技术的发展水平,并是其现代化程度和综合国力的重要标志。在以信息化带动工业化和工业化促进信息化的进程中,计算机网络扮演了越来越重要的角色。它使信息采集,处理,贮存,传输和利用等五大自然信息功能通过现代可能基础上形成的各种信息技术在全球人类社会这个更宽广的空间综合起来。 计算机网络这门课程是通信工程专业中的一门重要课程,学习计算机网络这门课程里面的各项知识理论,关系着通信工程专业其他课程的学习。计算机网络课程贯穿于整个通信工程专业知识。 2.此课程设计内容,对于计算机网络课程的意义。 通过此课程设计,能够将在计算机网络课程中所学的理论知识更好的用于实践。将所学关于交换机的基本配置,路由器的基本配置包括静态路由、RIP配置、OSPF配置、NAT配置等等,通过课程设计这样的平台更好的理解、运用和掌握。一方面学习了更多相关的知识,另一方面弥补理论中学习的不足。 二、实践内容 2.1 计算机网络设备的基本功能配置 按照要求,使用Boson Netsim软件完成对交换机及路由器等设备的配置,使其实现特定的功能。内容如下: (1)交换机的基本配置 (2)路由器的基本配置 2.2 综合设计 在掌握设备基本配置方法的基础上,按照要求,设计一个综合的网络,画出网络拓扑图,

相关主题
相关文档
最新文档