[转帖]iptables应用

由 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 &gt; /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  
147148  
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>
Published At
Categories with 服务器类
Tagged with
comments powered by Disqus