当前位置: 首页 >> 网络协议与安全 >> 基于IP Filter的防火墙--学习IPfilter的好资料
 

基于IP Filter的防火墙--学习IPfilter的好资料

作者:      来源:     发表时间:2006-05-08     浏览次数:      字号:    

3.4 有状态的icmp

IPFilter像处理tcp,udp一样处理icmp状态,就像你理解的那样。ICMP主要有两种信息类型:请求和回复。 假设我们写了这样一条规则:

pass out on tun0 proto icmp from any to any icmp-type 8 keep state

允许向外发送回复请求(典型的ping),结果是类型为icmp-type 0的包回复并通过。这条状态记录是一种不完全的0/0(相比4/4)状态,它将在60秒的空闲时间后删除。这样当你为每个外出的icmp包保存状态,你将会得到每个icmp的回复。
然而,大部分icmp消息是由错误的udp(有时是tcp)包产生的,而且在3.4.X的ipfilter中错误的icmp消息(超时或端口不可达)会根据udp(有时是tcp)状态记录而通过防火墙。在旧的ipfilter中,如果你想让traceroute正常工作,你需要这样:
pass out on tun0 proto udp from any to any port 33434><33690 keep state
pass in on tun0 proto icmp from any to any icmp-type timex

而现在你只需要为udp保存状态就可以了:
pass out on tun0 proto udp from any to any port 33434><33690 keep state
block in quick on tun0 all
pass out quick on tun0 proto tcp from 20.20.20.1/32 to any keep state

为了防止第三方icmp消息通过一个活动的连接进入你的防火墙,防火墙不仅对进入的icmp消息进行源地址和目的地址的检查(有时包括端口,如果可用的话),还对icmp消息中的荷载(产生icmp消息的包的一部分)进行检查。

3.5 FIN扫描检测;关键字flags,keep frags

先回顾一下上面的4条规则

pass in quick on tun0 proto tcp from any to 20.20.20.1/32 port = 23 keep state
pass out quick on tun0 proto tcp from any to any keep state
block in quick all
block out quick all

这几条规则还不能令人满意,问题在于不仅允许SYN包到达23端口而且允许老的数据包通过。我们可以用关键字flags改变上面的规则:
pass in quick on tun0 proto tcp from any to 20.20.20.1/32 port = 23 flags S keep state
pass out quick on tun0 proto tcp from any to any flags S keep state
block in quick all
block out quick all

现在只有目的地址是20.20.20.1,目的端口23带有SYN标志的tcp包可以通过。SYN标志只存在于tcp会话的第一个数据包(称为tcp第一次握手),这也是我们所希望,这样做至少有两个好处:首先不是所有的包都可以进入防火墙并把你的状态表搞的乱七八糟。其次,FIN和XMAS扫描将会行不通,因为它们的标志位不是SYN。现在进入的数据包要么是SYN包要么是已经建立连接的数据包。如果其它的数据包进入,很可能是端口扫描或者伪造的数据包,但是也有可能是一个分片。IPF用关键字keep frags就可以处理分片。加上这个关键字,IPF将跟踪那些分片,允许我们需要的分片通过。我们重写一下规则,允许分片并记录伪装包:
pass in quick on tun0 proto tcp from any to 20.20.20.1/32 port = 23 flags S keep state keep frags
pass out quick on tun0 proto tcp from any to any keep state flags S keep frags
block in log quick all
block out log quick all

这几条规则将起作用,因为所有的包在block之前就已经通过了。但是无法发现SYN扫描,如果你感到不爽你可以记录所有的SYN包。

3.6 回应被阻止的数据包

现在被我们阻止的包都被丢弃,或者记录,我们没有发送任何回应包给源主机。有时侯这不是最好的办法,因为如果这样做就等于告诉一个攻击者我们有一个包过滤器。最好是我们能够误导使攻击者相信我们没有包过滤器,并且没有提供服务可供攻击。
当一个服务运行在unix系统上,它通常通过回复包让远程主机知道。在tcp中使通过RST包来回复。当阻止一个tcp通过时,实际上IPF返回一个RST给源主机(用关键字return-rst)。现在我们可以这样做

block return-rst in log proto tcp from any to 20.20.20.0/24 port = 23
block in log quick on tun0
pass in all

return-rst只适用于tcp,我们还想用于udp,icmp及其它协议(下面将介绍),现在远程主机将得到connection refused而不是connection timed out。
当有人给你的系统的一个udp端口发送数据包,防火墙也可能发送一条错误信息。只要你的规则是这样的:
block in log quick on tun0 proto udp from any to 20.20.20.0/24 port = 111

你可以用加入return-icmp关键字的规则来代替上面的规则来发送回复
block return-icmp(port-unr) in log quick on tun0 proto udp from any to 20.20.20.0/24 port = 111

根据tcp/ip的规范,当给服务器某个端口发送一个数据包,而服务器没有服务进程在监听这个端口时将发出port-unreachable。当然你可以用其它的icmp类型,但是port-unreachable可能是最好的。这也是默认的用来回复的icmp类型
然而当你用return-icmp的时候,你将会发现也不是很安全的,因为icmp包包含了防火墙的ip地址,而不是原始数据包的目的地址。这个问题已经在ipfilter3.3以后的版本中得到解决,一个新的关键字return-icmp-as-dest已经加入。这是新的规则:
block return-icmp-as-dest(port-unr) in log on tun0 proto udp from any to 20.20.20.0/24 port = 111

另外,你要慎用回复包,只有在你很清楚你要对什么数据进行回复的时候才能使用。例如:如果你给局域网的广播地址发送return-icmp,局域网将会在短时间内被淹没。

3.7 日志

如果你要使用日志设备dev/ipl,记得要加入关键字log.为了要看到日志信息,你必须运行ipmon(或者其它读取/dev/ipl的软件)。一般是使用ipmon -s向syslog写入信息。以ipfilter3.3为例,你甚至可以通过关键字log level控制syslog记录的行为:

block in log level auth.info quick on tun0 from 20.20.20.0/24 to any
block in log level auth.alert quick on tun0 proto tcp from any to 20.20.20.0/24 port = 21

另外你还可以对记录的信息进行裁剪,比如你对是否有人对你的telnet扫描感兴趣,但是对有人扫描你的telnet端口多少次并不感兴趣,你可以log first关键字来记录第一个包。
log的另外一个用处是跟踪你感兴趣的包,并且记录它的头部字段。Ipfilter使用关键字log body可以记录每个包的前128个字节。你应该限制使用body log,因为它会让你的日志变得冗长。

3.8 合并所有规则

现在我们有了一个非常严谨的防火墙了,但是它可以更严谨。先前我们去掉的防止欺骗的规则集实际上是很有用的。建议把它加上:

block in on tun0
block in quick on tun0 from 192.168.0.0/16 to any
block in quick on tun0 from 172.16.0.0/12 to any
block in quick on tun0 from 10.0.0.0/8 to any
block in quick on tun0 from 127.0.0.0/8 to any
block in quick on tun0 from 0.0.0.0/8 to any
block in quick on tun0 from 169.254.0.0/16 to any
block in quick on tun0 from 192.0.2.0/24 to any
block in quick on tun0 from 204.152.64.0/23 to any
block in quick on tun0 from 224.0.0.0/3 to any
block in log quick on tun0 from 20.20.20.0/24 to any
block in log quick on tun0 from any to 20.20.20.0/32
block in log quick on tun0 from any to 20.20.20.255/32
pass out quick on tun0 proto tcp/udp from 20.20.20.1/32 to any keep state
pass out quick on tun0 proto icmp from 20.20.20.1/32 to any keep state
pass in quick on tun0 proto tcp from any to 20.20.20.1/32 port = 80 flags S keep state

3.9 用规则组优化防火墙

让我们扩展一下我们的防火墙,使我们的防火墙更有用,作为例子我们将改变一下接口名字xl0,xl1,xl2。
xl0接外部网络20.20.20.0/26
xl1用于代理20.20.20.64/26
xl2连接受防火墙保护的网络20.20.20.128/25
我们先定义整个规则,你应该能清楚地理解它:

block in quick on xl0 from 192.168.0.0/16 to any
block in quick on xl0 from 172.16.0.0/12 to any
block in quick on xl0 from 10.0.0.0/8 to any
block in quick on xl0 from 127.0.0.0/8 to any
block in quick on xl0 from 0.0.0.0/8 to any
block in quick on xl0 from 169.254.0.0/16 to any
block in quick on xl0 from 192.0.2.0/24 to any
block in quick on xl0 from 204.152.64.0/23 to any
block in quick on xl0 from 224.0.0.0/3 to any
block in log quick on xl0 from 20.20.20.0/24 to any
block in log quick on xl0 from any to 20.20.20.0/32
block in log quick on xl0 from any to 20.20.20.63/32
block in log quick on xl0 from any to 20.20.20.64/32
block in log quick on xl0 from any to 20.20.20.127/32
block in log quick on xl0 from any to 20.20.20.128/32
block in log quick on xl0 from any to 20.20.20.255/32
pass out on xl0 all

pass out quick on xl1 proto tcp from any to 20.20.20.64/26 port = 80 flags S keep state
pass out quick on xl1 proto tcp from any to 20.20.20.64/26 port = 21 flags S keep state
pass out quick on xl1 proto tcp from any to 20.20.20.64/26 port = 20 flags S keep state
pass out quick on xl1 proto tcp from any to 20.20.20.65/32 port = 53 flags S keep state
pass out quick on xl1 proto udp from any to 20.20.20.65/32 port = 53 keep state
pass out quick on xl1 proto tcp from any to 20.20.20.66/32 port = 53 flags S keep state
pass out quick on xl1 proto udp from any to 20.20.20.66/32 port = 53 keep state
block out on xl1 all
pass in quick on xl1 proto tcp/udp from 20.20.20.64/26 to any keep state

block out on xl2 all
pass in quick on xl2 proto tcp/udp from 20.20.20.128/25 to any keep state


从这个例子中,我们可以看出我的规则集变得越来越臃肿了。如果我们加入跟多的规则时,情况会变得更严重。影响到xl0与xl2之间通信的性能。如果你建立这样的防火墙,你会浪费大量的带宽和cpu时间,你可以通过建立规则分组来优化防火墙的性能。规则组允许你的规则写成树状结构而不是线形结构。树状结构将原来的规则按某种方式(如接口,ip地址)分成不同的组,而每个组有一条组规则,当一个包进入防火墙的时候先检查组规则,如果不符合则跳过整个规则组,这看起来就像一台机器上有好几个防火墙。
我们先从简单的例子开始:
block out quick on xl1 all head 10
pass out quick proto tcp from any to 20.20.20.64/26 port = 80 flags S keep state group 10
block out on xl2 all

在这个简单的例子中,我们可以看出规则组的作用。当一个数据包的目标接口不是xl1的时候,不匹配规则组10组,并跳过第10组,当数据包的目标接口是xl1时匹配规则组10组其它规则短路(不起作用)。用这种方法我们重写上面的规则提高防火墙的性能。
block in quick on xl0 all head 1
block in quick on xl0 from 192.168.0.0/16 to any group 1
block in quick on xl0 from 172.16.0.0/12 to any group 1
block in quick on xl0 from 10.0.0.0/8 to any group 1
block in quick on xl0 from 127.0.0.0/8 to any group 1
block in quick on xl0 from 0.0.0.0/8 to any group 1
block in quick on xl0 from 169.254.0.0/16 to any group 1
block in quick on xl0 from 192.0.2.0/24 to any group 1
block in quick on xl0 from 204.152.64.0/23 to any group 1
block in quick on xl0 from 224.0.0.0/3 to any group 1
block in log quick on xl0 from 20.20.20.0/24 to any group 1
block in log quick on xl0 from any to 20.20.20.0/32 group 1
block in log quick on xl0 from any to 20.20.20.63/32 group 1
block in log quick on xl0 from any to 20.20.20.64/32 group 1
block in log quick on xl0 from any to 20.20.20.127/32 group 1
block in log quick on xl0 from any to 20.20.20.128/32 group 1
block in log quick on xl0 from any to 20.20.20.255/32 group 1
pass in on xl0 all group 1

pass out on xl0 all

block out quick on xl1 all head 10
pass out quick on xl1 proto tcp from any to 20.20.20.64/26 port = 80 flags S keep state group 10
pass out quick on xl1 proto tcp from any to 20.20.20.64/26 port = 21 flags S keep state group 10
pass out quick on xl1 proto tcp from any to 20.20.20.64/26 port = 20 flags S keep state group 10
pass out quick on xl1 proto tcp from any to 20.20.20.65/32 port = 53 flags S keep state group 10
pass out quick on xl1 proto udp from any to 20.20.20.65/32 port = 53 keep state group 10
pass out quick on xl1 proto tcp from any to 20.20.20.66/32 port = 53 flags S keep state
pass out quick on xl1 proto udp from any to 20.20.20.66/32 port = 53 keep state group 10

pass in quick on xl1 proto tcp/udp from 20.20.20.64/26 to any keep state

block out on xl2 all
pass in quick on xl2 proto tcp/udp from 20.20.20.128/25 to any keep state


现在你可以看到规则组起作用了。当xl2网络的主机不是与xl0网络通信时将绕过规则组10,不受规则组10的检查。在不同的情况下,你可以根据协议或者机器或者网络块进行分组。

3.10 关键字Fastroute

尽管我们已经转发一些数据包并阻止其它一些数据包,这样看起来,我们的机器像一台路由器,防火墙同样也减少数据包TTL的值(一跳减一)而且告诉外面我们已经收到了数据包。但是我们可以在一些应用中(比如unix的traceroute)隐藏我们的存在,不减少TTL的值。如果我们想让进入的 traceroute正常工作,但是我们不想让它知道防火墙的存在,我们可以这样做:

block in quick on xl0 fastroute proto udp from any to any port 33434 >< 33465

关键字fastroute将告诉ipfilter不要让这个包进入unix的ip栈,因为进入unix的ip栈会减少TTL的值。这个数据包会被防火墙偷偷的放到正确的出口,而且不会减少TTL的值。当然ipfilter会根据系统路由表指出数据包从哪个接口出去。
在这个例子中,我们使用了block quick是有理由的。如果我们使用了pass,而且我们在内核中打开ip转发,我们将会有两条这个数据包的出口路径,内核就很有可能"不知所措"。
需要注意的是,大部分unix的内核路由的代码比ipfilter的效率更高,因此这个关键字不是用来提高防火墙的性能,而仅仅是用来隐藏我们自己。

4. 网络地址转换和代理

防火墙一个最大的应用是使几台机器可以通过一个公用的外部接口连到外部网络。对于那些熟悉linux的用户来说,这个概念就是ip伪装,对于其他人来说它有一个更模糊的说法"网络地址转换",简称NAT.
其实ipfilter可以称为NPAT,因为ipfilter不仅对地址进行转换还对端口进行转换,而NAT只是改变了地址。

4.1 多个地址转换为一个地址

基本的NAT可以完成Linux ip伪装的功能,可以这样做:

map tun0 192.168.1.0/24 -> 20.20.20.1/32

很简单,只要源地址符合192.168.1.0/24通过tun0出去的数据包,它的源地址都会被改写为20.20.20.1而目的地址不会改变。系统为地址转换维护一个表,这样回复的包都可以根据这个表转换为正确的地址(20.20.20.1转换成内网地址)。
我们刚才写的那条规则有个缺点:在大部分情况下,我们不知道我们外网的ip地址(动态地址),幸好NAT解决了这个问题,它可以用0/32来代替,当它发现地址是0/32时它就知道应该查找接口的真正地址。
map tun0 192.168.1.0/24 -> 0/32

现在我们可以放心的加载NAT规则了,并且不用做任何修改就可以连到外部网了。你所需要做的仅仅是当你的IP地址改变后运行一下ipf -y
你或许会想到当地址转换的时候,端口有什么变化。以我们现在的规则源端口是不会改变的,在有些场合我们希望端口也能够改变,例如,当你的防火墙上面还有一个防火墙,而我们又需要通过这个防火墙,或者是有很多主机用到了相同的源端口,这个时候就会发生冲突,ipnat可以用关键字portmap解决这个问题:
map tun0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:30000

它的作法是将所有的链接都塞入20000到30000之间的端口。

4.2 多地址影射到地址池

NAT另外一个用法是将很多的静态地址映射(地址转换)到较少量的地址空间,利用你所学的知识就能够做到:

map tun0 192.168.0.0/16 -> 20.20.20.0/24 portmap tcp/udp 20000:60000

当然有些远程运用需要多个链接来自同一个ip地址(比如192.168.0.31需要访问218.9.121.110,它的并发链接经过NAT之后很有可能来自不同的IP地址),我们可以告诉NAT静态的映射每个链接,用关键字map-block实现:
map-block tun0 192.168.1.0/24 -> 20.20.20.0/24

4.3 点对点映射

bimap tun0 192.168.1.1/32 -> 20.20.20.1/32

4.4 伪装

假设我们有一台web服务器地址是20.20.20.5,我们怀疑我们网络的安全性有问题,我们不想在端口80上提供服务,因为它需要用root来运行一小段时间。我们如何让web服务器运行于8000端口呢?客户机如何访问呢?我们可以使用NAT的重定向来解决这个问题,指示所有对 20.20.20.5:80访问都指向20.20.20.5:8000,用rdr关键字来实现:

rdr tun0 20.20.20.5/32 port 80 -> 20.20.20.5 port 8000

当然这里我们也可以指定协议,如果我们想重定向一个udp服务而不是tcp(tcp是默认的)。例如,如果我们在防火墙上有一个模仿windows后门的"蜜罐",我们可以把整个网络都定向到这个地方:
rdr tun0 20.20.20.0/24 port 31337 -> 127.0.0.1 port 31337 udp

rdr有一个相当重要的地方:你不能简单地把重定向用成“反射镜”。例如:
rdr tun0 20.20.20.5/32 port 80 -> 20.20.20.6 port 80 tcp
将不会正常工作,因为.5和.6在同一个局域网段上。首先,一个到达20.20.20.5接口tun0的数据包将会被重定向到20.20.20.6,也就是它的目的地址被修改了,然后被送到ipf过滤规则进行过滤(注意作用顺序,先地址转换后过滤),如果它通过了ipf,那么它就被送到unix路由代码处,这个时候这个数据包目的地址被改了,但是它的目的接口还是tun0,系统就不知道该怎么办了。因此"反射镜"是不能正常工作的。记住:使用rdr时,目的地址必须是从不同的接口离开防火墙。

4.5 透明代理

当你在建立一个防火墙的时候,你会认为应该谨慎的使用代理,你可以"绷紧"你的防火墙规则来保护你的内部网。或者你认为你的NAT没有正常的工作,你可以使用重定向:

rdr xl0 0.0.0.0/0 port 21 -> 127.0.0.1 port 21

这条规则是说任何连接ftp的数据包都被重定向到了127.0.0.1
针对ftp的代理有些复杂,因为web浏览器或者其它自动登录类型的客户端不知道如何跟代理通信。有个补丁是针对TIS防火墙的sftp-gw,NAT配合这个补丁能够解决这个问题。很多代理软件是透明代理(如squid)。
当你想强迫你的用户先向代理请求验证时,关键字rdr经常是很有用的。(例如你想让你的工程师能够上网冲浪,但是不希望呼叫中心的员工上网)

4.6 应用代理

ftp有两种工作方式,如果想让防火墙后面的ftp正常工作,应该使用应用代理。我们可以让我们的防火墙注意通过它的每一个包,当它发现它正在处理的是主动ftp连接,它能够产生几条临时规则,就像keep state,使得ftp的数据传输能够正常工作。我们需要些这样的规则:

map tun0 192.168.1.0/24 -> 20.20.20.1/32 proxy port ftp ftp/tcp

记得把这条规则写在其它映射规则的前面,否则其它映射规则在这条规则就起作用了,记住ipnat跟ipfilter不同,ipnat是先匹配规则(只要一匹配其它规则就跳过去)。另外rcmd和raudio代理也必须写在其它规则的前面。

5. 操作过滤规则,ipf

ipf用来加载ipfilter规则。规则文件可以放在系统的任何地方,但是一般都放在/etc/ipf.rules,/usr/local/etc/ipf.rules,/etc/opt/ipf/ipf.rules
IPfilter可以有两套规则,活动规则和不活动规则。默认情况下所有的操作都是基于活动规则。你可以用ipf -I来使用不活动规则。这两套规则可以用参数-s进行转换。这是非常有用的,你在测试新规则的时候就不用清除老规则。
ipf加参数-r可以删除列表中的规则,但是比较安全的方法是用参数-F清除规则,然后再加载修改后的规则。
加载规则最简单的方法是ipf -Fa -f /etc/ipf.rules.想获得其它操作规则的方法请参考ipf的man page.

6.加载NAT规则,ipnat

ipnat用来加载NAT规则。规则文件可以放在系统的任何地方,但是一般都放在 /etc/ipnat.rules/usr/local/etc/ipnat.rules,/etc/opt/ipf/ipnat.rules用 ipnat加载,也可以用参数-r删除规则。但一般也是清空(参数-C)然后加载,对于活动的映射-C无效,可以用-F来清除。
NAT规则和活动的映射可以用ipnat -l查看。最简单的家在NAT规则的方法是ipnat -CF -f /etc/ipnat.rules.

7. 监视和调试

你也许很想知道防火墙到底在干什么,而且如果ipfilter没有状态监视工具的话,它就不是一个完整的防火墙。

7.1 ipfstat工具

ipfstat最简的用法是显示一个关于防火墙执行情况的数据表,比如有多少个包通过或则抛弃,它们是否被记录,以及由多少状态条等等。你将看到的是这样一些数据:

# ipfstat
input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0
output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0

input packets logged: blocked 99286 passed 0
output packets logged: blocked 0 passed 0
packets logged: input 0 output 0
log failures: input 3898 output 0
fragment state(in): kept 0 lost 0
fragment state(out): kept 0 lost 0
packet state(in): kept 169364 lost 0
packet state(out): kept 431395 lost 0
ICMP replies: 0 TCP RSTs sent: 0
Result cache hits(in): 1215208 (out): 1098963
IN Pullups succeeded: 2 failed: 0
OUT Pullups succeeded: 0 failed: 0
Fastroute successes: 0 failures: 0
TCP cksum fails(in): 0 (out): 0
Packet log flags set: (0)
none


ipfstat当然也能够显示你目前的规则列表。参数-i或者-o显示有哪些in规则或者out规则,加上参数-h能够显示更详细的信息,包括每条规则有多少个数据包命中。例如:
# ipfstat -ho
2451423 pass out on xl0 from any to any
354727 block out on ppp0 from any to any
430918 pass out quick on ppp0 proto tcp/udp from 20.20.20.0/24 to any keep state keep frags

从这里我们可以看出哪些地方可能不正常,ipfstat不能告诉你哪些规则正确或者错误,它只是告诉你由于你的规则而发生了什么事情。为了进一步调试规则,可以使用参数-n,这个参数显示规则的顺序
# ipfstat -on
@1 pass out on xl0 from any to any
@2 block out on ppp0 from any to any
@3 pass out quick on ppp0 proto tcp/udp from 20.20.20.0/24 to any keep state keep frags

ipfstat的最后一个用处是显示一些关于状态记录的数据。这个参数是-s
# ipfstat -s
281458 TCP
319349 UDP
0 ICMP
19780145 hits
5723648 misses
0 maximum
0 no memory
1 active
319349 expired
281419 closed
100.100.100.1 -> 20.20.20.1 ttl 864000 pass 20490 pr 6 state 4/4
pkts 196 bytes 17394 987 -> 22 585538471:2213225493 16592:16500
pass in log quick keep state
pkt_flags & b = 2, pkt_options & ffffffff = 0
pkt_security & ffff = 0, pkt_auth & ffff = 0


从这我们可以看到有一条tcp连接状态。不同的版本输出的内容会略有不同,但是基本的信息是一样的。这条连接的状态是4/4,而其它的状态是不完整的,我们将在后面详细介绍。4/4状态的超时时间是240小时,相当长的一段时间,但它默认是已建立的tcp连接的超时时间。当这条状态空闲时TTL的值每秒减 1,最终超时并被删除。当一个连接状态重新启用时,它的TTL值又恢复到864000,必须确保一个活动的连接不会超时。我们还可以看到有196个17K 的数据包通过。还有两端的端口号,这个例子是987和22。这意味着这条状态表示一个从100.100.100.1端口987到20.20.20.1端口 22的连接。第二行最大的数字是TCP顺序号,保证没有人能够轻易的在这个连接中注入伪装的数据包。TCP的窗口也显示出来

[1] [2] [3]

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •