|
|
|--------------------------| ----------------------------
| Rule3: -p UDP -j DROP |
----------------------------
考虑一个由192.168.1.1到1.2.3.4的TCP包。它进入INPUT链,由Rule1检查 - 不匹配。 Rule2匹配,那么它的目标就是test,所以下一个检查由test开始。test中的第一个规则 Rule1是匹配的,但是没有指定目标,所以由第二个规则Rule2检查。结果是不匹配,而我们 到达了链的尾部。于是回到INPUT链,因为刚刚被Rule2检查,所以现在由Rule3来检查,仍然 不匹配。
所以这个包的路线是:
v __________________________
`INPUT'''' | / `test'''' v
------------------------|--/ -----------------------|----
| Rule1 | /| | Rule1 | |
|-----------------------|/-| |----------------------|---|
| Rule2 / | | Rule2 | |
|--------------------------| -----------------------v----
| Rule3 /--+___________________________/
------------------------|---
v
用户定义链可以跳转到另一个用户定义链(不过不能循环:如果发现循环,包就会被丢弃)。
7.4.2 iptables扩展:新目标
其他类型的扩展是目标。目标扩展由内核模块组成,而且iptables的一个可选扩展提供了新的命令行选项。有几个扩展是包含在默认netfilter发布中的。
LOG
--log-level
跟一个级别名称或数字。合适的名字是(忽略大小写)''''debug''''、''''info''''、''''notice''''、''''warning''''、''''err''''、''''crit''''、''''alert''''和''''emerg'''',相当于数字7到0。请参考syslog.conf的手册获取这些级别的说明。默认是''''warning''''。
--log-prefix
跟一个最多29个字符的字符串,它被写入到log信息的开始处,这样可以区别出来。
这个模块最有用的就是跟在limit match后面,这样你就不会被你的log淹没了。
REJECT
此模块和''''DROP''''效果一样,除了会发送一个''''port unreachable''''的ICMP错误报文。注意如果属于以下情况,ICMP错误报文不会发送:
o 包一开始就是ICMP错误报文,或者是未知的ICMP类型。
o 包被作为无头的分片过滤了。
o 我们已经向那里发送了太多的ICMP错误报文(参见/proc/sys/net/ipv4/icmp ratelimit)。
7.4.3 特殊的内建目标
有两个特殊的内建目标:RETURN和QUEUE。
RETURN如同到达这个链的尾部:如果是内建的链的规则,那么这个链的默认规则将被执行。如果是用户定义链,当跳至这个链中的这条规则(包含RETURN)时,回到前面的链继续匹配。
QUEUE是一个特别的目标,会为用户空间进程队列这个包。要这样使用,需要两个部件:
o 一个"queue handler",处理用户空间与内核之间的机制。
o 和一个用户空间用来接收的应用程序,可能是操作,以及对包进行裁决。
IPv4 iptables的标准queue handler是 ip_queue 模块,跟随内核发布并标记为实验中。
下面是一个如何用iptables为用户空间进程队列包的快速例子:
# modprobe iptable_filter
# modprobe ip_queue
# iptables -A OUTPUT -p icmp -j QUEUE
在这个例子中,本地生成的送出ICMP包(如由ping产生)到达ip_queue模块,然后包被试图送往用户空间应用。如果没有用户空间应用在(那儿)等着,包就被丢弃了。
要写一个用户空间应用,需要libipq API。和iptables一起发布。在CVS的testsuite tools(如redirect.c)中可以找到相关例子。
可以通过这里检查ip_queue的状态:
/proc/net/ip_queue
队列的最大长度(也就是不包含返回包的送往用户空间包的数量)可以通过这里控制:
/proc/sys/net/ipv4/ip_queue_maxlen
默认队列长度是1024。一旦达到这个长度,新的包就会被丢弃,直到队列长度小于这个值。好的协议如TCP,会对丢弃的包作出拥挤的解释,而且在队列满了后会很理想的将它挡回。无论如何,如果默认值太小的话,最好是多实验以决定队列的最大长度。
7.5 对整个链进行操作
iptables一个非常有用的特性是可以将链中相关的规则成组。你可以随意给链取名,不过我建议使用小写字母以避免与内建的链和目标产生冲突。链的名称最长为31个字母。
7.5.1 创建新链
让我们创建一个新链。因为我是个充满想象的家伙,我叫它test。使用''''-N''''或''''--new-chain''''选项:
# iptables -N test
如此简单,现在你可以像上面说的那样放入规则了。
7.5.2 删除链
删除一个链同样简单,使用 ''''-X''''或''''--delete-chain''''选项。为什么是''''-X''''?嗯,因为所有合适的字母都已经被使用了。
# iptables -X test
有几个删除链的限制:他们必须是空的(见下面的"Flushing a Chain")而且他们不能是任何规则的目标。你也不能删除任何一个内建的链。
如果你不指定链名的话,所有可以被删除的用户定义链都将被删除。
7.5.3 清空一个链
这是清除一个链中所有规则的简单方法,使用''''-F'''' 或 ''''--flush''''命令。
# iptables -F FORWARD
如果不指定链的话,所有链都将被清空。
7.5.4 对链进行列表
用''''-L''''或''''--list''''命令,你可以列出一个链中的所有规则。
用户定义链中的''''refcnt''''是有多少链的规则指向了它。这个值必须为0,然后才可以删除这个链。
如果链名被忽略,所有链都将被列出,即便是空的。
''''-L''''可以有三个选项。''''-n''''(数字)选项对于阻止iptables试图查找IP地址时非常有用,因为(如果你像大多数人一样使用DNS)如果你的DNS设置不太合适的话,可能会造成长时间的停顿,或者你滤掉了DNS请求。它还会让TCP或UDP端口以数字显示。
''''-v''''选项显示所有规则的细节,包括饱和字节计数器,TOS比较,以及接口。否则这些值是被忽略的。
注意,报和字节计数器可以分别使用''''K''''、''''M''''或者''''G''''来代替1000、1,000,000 和1,000,000,000。使用''''-x''''(扩展数字)标志来打印整个值,不管它有多大。
7.5.5 重置(清零)计数器
可以重置计数器非常有用。可以用''''-Z''''或''''--zero''''来完成。
考虑下面的:
# iptables -L FORWARD
# iptables -Z FORWARD
在上述例子中,有些包在''''-L''''和''''-Z''''命令之间通过。因此,你可以把''''-L''''和''''-Z''''一起使用,读取时就清空计数器。
7.5.6 设置原则(默认规则)
我们在前面讨论包是如何通过链的时候,已经解释了当包到达内建链的尾部时会发生什么。这时,链的原则就决定包的命运。只有内建的链(INPUT、OUTPUT和FORWARD)有原则,因为如果包到达用户定义链的尾部会返回到前面的链。
原则可以是ACCEPT或DROP,例如:
# iptables -P FORWARD DROP
8. 使用ipchains和ipfwadm
netflter发布中有ipchains.o和ipfwadm.o模块。把其中一个加载到你的内核(注意:他们和ip_tables.o不兼容)。然后你就可以像以前那样使用ipchains和ipfwadm了。
这在一段时间内仍然被支持。我认为合理的计算方式是 2*(替代发布 - 初始的稳定版本),超过了这个时间,就应当使用替代的稳定版本了。这意味着在Linux 2.6或2.8中对它们的支持很可能被放弃。
9. NAT和包过滤的混合使用
想要做网络地址转换(参见NAT HowTo)和包过滤的已很常见。好消息是他们可以混合起来使用的,而且工作得非常好。
你可以完全忽略你的NAT,来定义你的包过滤。包过滤看见的包的源及目标是“真正”的源和目标。例如,如果你将任何发往1.2.3.4 80端口的包DNAT到10.1.1.1的8080端口。包过滤器看见的是包发往10.1.1.1的8080端口(真正的目的地),而非1.2.3.4 的80端口。同样,你可以忽略伪装:看到的是包的真实外部IP地址(如10.1.1.1),而响应的则返回到那里。
你可以使用''''state''''匹配扩展,使包过滤器不需要做任何额外的工作,因为无论如何,NAT都会要求连接跟踪。扩展NAT HowTo中简单的伪装例子,以禁止任何来自ppp0接口的新的连接,你可以这样:
#对送至ppp0的包进行伪装
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# 禁止由ppp0进入的新的或不合适的包
iptables -A INPUT -i ppp0 -m state --state NEW,INVALID -j DROP
iptables -A FORWARD -i ppp0 -m state --state NEW,INVALID -j DROP
# 开启IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
10. iptables和ipchains之间的差别
o 首先,内建链的名称从小写改成了大写,因为现在的INPUT和OUTPUT链只获取指向本地和本地生成的包。他们用来检查所有进入和发送的包。
o ''''-i''''标志现在表示进入接口的意思,而且只适用于INPUT和FORWORD链。FORWORD或OUTPUT链中的规则应该将''''-i''''改为''''-o''''。
o TCP和UDP端口现在必须用--source-port或--sport(或者--destination-port/--dport)拼写,而且必须放在''''-p tcp''''或''''-p udp''''选项之后,因为TCP或UDP扩展是分别加载的。
o TCP -y 标志现在是 --syn,而且必须在''''-p tcp''''之后。
o DENY目标现在是DROP.
o 对单个链,可以在列出其工作同时清零。
o 清空内建链同时清除了原则计数器。
o 列出链给出的是一个计数器的微型的快照。
o REJECT和LOG现在是扩展目标,意思是他们是独立的内核模块。
o 链的名称最多可以是31个字符。
o MASQ现在是MASQUERADE而且使用不同的语法。REDRIRECT,在保留相同的名字时,也经历了语法的改变。参见NAT-HOWTO以获取配置它们的更多信息。
o -o选项不再用于将包传递给用户空间设备了(见上面的-i)。现在通过 QUEUE目标传递到用户空间。
o 很可能还有一些我也忘了。
11. 对制定包过滤器的建议
在计算机安全领域中,最明智的办法是阻挡所有东西,然后对需要的开启。这通常称为“凡是没有明确允许的都是禁止的”。我建议这样做如果安全是你最关心的。
不要运行任何你不需要的服务,即使你认为你已经阻碍了对它们的访问。
如果你创建专用防火墙,开始时不运行任何东西,并阻止所有包,然后添加服务并让需要的包通过。
我强调安全:结合tcp-wrappers(对于包过滤器本身的连接),代理(通过包过滤器的连接),路由验证和包过滤。路由验证是如果包来自未预期的接口那么将被删除:例如,如果你的内部网络地址是10.1.1.0/24,而一个包的源地址是你的外部接口,那么它将被丢弃。对一个接口如ppp0来说可以这样:
# echo 1 > /proc/sys/net/ipv4/conf/ppp0/rp_filter
或者对所有已有的或将有的接口:
# for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
# echo 1 > $f
# done
Debian在可能的范围了将这些设为默认。如果你使用非对称路由(如你期望包来自一个其他的方向),你可能需要在这些接口上禁止这一过滤。
记录对于当工作不正常时设置防火墙非常有用,但是在一个作为产品的防火墙上,总是应当将它与''''limit''''匹配结合,以防止有人充斥你的记录。
我极力推荐对安全系统使用连接追踪:它虽然会造成负担,因为所有连接都被追踪。但是对于控制对你的网络的访问非常有用。如果你的内核没有自动加载而且没有内建,你需要加载''''ip_conntrack.o''''这个模块。如果想要精确追踪复杂的协议,你需要加载合适的相关模块(如''''ip_conntrack_ftp.o'''')。
# iptables -N no-conns-from-ppp0
# iptables -A no-conns-from-ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A no-conns-from-ppp0 -m state --state NEW -i ! ppp0 -j ACCEPT
# iptables -A no-conns-from-ppp0 -i ppp0 -m limit -j LOG --log-prefix "Bad packet from ppp0:"
# iptables -A no-conns-from-ppp0 -i ! ppp0 -m limit -j LOG --log-prefix "Bad packet not from ppp0:"
# iptables -A no-conns-from-ppp0 -j DROP
# iptables -A INPUT -j no-conns-from-ppp0
# iptables -A FORWARD -j no-conns-from-ppp0
建造一个好的防火墙超越了这个HOWTO的范围,不过我的建议是“一切从严”。请参见Security HOWTO获取更多信息,来测试和探索你的服务器。
all pages ended here.
kingpaul @ 09:50 AM 发表于 linux | 编辑 | 留言 (0) | TrackBack (0)
2004年04月22日
Linux一句话精彩问答
瀚海星云 -- Linux精华区文章阅读
发信人: noclouds (景天云飞), 信区: Linux 标 题: Linux一句话精彩问答--2004/03/16更新 发信站: 瀚海星云 (2004年03月21日07:45:16 星期天), 站内信件
编者按:鉴于目前中国Linux的发展现状,90%以上的问题都可以用一句话来回答,这便是本文的初衷。欢迎大家添加自己的“一句话”,收录后注明原始提供者。更详细的文 档,请浏览本版精华区或http://www.douzhe.com/linux/
(注:请对照自己使用的gnu/linux释放版本,因为有的解答并不支持所有版本) ----------------------------网络无关篇-------------------------- 0001 修改主机名(bjchenxu) vi /etc/sysconfig/network,修改HOSTNAME一行为"HOSTNAME=主机名"(没有这行?那就添加这一行吧),然后运行命令" hostname 主机名"。无论你是否重启,主机名修改成功了。
0002 Ret Hat Linux启动到文字界面(不启动xwindow)(bjchenxu) vi /etc/inittab id:x:initdefault: x=3:文本方式 x=5:图形方式
0003 linux的自动升级更新问题(hutuworm,NetDC) 对于redhat,在www.redhat.com/corp/support/errata/找到补丁,6.1以后的版本带有 一个工具up2date,它能够测定哪些rpm包需要升级,然后自动从redhat的站点下载并完 成安装。 升级除kernel外的rpm: up2date -u 升级包括kernel在内的rpm: up2date -u -f
Debian跟别的发行版还是有很大的差别的,用Debian做服务器维护更加方便;红帽的升 级其实挺麻烦的,当然,如果你交钱给红帽的话,服务是会不一样的。 Debian下升级软件: apt-get update apt-get upgrade 前提:配置好网络和/etc/apt/sources.list,也可以用apt-setup设置。
0004 windows下看linux分区的软件(bjchenxu) Paragon.Ext2FS.Anywhere.2.5.rar和explore2fs-1.00-pre4.zip
0005 mount用法(sakulagi) fat32的分区 mount -o codepage=936,iocharset=cp936 /dev/hda7 /mnt/cdrom ntfs的分区 mount -o iocharset=cp936 /dev/hda7 /mnt/cdrom iso文件 mount -o loop /abc.iso /mnt/cdrom 软盘 mount /dev/fd0 /mnt/floppy USB闪存 mount /dev/sda1 /mnt/cdrom 所有/etc/fstab内容 mount -a 可以指定文件格式"-t 格式", 格式可以为vfat, ext2, ext3等.
0006 在vmware的LINUX中使用本地硬盘的FAT分区(bjchenxu) 将本地的FAT分区共享,然后在VMWARE中使用SMBFS挂上。可以将如下的行放到/etc/fsta b中: //win_ip/D$ /mnt/d smbfs defaults,auto,username=win_name,password=win_pass,codepage=936,iocharest=gb23 12 0 0 其中win_ip是你的windows的IP地址; D$是你的windows里面共享的D盘的共享名; /mnt/d是要将该分区mount到linux的目录; win_name和win_pass是你的WINDOWS里面可以读取该分区的用户,比如你的管理员名和密 码。 如果你运行了/etc/rc.d/init.d/netfs,那么在启动的时候就会自动挂载这个分区。
0007.a 删除名为-a的文件(bjchenxu) rm ./-a rm -- -a 告诉rm这是最后一个选项,参见getopt << 上一页 [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] ... 下一页 >> 没有相关教程
|