分享
 
 
 

防火墙软件Netfilter之NAT技术

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

本文档主要描述怎样进行IP伪装(masquerading)、透明代理(transparent proxying)、端口转发(port forwarding)和其他形式的网络地址翻译技术。

1. 什么是网络地址翻译NAT(Network Address Translation)?

当一个包在网络上传输时,从它的源地址(例如你自己的主机)到达目的地址(例如www.yahoo.com),中间经过很多节点和网络。这些节点通常不会改变你的包。他们仅仅转发你的包。

如果一个节点执行NAT,他将会修改包的源或目的地址。通常这个节点会记住他怎样修改了这个包,因此当相应的应答包从另一个方向到达时,他知道如何反向修改这个应答包。

2. 为什么要使用NAT?

l 用modem上网

大多数的ISPs只给你提供一个IP地址。你可以以任何源地址发出包,但是只有包含这个IP地址的包的应答包才会到达你的网络。如果你想使用多台机器(比如有个自己的网络)利用这个IP地址上网。需要NAT。

这是NAT使用得最为常见的情况,在linux的世界里称为IP伪装(masquerading)。又称之为SNAT,因为你要改变包的源地址。

l Multiple Servers

有时候你想改变到达你的网络的包的去向。通常因为你只有一个IP地址,但是你又想用户到达这个真实IP地址之后的各个机器。方法是修改这些包的目的地址,让他们到达不同的机器。

还有就是用于负载均衡。这种类型的NAT在linux上叫做端口转发(port-forwarding)。

l Transparent Proxying(透明代理)

透明代理是在你的网络和外部世界之间的程序,所有的进或出都要经过这个代理。之所以叫做“透明”,因为你的网络无需考虑他的存在。

例如,squid软件能够配置为透明代理。

3. 两种类型的NAT

NAT有两种类型:Source NAT(SNAT)和Destination NAT(DNAT)。

源NAT是指改变连接的第一个包的源地址。他是在路由之后做,即在包到达网线之前处理。IP伪装属于源NAT。

目的NAT是指改变连接的第一个包的目的地址。他是在路由之前做。端口转发、负载均衡、透明代理都属于目的NAT。

4. 仅仅需要IP伪装

这是大多数用户的要求。如果你有一个动态分配IP地址的PPP拨号连接,你仅仅想让你的内部网络发出的包发生改变,就像是从这个PPP拨号所分配的IP地址所发出的。如下:

# Load the NAT module (this pulls in all the others).

modprobe iptable_nat

# In the NAT table (-t nat), Append a rule (-A) after routing

# (POSTROUTING) for all packets going out ppp0 (-o ppp0) which says to

# MASQUERADE the connection (-j MASQUERADE).

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# Turn on IP forwarding

echo 1 > /proc/sys/net/ipv4/ip_forward

这里假设你没有做包过滤。

5. 端口转发

例如,要将1.2.3.4:8080变为192.168.1.1:80:

# Append a rule pre-routing (-A PREROUTING) to the NAT table (-t nat) that

# TCP packets (-p tcp) going to 1.2.3.4 (-d 1.2.3.4) port 8080 (--dport 8080)

# have their destination mapped (-j DNAT) to 192.168.1.1, port 80

# (--to 192.168.1.1:80).

iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 8080

-j DNAT --to 192.168.1.1:80

如果想让本地网络的机器适用于上面的规则,例如,本地机telnet 1.2.3.4 8080,就转变为telnet 192.168.1.1 80。可以在OUTPUT chain中插入规则:

iptables -A OUTPUT -t nat -p tcp -d 1.2.3.4 --dport 8080

-j DNAT --to 192.168.1.1:80

6. 控制NAT

你可以创建NAT规则来告诉内核改变哪些连接,以及怎么改变。同样,我们使用iptables工具。用选项“-t nat”来表示需要修改NAT表。

NAT表中包括3个chain:PREROUTING(用于目的NAT)、POSTROUTING(用于源NAT)、OUTPUT(用于本地产生的包的目的NAT)。如下图:

_____ _____

/ /

PREROUTING -->[Routing ]----------------->POSTROUTING----->

D-NAT/ [Decision] S-NAT/

| ^

| __|__

| /

| | OUTPUT|

| D-NAT/

| ^

| |

--------> Local Process ------

当一个包经过上图时,检查它属于什么样的连接,如果是新连接,查找NAT表决定做甚。

7. 使用iptables的简单选项

如果iptables作为一个模块,那么使用前需要insmod ip_tables。

最重要的选项是“-t”。对于所有的NAT操作,都需要-t nat。第二重要的是“-A”附加一条规则到chain的末尾;或者“-I”在开头插入一条规则。

用选项“-s”和“-d”来描述源和目的地址。

用选项“-i”和“-o”表示in的接口和out的接口。

用选项“-p”表示协议,例如-p TCP。

用选项“--sport”和“--dport”表示源和目的端口。

8. 源NAT

源NAT将连接的源地址改变成不同的地址,他是在POSTROUTING chain中完成。这非常重要,因为路由、包过滤都是在源地址改变之前做的。所以并不影响。

源NAT用选项“-j SNAT”描述,用“--to-source”来描述IP地址、一个范围的IP地址或者端口(仅仅用于TCP和UDP)。例如:

## Change source addresses to 1.2.3.4.

# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4

## Change source addresses to 1.2.3.4, 1.2.3.5 or 1.2.3.6

# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6

## Change source addresses to 1.2.3.4, ports 1-1023

# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023

特殊情况(IP伪装):

有一种特殊的源NAT叫masquerading(前面讲过),仅仅用于拨号上网的情况(动态IP)。上面所讲的是静态IP。

在masquerading中不需要像上面那样清楚表达,只需要指明正确的网络接口。例如:

## Masquerade everything out ppp0.

# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

9. 目的NAT

目的NAT在PREROUTING chain中完成,对于本机的应用程序来说(包括routing、包过滤程序)都忽略目的地址的改变,认为到达真实的目的地址。需要用到“-i”选项。

目的NAT用“-j DNAT”来表示,用“--to-destination”选项来描述IP地址、IP地址的范围或者端口。例如:

## Change destination addresses to 5.6.7.8

# iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 5.6.7.8

## Change destination addresses to 5.6.7.8, 5.6.7.9 or 5.6.7.10.

# iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 5.6.7.8-5.6.7.10

## Change destination addresses of web traffic to 5.6.7.8, port 8080.

# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1

-j DNAT --to 5.6.7.8:8080

## Redirect local packets to 1.2.3.4 to loopback.

# iptables -t nat -A OUTPUT -d 1.2.3.4 -j DNAT --to 127.0.0.1

重定向:(Redirection)

目的地址的一个特例叫做重定向。相当于对进来的包作目的NAT,例如:

## Send incoming port-80 web traffic to our squid (transparent) proxy

# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80

-j REDIRECT --to-port 3128

10.源NAT与路由

如果你做了源NAT,要注意路由器返回信息时能不能找到你真正的机器。例如,你将自己机器发出的包的源地址改为1.2.3.4,这样外部路由器将向你发送应答包(目的地址是1.2.3.4)。怎样到达你的机器?

如果你变化后的源地址是本地网络所用的地址,则不需要变化,直接返回到这个地址;

如果变化后是本地网络不用的地址,例如,你变成1.2.3.99,一个本地局域网未用的地址,网络地址1.2.3.0/24,则需要做ARP查询,有一个简单的方法是做IP alias,例如:

# ip address add 1.2.3.99 dev eth0

如果变成一个完全不同的地址(不属于本地局域网),必须向路由器发出一条路由信息或者手工加一条路由记录。

11.目的NAT变目的地址到同一个网络

古典的例子内部的职工想访问你的公共的web server,目的地址从公共地址(1.2.3.4)变成内部地址(192.168.1.1),执行:

# iptables -t nat -A PREROUTING -d 1.2.3.4

-p tcp --dport 80 -j DNAT --to 192.168.1.1

一种方法是运行一个内部的DNS server,他知道公共web server的地址,并且将其他的request请求转发到外部的DNS server。另一个方法是将源地址映射到自己的连接上,让web server的返回信息通过他。执行:

# iptables -t nat -A POSTROUTING -d 192.168.1.1 -s 192.168.1.0/24

-p tcp --dport 80 -j SNAT --to 192.168.1.250

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有