免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5671 | 回复: 8

[proxy] iptables基础 [复制链接]

论坛徽章:
0
发表于 2005-01-04 12:07 |显示全部楼层
iptables基础


[作者序]:本来是要翻译http://www.justlinux.com/nhf/Security/IPtables_Basics.html这篇文章的,可惜当年实在是没有学好语法,许多句子按照原文翻译,如何也理不通顺。只好按照自己的理解重新组织了,但愿不会有太大的偏差。好在,无论如何,现在读起来,基本通顺了。

Iptables用三种链来管理放出、进入或经过你计算机的(数据)包。INPUT链管理进入你计算机的包,OUTPUT链管理你计算机放出的包,FORWARD链管理经过你的计算机转送到另一台计算机的包。

所以,设置iptables的过程事实上就是定义一些规则来决定如何处理这三种包的过程。

例如,如果你访问http://www.yahoo.com,你的计算机将放出一个包向Yahoo!请求。这个包就要经过OUTPUT链的审核。内核会浏览OUTPUT链,看看是否有某条规则不允许放出这个包,如果有的话,就拒绝放出。

现在让我们来处理一些实际问题。比如你想阻塞所有来自200.200.200.1的包。首先你需要用-s选项来指明源IP地址或DNS:

  1. iptables -s 200.200.200.1
复制代码


然后可以用-j选项来说明如何处理这个包。最常用的处理方式有三种:ACCEPT、DENY和DROP。ACCEPT顾名思义表示接受包,DENY不接受同时回送一条拒绝信息,而DROP则根本对包不予理睬。如果确信某个IP可疑,那么最好选择DROP而不是DENY:

  1. iptables -s 200.200.200.1 -j DROP
复制代码


但是仅仅使用上面这条命令,我们的计算机会无所适从,因为它不知道该用哪条链来处理这项规则。这就要用到-A选项,它表示把某条规则追加到某个链的末尾。我们打算拒绝所有来自200.200.200.1的包,所以使用:

  1. iptables -A INPUT -s 200.200.200.1 -j DROP
复制代码


选项的顺序不会影响最终的处理结果,-j DROP也可以放在-s 200.200.200.1的前面,只不过放在后面似乎更容易理解。
现在扩展一下,假设我们不想发送任何包给200.200.200.1该如何做呢?很简单,只要把INPUT换成OUTPUT,同时用-d替换-s就可以了:

  1. iptables -A OUTPUT -d 200.200.200.1 -j DROP
复制代码


那么,如果我们打算忽略来自这台机器的telnet请求该怎么办呢?你可能知道telnet使用的是23端口,但是如果你愿意,你也可以在iptables中使用telnet关键字而不是端口号。Telnet,像大多数服务一样,运行于TCP协议之上。我们可以使用-p选项来指明所用的协议。但是只指明协议不会有任何作用,还需要使用—destination-port来指出我们要为哪个目标端口指定规则。与之相对应,--source-prot用来指明源端口,确信别把二者弄混了。所以我们可以这样拒绝某台机器的telnet请求:

  1. iptables -A INPUT -s 200.200.200.1 -p tcp --destination-port telnet -j DROP
复制代码


扩展一下,如果你想拒绝一个网段的telnet请求,可以使用200.200.200.0/24来代替上面的200.200.200.1,它匹配任何200.200.200.*这样的IP地址。

再复杂一些。假设我们同时可以连接到本地局域网和internet,eth0网卡用来连接本地局域网,ppp0用来拨号到internet。我们可能只想为本地局域网提供telnet服务而不想为不安全的internet提供此项服务。有两种选择:在OUTPUT链上用-o选项阻塞设备输出数据,但更好的是在INPUT链上用-i选项阻塞设备输入数据。因此,这条规则可以这样设置:



  1. iptables -A INPUT -p tcp --destination-port telnet -i ppp0 -j DROP
复制代码


这将关闭一切来自internet的telnet请求但是开放局域网同样的请求。

规则可以使用-A选项来追加在规则列表之后 ,也可以使用-I选项插入在某条规则之前。例如,如果我们想把一条规则放在INPUT链的最前面,我们可以使用“-I INPUT 1”。其中的1代表规则列表的第一行,你也可以把它换成其它的数字。除此之外,我们还可以使用-R选项来替换某条规则(它将删除原来的规则),-D选项来删除某条规则,-L选项来列出所有已经设置的规则,-F选项来初始化所有规则。

现在,再深入一步。网络中的数据包通常使用某种协议,如果这种协议是TCP,它还会使用某个端口。你可能想干脆关闭所有端口拒绝进来的包,但是记着,如果你的计算机同另一台计算机会话,另一台计算机肯定会发送反馈信息。如果你关闭了所有进来的端口,那本质上就表示你的连接就没有用了。而且对于大多数非服务程序来说,你无法预知它们使用哪个端口进行会话。但是仍然有一种办法。当两台计算机在TCP连接上进行会话时,连接一定会首先被初始化。完成这项任务的包叫作SYN。一个SYN包简单的表明另一台计算机已经做好了会话的准备。只有发出服务请求的计算机才发送SYN包。所以如果你仅拒绝进来的SYN包,它将终止其它计算机打开你计算机上的服务,但是不会终止你使用其它计算机上的服务,如果它没有拒绝你发送的SYN包的话。这是一种折衷的办法,但是可以完成许多我们想完成的任务。这个选项是--syn,用在你指明的TCP协议之后。所以制定一条规则阻塞所有来自internet的连接会是这样:

  1. iptables -A INPUT -i ppp0 -p tcp --syn -j DROP
复制代码


这是一条非常有用的规则除非你的计算机运行有web服务。如果你仅打算开放一个端口,比如说80(HTTP),有种简单的办法。和许多编程语言一样,可以用一个惊叹号表示“非”。例如,你打算阻塞所有80端口以外的SYN包,我想会是这样:

  1. iptables -A INPUT -i ppp0 -p tcp --syn --destination-port ! 80 -j DROP
复制代码


这稍微有点复杂但并不难理解。

最后,如何改变链的现有规则呢?INPUT链和OUTPUT链通常默认被设置为ACCEPT而FORWARD链默认则被设置为DENY。如果你打算把一台计算机作为路由器,你可能要设置FORWARD规则为ACCEPT。如何做这个?事实上很简单。只要使用-P选项,在它后面跟上链的名字和你制定的新规则就可以了。例如,把FORWARD链改为ACCEPT规则,我们这样做:

  1. iptables -P FORWARD ACCEPT
复制代码

论坛徽章:
0
发表于 2005-01-05 10:39 |显示全部楼层

iptables基础

不错,收到,谢谢!

论坛徽章:
0
发表于 2005-01-31 14:22 |显示全部楼层

iptables基础

不過,拜托你能不能講完的?

论坛徽章:
0
发表于 2005-02-01 10:30 |显示全部楼层

iptables基础

写的不错,可是为什么我指定那个syn的策略为什么好想不起作用似的,难道要重启机器的吗,还是怎么样,请指教

论坛徽章:
0
发表于 2005-05-16 17:54 |显示全部楼层

iptables基础

哇,要的就这么详细的资料,谢谢楼主!
对了 INPUT 这个链是filter表里面的吗?能不能说说filter呢!

论坛徽章:
0
发表于 2006-01-11 22:50 |显示全部楼层
顶一个。写的简单明了,hehe。

论坛徽章:
0
发表于 2006-04-05 12:14 |显示全部楼层

正需要

谢谢
正找呢

论坛徽章:
0
发表于 2006-04-13 09:37 |显示全部楼层
很好啊 真是听君一席话胜读十年书啊。。。。。。。。。。 还有后续吗?

论坛徽章:
0
发表于 2007-01-31 16:57 |显示全部楼层
继续努力
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP