http://os.51cto.com/art/201107/273443.htm
【51CTO独家特稿】Linux系统管理员们都接触过Netfilter/iptables,这是Linux系统自带的免费防火墙,功能十分强大。在接下来的这个《深入浅出Netfilter/iptables防火墙框架》系列中,51CTO安全/Linux专家李洋将对Netfilter/iptables进行详尽的、条理的介绍。本文是基础篇,先介绍Netfilter/iptables框架的原理。
1、Netfilter/iptables框架简介
Netfilter/iptables可以对流入和流出的信息进行细化控制,且可以在一台低配置机器上很好地运行,被认为是Linux中实现包过滤功能的第四代应用程序。Netfilter/iptables包含在Linux 2.4以后的内核中,可以实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。netfilter工作在内核内部,而iptables则是让用户定义规则集的表结构。Netfilter/iptables从ipchains和ipwadfm(IP防火墙管理)演化而来,功能更加强大。
这里所说的iptables是ipchains的后继工具,但具有更强的可扩展性。内核模块可以注册一个新的规则表(table),并要求数据包流经指定的规则表。这种数据包选择用于实现数据报过滤(filter表),网络地址转换(NAT表)及数据报处理(mangle表)。Linux 2.4内核及其以上版本提供的这三种数据报处理功能都基于netfilter的钩子函数和IP表,都是相互间独立的模块,完美地集成到了由netfilter提供的框架中,如图1所示。netfilter主要提供了如下三项功能:
- 包过滤:filter表格不会对数据报进行修改,而只对数据报进行过滤。iptables优于ipchains的一个方面就是它更为小巧和快速。它是通过钩子函数NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架的。
- NAT:NAT表格监听三个netfilter钩子函数:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。NF_IP_PRE_ROUTING实现对需要转发数据报的源地址进行地址转换,而NF_IP_POST_ROUTING则对需要转发的数据报目的地址进行地址转换。对于本地数据报目的地址的转换,则由NF_IP_LOCAL_OUT来实现。
- 数据报处理:mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT钩子中进行注册。使用mangle表,可以实现对数据报的修改或给数据报附上一些外带数据。当前mangle表支持修改TOS位及设置skb的nfmard字段。
根据实际情况,灵活运用Netfilter/iptables框架,生成相应的防火墙规则可以方便、高效地阻断部分网络攻击以及非法数据报(参见图2所示的工作原理)。然而,由于配置了防火墙,可能引起诸如FTP、QQ、MSN等协议和软件无法使用或者某些功能无法正常使用,也有可能引起RPC(远程过程调用)无法执行,这需要用户根据实际情况来配置相应的服务代理程序来开启这些服务。需要特别提醒注意的是,防火墙也可能被内部攻击,其并不是万能的,还需要综合使用其他防护手段。内部人员由于无法通过Telnet浏览邮件或使用FTP向外发送信息,个别人会对防火墙不满进而可能对其进行攻击和破坏。而且,攻击的目标常常是防火墙或防火墙运行的操作系统,这极大地危害了防火墙系统甚至是关键信息系统的安全。
2、iptables基本原理
通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用Netfilter/iptables系统提供的特殊命令iptables,建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加/除去/编辑规则的命令的一般语法如下:
iptables [-t table] command [match] [target]
不难看出,一条iptables规则包含如下4个基本元素:
- 表
- 命令
- 匹配
- 目标
1) 表(table)
[-t table]选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三种可用的表选项:filter、nat和mangle。该选项不是必需的,如果未指定,则filter用作默认表。filter表用于一般的信息包过滤,包含INPUT、OUTPUT和FORWAR链。nat表用于要转发的信息包,它包含PREROUTING、OUTPUT和POSTROUTING链。如果信息包及其头内进行了任何更改,则使用mangle表。该表包含一些规则来标记用于高级路由的信息包以及PREROUTING和OUTPUT链。
2) 命令(command)
command部分是iptables命令的最重要部分,它告诉iptables命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。主要有如表1所示的命令。
表1 iptables常用命令
命 令 | 说 明 |
-A或--append | 该命令将一条规则附加到链的末尾 |
-D或--delete | 通过用-D指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则 |
-P或--policy | 该命令设置链的默认目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略 |
-N或--new-chain | 用命令中所指定的名称创建一个新链 |
-F或--flush | 如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除 |
-L或--list | 列出指定链中的所有规则 |
-R或--replace | 替换指定链中一条匹配的规则 |
-X或--delete-chain | 删除指定用户的的定义链,若没有指定链,则删除所有的用户链 |
-C或--check | 检查数据包是否与指定链的规则相匹配 |
-Z或--zero | 将指定链中所有规则的byte计数器清零 |
3) 匹配(match)
iptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类:通用匹配和特定于协议的匹配。这里,将研究可用于采用任何协议的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其说明,如表2所示。
表2 通用匹配说明
通用匹配 | 说 明 |
-p或--protocol | 该通用协议匹配用于检查某些特定协议。协议示例有TCP、UDP、ICMP、用逗号分隔的任何这三种协议的组合列表以及ALL(用于所有协议)。ALL是默认匹配。可以使用!符号表示不与该项匹配 |
-s 或 --source | 该源匹配用于根据信息包的源IP地址来与它们匹配。该匹配还允许对某一范围内的IP地址进行匹配,可以使用!符号,表示不与该项匹配。默认源匹配与所有IP地址匹配 |
-d 或 --destination | 该目的地匹配用于根据信息包的目的地IP地址来与它们匹配。该匹配还允许对某一范围内IP地址进行匹配,可以使用!符号表示不与该项匹配 |
--sport | 指定匹配规则的源端口或端口范围 |
--dport | 指定匹配规则的目的端口或端口范围 |
-i | 匹配单独的网络接口或某种类型的接口设置过滤规则 |
4) 目标(target)
前面已经讲过,目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。下面是常用的一些目标及其示例和说明,如表3所示。
表3 目标项说明
目 标 项 | 说 明 |
ACCEPT | 当信息包与具有ACCEPT目标的规则完全匹配时,会被接受(允许它前往目的地) |
DROP | 当信息包与具有DROP目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为-j DROP |
REJECT | 该目标的工作方式与DROP目标相同,但它比DROP好。和DROP不同,REJECT不会在服务器和客户机上留下死套接字。另外,REJECT将错误消息发回给信息包的发送方。该目标被指定为-j REJECT |
RETURN | 在规则中设置的RETURN目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如INPUT之类的主链,则使用该链的默认策略处理信息包。它被指定为-jump RETURN |
LOG | 表示将包的有关信息记录入日志 |
TOS | 表示改写数据包的TOS值 |
下一篇:深入浅出Netfilter/iptables防火墙框架(入门篇)
深入浅出Netfilter/iptables防火墙框架(入门篇)
http://os.51cto.com/art/201107/275664.htm
【51CTO独家特稿】Linux系统管理员们都接触过Netfilter/iptables,这是Linux系统自带的免费防火墙,功能十分强大。在这个《深入浅出Netfilter/iptables防火墙框架》系列中,51CTO安全/Linux专家李洋将对Netfilter/iptables进行详尽的、条理的介绍。上一篇(基础篇)介绍了netfilter/iptables的原理,本文是入门篇,介绍Netfilter/iptables框架的安装、启动和简单应用。
1、安装和启动Netfilter/iptables系统
因为Netfilter/iptables的netfilter组件是与内核2.4.x集成在一起的,高版本的Linux都配备了netfilter这个内核工具,所以一般不须要下载,而只要下载并安装iptables用户空间工具的源代码包:http://www.netfilter.org/projects/iptables/downloads.html。目前,最新源代码安装包是:iptables-1.4.10.tar.bz2。
在开始安装iptables用户空间工具之前,要对系统做某些修改,主要有如下选项须要配置修改:
- CONFIG_PACKET:如果要使应用程序和程序直接使用某些网络设备,那么这个选项是有用的。
- CONFIG_IP_NF_MATCH_STATE:如果要配置有状态的防火墙,那么这个选项非常重要而且很有用。这类防火墙会记得先前关于信息包过滤所做的决定,并根据它们做出新的决定。
- CONFIG_IP_NF_FILTER:这个选项提供一个基本的信息包过滤框架。如果打开这个选项,则会将一个基本过滤表(带有内置的INPUT、FORWARD和OUTPUT链)添加到内核空间。
- CONFIG_IP_NF_TARGET_REJECT:这个选项允许指定:应该发送ICMP错误消息来响应已被DROP掉的入站信息包,而不是简单地杀死这些信息包。
安装源代码包:
//将源代码文件解压缩 #bzip2 -d iptables-1.4.10-tar.bz2 #tar -xvf iptables 1.4.10.tar //切换目录 #cd iptables 1.4.10 //编译该工具,指定编译的内核目录为/usr/src/linux-2.6.4-8 #make KERNEL_DIR=/usr/src/linux-2.4.16-8 //执行make install命令,同样设定内核目录为/usr/src/linux-2.6.4-8 #make install KERNEL_DIR=/usr/src/linux-2.6.4-8
安装完成后,就可以启动防火墙了:
//使用service命令手工启动 # service iptables start
如果想要在系统启动的时候也启动该防火墙服务,那么可以使用setup命令,然后进入System service选项,选择iptables守护进程即可。
2、 Iptables简单应用
1) 基本规则应用
下面将给出运用上述框架理论形成规则的一些简单示例,以供读者在实际的应用过程中进行模仿和使用:
(1)接受来自指定IP地址的所有流入的数据包:
#iptables -A INPUT -s 203.159.0.10 -j ACCEPT
(2)只接受来自指定端口(服务)的数据包:
#iptables -D INPUT --dport 80 -j DROP
(3)允许转发所有到本地(198.168.10.13)smtp服务器的数据包:
#iptables -A FORWARD -p tcp -d 198.168.10.13 --dport smtp -i eth0 -j ACCEPT
(4)允许转发所有到本地的udp数据包(诸如即时通信等软件产生的数据包):
#iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
(5)拒绝发往WWW服务器的客户端的请求数据包:
#iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j REJECT
(6)允许目的为指定端口的tcp数据包进入:
#iptables -A INPUT -p tcp -m multiport --destination-port 21,53,80,25,110 ACCEPT
(7)允许来源为指定端口的tcp数据包进入:
#iptables -A INPUT -p tcp -m multiport --source-port 21,53,80,25,110 ACCEPT
(8)丢掉SYN和ACK标志位置位的数据包:
#iptables -A INPUT-p tcp --tcp-flags ALL SYN,ACK DROP
2) 碎片检测及流量控制
(1)检查IP碎片:在TCP/IP网络中,链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU,这些被分段的片段就成为IP碎片。那么,如果在防火墙处不对IP碎片进行特别处理的话,那么有可能部分IP碎片会被防火墙拦截,从而影响到接受端对这些碎片的还原,并最终影响到信息的完整性和可用性问题,所以,下面的例子给出防火墙允许IP碎片通过的规则:
#iptables -A FORWARD -p tcp -f -s 172.168.96.0/24 -d 172.168.97.18 -j ACCEPT
需要特别留意上述规则中的-f选项,它指定了第二个以及以后的IP碎片将由防火墙来处理通过,否则的话,考虑下面的规则,防火墙有可能对其第二个及其以后的IP碎片进行拦截,从而影响正常的信息流通:
#iptables -A FORWARD -p tcp -s 172.168.96.0/24 -d 172.168.97.18 -j ACCEPT
(2)速率限制:iptables提供了非常健全的速率控制机制,主要用来限制由外向内的单位时间内通过的数据包个数,这样做的一个直接的好处就是尽可能地抑制前面多次提到的拒绝服务攻击或者是分布式拒绝服务攻击,因为这两种攻击的一个非常典型的表现就是单位时间内有很多数据包涌向目的地。所以,我们可以使用下面的规则来限制单位时间内允许通过防火墙,从而进入被保护网络的数据包个数:
#iptables -A INPUT -m limit --limit 200/second #iptables -A INPUT -m limit --limit 10000/minute
上述两条规则分别限制1秒内和1分钟内通过的数据包个数不能超过200和10000个。当然,在实际应用中,也可以通过/second、/minute、、/hour、/day这样的时间间隔来进行设定,并且,其中诸如200和10000这些具体数值的设定需要用户根据具体情况和经验来进行设定,没有规定的数值可循。
另外,在设定速率限制后,还可以设定超过该限制所触发的一些处理事件,比如说直接丢弃。下面的规则表示当速率超过200限制后,将直接对后续数据包进行丢弃:
#iptables -A INPUT -m limit --limit-burst 200
iptables的基础知识-iptables包的转发过程
http://os.51cto.com/art/201103/249751.htm
iptables包的转发过程:包在IPTABLES中如何走?
当一个包进入或者送出或者被转发的时候,是依据什么呢?都会经过哪些表和哪些链呢?
iptabeles中内建有三个表,分别为MANGLE,NAT,FILTER,当为未指定规则表时,则默认为filter表,若要将rule加到其他表中,则要用-t来指明。
其中有个表叫mangle,这个词难以表达,我只能把我理解的写出来。意思就是,会对数据包的一些传输特性进行修改,在mangle表中允许的操作是TOS、TTL、MARK。也就是说,今后只要我们见到这个词能理解它的作用就行了。
强烈建议你不要在这个表里做任何过滤,不管是DANT,SNAT或者Masquerade。
Nat表就是地址转换了,可以做DNAT,SNAT,可做一对一,一对多,多对对转换,该表有Prerouting 和 postrouting两条规则链。DNAT操作主要用在这样一种情况,你有一个合法的IP地址,要把对防火墙的访问重定向到其他的机子上(比如DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。SNAT改变包的源地址,这在极大程度上可以隐藏你的本地网络或者DMZ等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就能自动地对包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能连接到Internet。如果使用类似192.168.0.0/24这样的地址,是不会从Internet得到任何回应的。因为IANA定义这些网络(还有其他的)为私有的,只能用于LAN内部。MASQUERADE的作用和SNAT完全一样,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的
Filter表就是我们最常用的了,iptables包过滤就靠这个了,系统默认建有三个链,INPUT,OUTPUT还有FORWARD,这个表用来进行封包过滤的处理(如:DROP,ACCEPT,LOG,REJECT,ULOG等),基本规则都建在这个表中。
注:所谓的链就是规则的集合,也可以自定义链
当数据包到达防火墙时,如果MAC地址符合,就会由内核里相应的驱动程序接收,然后会经过一系列操作,从而决定是发送给本地的程序,还是转发给其他机子,还是其他的什么。
以本地为目标的iptables包(就是我们自己的机子了)
Step(步骤) Table(表) Chain(链) Comment(注释)
1 在线路上传输(比如,Internet)
2 进入接口 (比如,eth0)
3 Mangle PREROUTING 这个链用来mangle数据包,比如改变TOS等
4 Nat PREROUTING 这个链主要用来做DNAT。不要在这个链做过虑操作,因为某些情况下包会溜过去。
5 路由判断,比如,iptables包是发往本地的,还是要转发的。
6 Mangle INPUT 在路由之后,被送往本地程序之前,mangle数据包。
7 Filter INPUT 所有以本地为目的的iptables包都要经过这个链,不管它们从哪儿来,对这些iptables包的过滤条件就设在这里。
8 到达本地程序了(比如,服务程序或客户程序)
现在我们来看看源地址是本地器的包要经过哪些步骤:
以本地为源的iptables包
Step Table Chain Comment
1 本地程序(比如,服务程序或客户程序)
2 路由判断,要使用源地址,外出接口,还有其他一些信息。
3 mangle OUTPUT 在这儿可以mangle包。建议不要在这儿做过滤,可能有副作用哦。
4 nat OUTPUT 这个链对从防火墙本身发出的包进行DNAT操作。
5 filter OUTPUT 对本地发出的iptables包过滤。
6 mangle POSTROUTING 这条链主要在包DNAT之后(译者注:作者把这一次DNAT称作实际的路由,虽然在前面有一次路由。对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个包具体到哪儿去,要由NAT代码处理之后才能确定。所以把这称作实际的路由。),离开本地之前,对iptables包 mangle。有两种包会经过这里,防火墙所在机子本身产生的包,还有被转发的包。
7 nat POSTROUTING 在这里做SNAT。但不要在这里做过滤,因为有副作用,而且有些iptables包是会溜过去的,即使你用了DROP策略。
8 离开接口(比如: eth0)
9 在线路上传输(比如,Internet)
在这个表中有个要注意的地方,从本机发出的包,要经过NAT 中的OUTPUT。
在这个例子中,我们假设一个iptables包的目的是另一个网络中的一台机子。让我们来看看这个iptables包的旅程:
转发iptables包
Step Table Chain Comment
1 在线路上传输(比如,Internet)
2 进入接口(比如, eth0)
3 mangle PREROUTING mangle数据包,,比如改变TOS等。
4 nat PREROUTING 这个链主要用来做DNAT。不要在这个链做过虑操作,因为某些情况下包会溜过去。稍后会做SNAT。
5 路由判断,比如,包是发往本地的,还是要转发的。
6 mangle FORWARD 包继续被发送至mangle表的FORWARD链,这是非常特殊的情况才会用到的。在这里,包被mangle(还记得mangle的意思吗)。这次mangle发生在最初的路由判断之后,在最后一次更改包的目的之前(译者注:就是下面的FORWARD链所做的,因其过滤功能,可能会改变一些包的目的地,如丢弃包)。
7 filter FORWARD 包继续被发送至这条FORWARD链。只有需要转发的包才会走到这里,并且针对这些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是外网到内网的还是内网到外网的。在你自己书写规则时,要考虑到这一点。
8 mangle POSTROUTING 这个链也是针对一些特殊类型的包(译者注:参考第6步,我们可以发现,在转发包时,mangle表的两个链都用在特殊的应用上)。这一步mangle是在所有更改包的目的地址的操作完成之后做的,但这时包还在本地上。
9 nat POSTROUTING 这个链就是用来做SNAT的,当然也包括Masquerade(伪装)。但不要在这儿做过滤,因为某些包即使不满足条件也会通过。
10 离开接口(比如: eth0)
11 又在线路上传输了(比如,LAN)
就如你所见的,包要经历很多步骤,而且它们可以被阻拦在任何一条链上,或者是任何有问题的地方。所有要经防火墙转发的包都要经过FORWARD链。
由上边的表格和图可以看出,iptables 处理包的流动,分述如下:
INPUT:只有要到本机的封包才会由 INPUT 处理,所以会让來自內部网络的封包无条件放行,而来自外部的封包則过滤,是否为回应包,若是則放行。
PREROUTING:需要转送处理的封包由此处理,用来做目的地 IP 的翻译(DNAT)。
FORWARD:源IP和目的IP都不是本机的,就要被转发,所有要转发的封包都在这里处理,这部分的过滤规则最为复杂。
POSTROUTING:转发封包送出之前,先同过这个来进行源IP的翻译(SNAT)。
OUTPUT:从本机发送出去的包都有此处理,通常放行所有封包。
从上边看得出,对于iptables来说,是依据IP地址进行决策,也就是说包中的IP地址决定一个包的流向。
进入FORWRAD的一定不会进入到INPUT和OUTPUT。
在处理过程中如果符合某条规则将会进行处理,处理动作除有ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 外还有LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等。
我们可以使用< iptables save file > 将结果保存到指定文件中,然后用< iptables restore file > 将指定文件的内容加载,或者写成脚本,然后执行脚本就可以了。我推荐使用脚本,因为可以使用shell编程,从而写出强大,灵活的脚本来。iptables包的转发过程就讲到这里啦。
Linux下Iptables端口转发功能的解决
Linux下Iptables端口转发功能的解决:
先从一个实例说:有一企业就一个服务器软件做测试。基于win2k的,端口号为881,服务器直接连接外部网络,客户端通过服器ip来访问。排除Windows,如果是使用Linux,那么该如何解决iptables端口转发的问题。经过资料的查阅,iptables的端口转发功能是可以解决的,以下是Linux下Iptables端口转发功能的解决方法:
目标:利用端口转发,当服务器接收到881端口请求以后,将其转到 10.10.2.200:881上,10.10.2.200再将数据返回给请求连接。
Eth0:连接ADSL,即ppp0接口
Eth1:连接内部网络,ip为10.10.1.1
10.10.2.200为win2k服务器,其端口881提供网络服务。
iptbles脚本:
- iptables -t nat -A PREROUTING -p tcp -m tcp --dport 881 -j DNAT --to-destination 10.10.2.200:881
将881请求发至10.10.2.00:881端口
- iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -d 10.10.2.200 -p tcp -m tcp --dport 881 -j SNAT --to-source
10.10.1.1 ;返回a.b.b.d时数据源来自同一子网,就将其源地址更改为10.10.1.1,从eth0发出,并在连接跟踪表中查出a.b.c.d
从ppp0进来的,又由ppp0将此数据发出。
当然不要忘了加一条允许881端口访问的语句。
- iptables –A INPUT –p tcp –dport 881 –i ppp0 –j ACCEPT
可不可把服务器放在局域内,用端口转发来实现呢?答案当然是肯定的,既然能把881端口转发,那么21,80这些个端口更不在话,并且很多服务器软件都可以自定义端口,那就在得玩了,只要有合适的端口,即使给局域网每一个用户开一个ftp服务器也是可的。你想要实现什么服务都可以,当然是基于端口转发的。
局域网内10.10.2.101是win2k,提供www服务,端口为800。通过服务器http://serverip:800 进行访问。
- iptables -t nat -A PREROUTING -p tcp -m tcp --dport 800 -j DNAT --to-destination 10.10.2.101:800
- iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -d 10.10.2.101 -p tcp -m tcp --dport 800 -j SNAT --to-source
- 10.10.1.1
- iptables –A INPUT –p tcp –dport 800 –i ppp0 –j ACCEPT
由于是基于端口转发实现的,所以服务器上只需装个iptables来转发数据就行了,一切服务由内部服务器完成,这样的话,linux服务器才真正的算是个防火墙,Linux下Iptables端口转发功能也就实现了。