由 quanliking 在 10-01-2002 10:47 发表:
[转帖]iptables应用
[转帖]iptables应用之虚拟DNS
.核心思想
配置动态DNS服务器的核心思想是:在DNS服务器上运行多个BIND,每个BIND为来自不同区域的用户提供解析,因此每个BIND都应具有不同的配置文件和域文件,并且分别监听在不同的端口。在接到客户端DNS请求时,根据客户的ip地址将请求重定向不同的BIND服务端口。BIND响应时,再改写相应包的服务端口为标准的53端口。这样就可以根据客户端的ip地址将不同的解析结果返回给客户端。整个过程对于客户端来说都是透明的。实现的关键在于运行不同的BIND及运用iptables进行ip地址及端口改写操作。
关于iptables更为详细的信息,请参考解决方案中作者的两篇文章——《用iptales实现包过虑型防火墙》及《用iptables实现NAT》。
2.配置过程
2.1.配置内核
netfilter要求内核版本不低于2.3.5,在编译新内核时,要求选择和netfilter相关的项目。这些项目通常都是位于"Networking options"子项下。以2.4.0内核为例,我们应该选中的项目有:
[*] Kernel/User netlink socket
[ ] Routing messages
<*> Netlink device emulation
[*] Network packet filtering (replaces ipchains)
.......
然后,在"IP: Netfilter Configuration ---->"选中:
1<m> Connection tracking (required for masq/NAT)
2
3<m> FTP protocol support
4
5<m> IP tables support (required for filtering/masq/NAT)
6
7<m> limit match support
8
9<m> MAC address match support
10
11<m> Netfilter MARK match support
12
13<m> Multiple port match support
14
15<m> TOS match support
16
17<m> Connection state match support
18
19<m> Packet filtering
20
21<m> REJECT target support
22
23<m> Full NAT
24
25<m> MASQUERADE target support
26
27<m> REDIRECT target support
28
29<m> Packet mangling
30
31<m> TOS target support
32
33<m> MARK target support
34
35<m> LOG target support
36
37<m> ipchains (2.2-style) support
38
39<m> ipfwadm (2.0-style) support
40
41
42
43其中最后两个项目可以不选,但是如果你比较怀念ipchains或者ipfwadm,你也可以将其选中,以便在2.4内核中使用ipchians或ipfwadm。但是需要注意的是,iptables是和ipchians/ipfwadm相对立的,在使用iptables的同时就不能同时使用ipchains/ipfwadm。编译成功后,这些模块文件都位于以下目录中
44
45/lib/modules/2.4.0/kernel/net/ipv4/netfilter
46
47
48
49编译2.4.0的新内核时还应该注意要在"Processor type and features"中选择和你的CPU相对应的正确的CPU选项,否则新内核可能无法正常工作。
50
51
52
532.2.配置BIND服务
54
55
56
57缺省地,BIND服务监听在53端口,我们可以通过配置让BIND运行在不同的ip及端口上。实现这一点并不复杂,假设我们的DNS服务器的ip地址是211.163.76.1,并且我们想区分CERNET及非CERNET的客户,这时我们必须运行两个BIND,使用不同的配置文件。可以在使用非标准监听端口的BIND的配置文件中用listen-on指定BIND监听的端口,比如:
58
59
60
61options {
62
63listen-on port 54 {211.163.76.1;}
64
65directory "/var/named_cernet";
66
67};
68
69
70
71可以用named的-c 选项指定named读入不同的配置文件,比如:
72
73
74
75/usr/sbin/named -u named -c /etc/named_cernet.conf
76
77
78
792.3.配置重定向规则
80
81
82
83假设监听在标准端口的BIND服务器为非CERNET客户提供DNS解析,监听在54端口的BIND服务器为CERNET服务器提供DNS解析,我们可以建立如下的规则脚本:
84
85
86
87#!/bin/bash
88
89#打开端口转发
90
91echo 1 > /proc/sys/net/ipv4/ip_forward
92
93
94
95#加载相关的内核模块
96
97/sbin/modprobe iptable_filter
98
99/sbin/modprobe ip_tables
100
101/sbin/modprobe iptables_nat
102
103
104
105#刷新所有规则
106
107/sbin/iptables -t nat -F
108
109
110
111#加入来自CERNET的DNS请求转发规则,将其转发到本地54端口,
112
113#CERNET地址列表可从 www.nic.edu.cn/RS/ipstat/ 获得
114
115/sbin/iptables -t nat -A PREROUTING -p udp -s 163.105.0.0/16
116
117\--dport 53 -i eth0 -j REDIRECT 54
118
119/sbin/iptables -t nat -A PREROUTING -p tcp -s 163.105.0.0/16
120
121\--dport 53 -i eth0 -j REDIRECT 54
122
123/sbin/iptables -t nat -A PREROUTING -p udp -s 166.111.0.0/16
124
125\--dport 53 -i eth0 -j REDIRECT 54
126
127/sbin/iptables -t nat -A PREROUTING -p tcp -s 166.111.0.0/16
128
129\--dport 53 -i eth0 -j REDIRECT 54
130
131/sbin/iptables -t nat -A PREROUTING -p udp -s 202.4.128.0/19
132
133\--dport 53 -i eth0 -j REDIRECT 54
134
135/sbin/iptables -t nat -A PREROUTING -p tcp -s 202.4.128.0/19
136
137\--dport 53 -i eth0 -j REDIRECT 54
138
139/sbin/iptables -t nat -A PREROUTING -p udp -s 202.112.0.0/15
140
141\--dport 53 -i eth0 -j REDIRECT 54
142
143/sbin/iptables -t nat -A PREROUTING -p tcp -s 202.112.0.0/15
144
145\--dport 53 -i eth0 -j REDIRECT 54
146
147…
148
149
150
151#将返回给CERNET DNS客户数据包的源端口(54端口)伪装成53端口
152
153/sbin/iptables -t nat -A POSTROUTING -p udp
154
155\--sport 54 -o eth0 -j SNAT --to 211.163.76.1:53
156
157/sbin/iptables -t nat -A POSTROUTING -p tcp
158
159\--sport 54 -o eth0 -j SNAT --to 211.163.76.1:53
160
161
162
163教育网网的朋友可以从这里这里下载该脚本,将脚本中的DNS_IP及CNET_PORT参数改成你自己的DNS服务器地址及监听端口即可。
164
165
166
1672.4.运行动态DNS
168
169
170
171配置完成后我们启动DNS服务器,并且运行相应的规则脚本,我们的动态DNS服务器就可以正常工作了。
172
173
174
175转贴from linuxaid
176
177__________________
178
179There are two distinct opinions:
180
181One would say, "The love of money is the root of all evil."
182
183The other, "The lack of money is the root of all evil."
184
185Which one i should take, that is the question.
186
187
188
189
190* * *
191
192
193_由 quanliking 在 10-01-2002 10:47 发表:_
194
195
196
197**[转帖]用iptables实现NAT**
198
199
200
201
202
203本文版权由linuxAid和作者所有
204
205
206
207摘要:本文是“用iptales实现包过虑型防火墙”的姊妹篇,主要介绍如何使用iptbales实现linux2.4下的强大的NAT功能。关于iptables的详细语法请参考“用iptales实现包过虑型防火墙”一文。需要申明的是,本文绝对不是NAT-HOWTO的简单重复或是中文版,在整个的叙述过程中,作者都在试图用自己的语言来表达自己的理解,自己的思想。
208
209
210
211一、概述
212
213
214
2151\. 什么是NAT
216
217在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说,除了将源MAC地址换成自己的MAC地址以外,路由器不会对转发的数据包做任何修改。NAT(Network Address Translation网络地址翻译)恰恰是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作。
218
219
220
2212\. 为什么要进行NAT
222
223我们来看看再什么情况下我们需要做NAT。
224
225假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW服务器对外发布信息,这时候我们就可以通过NAT来提供这种服务了。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过NAT技术使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。
226
227再比如使用拨号上网的网吧,因为只有一个合法的IP地址,必须采用某种手段让其他机器也可以上网,通常是采用代理服务器的方式,但是代理服务器,尤其是应用层代理服务器,只能支持有限的协议,如果过了一段时间后又有新的服务出来,则只能等待代理服务器支持该新应用的升级版本。如果采用NAT来解决这个问题,
228
229因为只在应用层以下进行处理,不但可以获得很高的访问速度,而且可以无缝的支持任何新的服务或应用。
230
231还有一个方面的应用就是重定向,也就是当接收到一个包后,不是转发这个包,而是将其重定向到系统上的某一个应用程序。最常见的应用就是和squid配合使用成为透明代理,在对http流量进行缓存的同时,可以提供对Internet的无缝访问。
232
233
234
2353\. NAT的类型
236
237在linux2.4的NAT-HOWTO中,作者从原理的角度将NAT分成了两种类型,即源NAT(SNAT)和目的NAT(DNAT),顾名思义,所谓SNAT就是改变转发数据包的源地址,所谓DNAT就是改变转发数据包的目的地址。
238
239
240
241二、原理
242
243
244
245下图是linux2.4的原理图:
246
247
248
249在“用iptales实现包过虑型防火墙”一文中我们说过,netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。并且系统缺省的表是"filter"。但是在使用NAT的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter",所以在使用filter功能时,我们没有必要显式的指明"-t filter"。
250
251同filter表一样,nat表也有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是:
252
253PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT;
254
255POSTROUTING:可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。
256
257OUTPUT:定义对本地产生的数据包的目的NAT规则。
258
259
260
261三、操作语法
262
263
264
265如前所述,在使用iptables的NAT功能时,我们必须在每一条规则中使用"-t nat"显示的指明使用nat表。然后使用以下的选项:
266
267
268
2691\. 对规则的操作
270
271加入(append) 一个新规则到一个链 (-A)的最后。
272
273在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。
274
275在链内某个位置替换(replace) 一条规则 (-R)。
276
277在链内某个位置删除(delete) 一条规则 (-D)。
278
279删除(delete) 链内第一条规则 (-D)。
280
281
282
2832\. 指定源地址和目的地址
284
285
286
287通过--source/--src/-s来指定源地址(这里的/表示或者的意思,下同),通过--destination/--dst/-s来指定目的地址。可以使用以下四中方法来指定ip地址:
288
289a. 使用完整的域名,如“ www.linuxaid.com.cn”;
290
291b. 使用ip地址,如“192.168.1.1”;
292
293c. 用x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”;
294
295d. 用x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是 UNIX环境中通常使用的表示方法。
296
297缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。
298
299
300
301
302
3033\. 指定网络接口
304
305
306
307可以使用--in-interface/-i或--out-interface/-o来指定网络接口。从NAT的原理可以看出,对于PREROUTING链,我们只能用-i指定进来的网络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。
308
309
310
3114\. 指定协议及端口
312
313
314
315可以通过--protocol/-p选项来指定协议,如果是udp和tcp协议,还可--source-port/--sport和 --destination-port/--dport来指明端口。
316
317
318
319四、准备工作
320
321
322
3231\. 编译内核,编译时选中以下选项,具体可参看“用iptales实现包过虑型防火墙”一文:
324
325
326
327<m> Full NAT
328
329<m> MASQUERADE target support
330
331<m> REDIRECT target support
332
333
334
3352\. 要使用NAT表时,必须首先载入相关模块:
336
337
338
339modprobe ip_tables
340
341modprobe ip_nat_ftp
342
343iptable_nat 模块会在运行时自动载入。
344
345
346
347
348
349五、使用实例
350
351
352
3531\. 源NAT(SNAT)
354
355
356
357比如,更改所有来自192.168.1.0/24的数据包的源ip地址为1.2.3.4:
358
359
360
361iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4
362
363
364
365这里需要注意的是,系统在路由及过虑等处理直到数据包要被送出时才进行SNAT。
366
367
368
369有一种SNAT的特殊情况是ip欺骗,也就是所谓的Masquerading,通常建议在使用拨号上网的时候使用,或者说在合法ip地址不固定的情况下使用。比如
370
371
372
373# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
374
375
376
377可以看出,这时候我们没有必要显式的指定源ip地址等信息。
378
379
380
3812\. 目的SNAT(DNAT)
382
383
384
385比如,更改所有来自192.168.1.0/24的数据包的目的ip地址为1.2.3.4:
386
387
388
389iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4
390
391
392
393这里需要注意的是,系统是先进行DNAT,然后才进行路由及过虑等操作。
394
395
396
397有一种DNAT的特殊情况是重定向,也就是所谓的Redirection,这时候就相当于将符合条件的数据包的目的ip地址改为数据包进入系统时的网络接口的ip地址。通常是在与squid配置形成透明代理</m></m></m></m></m></m></m></m></m></m></m></m></m></m></m></m></m></m></m></m></m></m></m>