iptables详解(10):iptables自定义链

  • A+
所属分类:iptables  linux基础

在本博客中,从理论到实践,系统的介绍了iptables,如果你想要从头开始了解iptables,可以查看iptables文章列表,直达链接如下

iptables零基础快速入门系列

 

前文中,我们一直在定义规则,准确的说,我们一直在iptables的默认链中定义规则,那么此处,我们就来了解一下自定义链

 

你可能会问,iptables的默认链就已经能够满足我们了,为什么还需要自定义链呢?

原因如下:

当默认链中的规则非常多时,不方便我们管理。

想象一下,如果INPUT链中存放了200条规则,这200条规则有针对httpd服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,假如,我们突然想要修改针对httpd服务的相关规则,难道我们还要从头看一遍这200条规则,找出哪些规则是针对httpd的吗?这显然不合理。

 

所以,iptables中,可以自定义链,通过自定义链即可解决上述问题。

假设,我们自定义一条链,链名叫IN_WEB,我们可以将所有针对80端口的入站规则都写入到这条自定义链中,当以后想要修改针对web服务的入站规则时,就直接修改IN_WEB链中的规则就好了,即使默认链中有再多的规则,我们也不会害怕了,因为我们知道,所有针对80端口的入站规则都存放在IN_WEB链中,同理,我们可以将针对sshd的出站规则放入到OUT_SSH自定义链中,将针对Nginx的入站规则放入到IN_NGINX自定义链中,这样,我们就能想改哪里改哪里,再也不同担心找不到规则在哪里了。

 

但是需要注意的是,自定义链并不能直接使用,而是需要被默认链引用才能够使用,空口白话说不明白,等到示例时我们自然会明白。

 

说了这么多,我们来动手创建一条自定义链,使用-N选项可以创建自定义链,示例如下

iptables详解(10):iptables自定义链

如上图所示,"-t filter"表示操作的表为filter表,与之前的示例相同,省略-t选项时,缺省操作的就是filter表。

"-N IN_WEB"表示创建一个自定义链,自定义链的名称为"IN_WEB"

自定义链创建完成后,查看filter表中的链,如上图所示,自定义链已经被创建,而且可以看到,这条自定义链的引用计数为0 (0 references),也就是说,这条自定义链还没有被任何默认链所引用,所以,即使IN_WEB中配置了规则,也不会生效,我们现在不用在意它,继续聊我们的自定义链。

 

好了,自定义链已经创建完毕,现在我们就可以直接在自定义链中配置规则了,如下图所示,我们配置一些规则用于举例。

iptables详解(10):iptables自定义链

如上图所示,对自定义链的操作与对默认链的操作并没有什么不同,一切按照操作默认链的方法操作自定义链即可。

 

现在,自定义链中已经有了一些规则,但是目前,这些规则无法匹配到任何报文,因为我们并没有在任何默认链中引用它。

既然IN_WEB链是为了针对web服务的入站规则而创建的,那么这些规则应该去匹配入站的报文,所以,我们应该用INPUT链去引用它。

当然,自定义链在哪里创建,应该被哪条默认链引用,取决于实际的工作场景,因为此处示例的规则是匹配入站报文,所以在INPUT链中引用自定义链。

示例如下。

iptables详解(10):iptables自定义链

上图中,我们在INPUT链中添加了一条规则,访问本机80端口的tcp报文将会被这条规则匹配到

而上述规则中的"-j IN_WEB"表示:访问80端口的tcp报文将由自定义链"IN_WEB"中的规则进行处理,没错,在之前的示例中,我们使用"-j"选项指定动作,而此处,我们将"动作"替换为了"自定义链",当"-j"对应的值为一个自定义链时,就表示被当前规则匹配到的报文将交由对应的自定义链处理,具体怎样处理,取决于自定义链中的规则,当IN_WEB自定义链被INPUT链引用以后,可以发现,IN_WEB链的引用计数已经变为1,表示这条自定义链已经被引用了1次,自定义链还可以引用其他的自定义链,感兴趣的话,动手试试吧。

 

在之前的文章中,我们说过,"动作"在iptables中被称为"target",这样描述并不准确,因为target为目标之意,报文被规则匹配到以后,target能是一个"动作",target也能是一个"自定义链",当target为一个动作时,表示报文按照指定的动作处理,当target为自定义链时,表示报文由自定义链中的规则处理,现在回过头再理解之前的术语,似乎更加明了了。

 

那么此刻,我们在192.168.1.139上尝试访问本机的80端口,已经被拒绝访问,证明刚才自定义链中的规则已经生效了。

iptables详解(10):iptables自定义链

 

过了一段时间,我们发现IN_WEB这个名字不太合适,我们想要将这条自定义链重命名,把名字改成WEB,可以吗?必须能啊,示例如下

iptables详解(10):iptables自定义链

如上图所示,使用"-E"选项可以修改自定义链名,如上图所示,引用自定义链处的名称会自动发生改变。

 

好了,我们已经能够创建自定义了,那么怎样删除自定义链呢?

使用"-X"选项可以删除自定义链,但是删除自定义链时,需要满足两个条件:

1、自定义链没有被任何默认链引用,即自定义链的引用计数为0。

2、自定义链中没有任何规则,即自定义链为空。

 

那么,我们来删除自定义链WEB试试。

iptables详解(10):iptables自定义链

如上图所示,使用"-X"选项删除对应的自定义链,但是上例中,并没有成功删除自定义链WEB,提示:Too many links,是因为WEB链已经被默认链所引用,不满足上述条件1,所以,我们需要删除对应的引用规则,示例如下。

iptables详解(10):iptables自定义链

如上图所示,删除引用自定义链的规则后,再次尝试删除自定义链,提示:Directory not empty,是因为WEB链中存在规则,不满足上述条件2,所以,我们需要清空对应的自定义链,示例如下

iptables详解(10):iptables自定义链

如上图所示,使用"-X"选项可以删除一个引用计数为0的、空的自定义链。

   

小结

为了方便以后回顾,我们将上述命令进行总结。

 

创建自定义链

 

引用自定义链

 

重命名自定义链

 

删除自定义链

删除自定义链需要满足两个条件

1、自定义链没有被引用

2、自定义链中没有任何规则

 

好了,自定义链就总结到这里,希望这篇文章能够对你有所帮助~~~各位客官,再见啦,么么哒~~~~

 

weinxin
我的微信公众号
关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~
朱双印

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:27   其中:访客  17   博主  10

    • avatar s 3

      在INPUT上创建 自定义链A、自定义链B
      自定义链A跳转自定义链B,这时候自定义链B又使用了-j return
      这种情况下,数据包是怎么走向的。

        • avatar s 3

          @s 自问自答:
          经过实验。数据包走向是这样的:
          自定义链A->自定义链B->-j retrun->自定义链A->INPUT->向下匹配规则

        • avatar cayxxx 0

          如果自定义链为空会怎么处理?

            • avatar s 3

              @cayxxx 同问 跳转到空链条是怎么处理的

                • avatar s 3

                  @s 实测是空链通的,但是不清楚内部是怎么处理的

                  [root@root]# iptables -nL INPUT
                  Chain INPUT (policy ACCEPT)
                  target prot opt source destination
                  test all — 0.0.0.0/0 8.8.8.8
                  [root@root]# iptables -nL test
                  Chain test (1 references)
                  target prot opt source destination
                  [root@root]# ping 8.8.8.8
                  PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
                  64 bytes from 8.8.8.8: icmp_seq=1 ttl=39 time=80.52

                    • avatar s 3

                      @s 很尴尬 上面的命令打错了,应该是OUTPUT 不是 INPUT.
                      我也不贴命令了。经过一晚的测试。知道了答案:
                      调用空链,会自动返回到调用链。
                      本身自定义链结束就是返回到调用链,然后继续向下匹配调用链的规则

                • avatar anan 1

                  楼主写的很不错,受益很多。
                  请教一个问题:PREROUTING链的nat表有如下规则
                  -A PREROUTING -m addrtype –dst-type LOCAL -j DOCKER
                  会跳转到DOCKER链处理,那么这个DOCKER链是不是只会匹配其中的nat表的规则?DOCKER链中的其他表的规则是否有效?
                  谢谢解答

                    • avatar 朱双印 Admin

                      @anan 如果你在哪个表中创建的自定义链,就在哪个表中引用即可,其实你在创建自定义链的时候就已经指明表了呀,对吧~客官常来呦~

                        • avatar anan 1

                          @朱双印 如有我在filter和nat表中都创建了DOCKER链,那么nat表中的规则交给DOCKER链处理时,这个链中的nat表和filter表的规则都会去匹配吗?
                          比如下面这种
                          root@LFG1000826664:~# iptables -w -S -t nat | grep DOCKER
                          -N DOCKER
                          -A DOCKER -i docker0 -j RETURN
                          root@LFG1000826664:~#
                          root@LFG1000826664:~# iptables -w -S -t filter | grep DOCKER
                          -N DOCKER
                          -A DOCKER -o docker0 -j ACCEPT

                          • avatar anan 1

                            @朱双印 说法有误,应该是在filter和nat表上都创建了DOCKER链

                              • avatar 朱双印 Admin

                                @anan 你在两张表里创建同名的链不代表是一条链吧,应该是两条链,所以我们在创建自定义链的时候才会指定在那张表中创建链,引用的时候还会指定通过哪条默认链应用,即使同名也是两条自定义链吧,你说的好像是同名了就是一条自定义链了?应该不是的。

                          • avatar 某人 1

                            看下来,其实可以理解为规则的分组,对吧?

                              • avatar 朱双印 Admin

                                @某人 回复晚了,不好意思~
                                是的,可以这样理解,没毛病,分组后方便管理。

                              • avatar echo 5

                                新知识 !不错

                                  • avatar 朱双印 Admin

                                    @echo 后面还有 :mrgreen: ,加油,兄弟~

                                  • avatar 问天 3

                                    用自定义链的时候 ,自定义连的匹配条件和 引用自定义连的匹配条件需要同时执行才可以么?

                                      • avatar 朱双印 Admin

                                        @问天 往往默认链中的规则匹配的范围更大一些,匹配到以后,交由自定义链处理,这时候经过过滤的报文再跟自定义链中的规则去匹配。

                                      • avatar 1512019294 0

                                        每篇都写的很精彩。 感谢分享。我最近遇到一个问题,请教楼主。
                                        现在要做一个数据转发操作,有2台服务器在2个不同的城市,公网ip为: ipA,ipB
                                        当访问A主机的6666端口时,需要将请求直接转发到B主机的6666端口上。配置如下,但测试发现没有什么作用。
                                        iptables中只配置了nat表,其他的都没配置。下面的写法错在什么地方?
                                        我是第一次接触这个,幼稚之处请多包涵。
                                        iptables -F后,执行如下命令
                                        iptables -t nat -A PREROUTING –dst ipA -p tcp –dport 6666 -j DNAT –to-destination ipB:6666
                                        iptables -t nat -A POSTROUTING –dst ipB -p tcp –dport 6666 -j SNAT –to-source ipA:6666
                                        iptables -t nat -A PREROUTING –dst ipA -p udp –dport 6666 -j DNAT –to-destination ipB:6666
                                        iptables -t nat -A POSTROUTING –dst ipB -p udp –dport 6666 -j SNAT –to-source ipA:6666

                                          • avatar 朱双印 Admin

                                            @1512019294 两个都是公网IP?那么A进行地址转换以后,B会直接响应客户端吗?
                                            这个没试过,如果B是私网的,你不应该在SNAT中也使用-dst吧,应该是回应的报文做SNAT
                                            即使B是公网的,如果响应报文还会经过A,那么SNAT中也不应该是-dst
                                            SNAT时source IP 应该是IPB吧,贴出的设置都是-dst,应该是类似如下的配置,仅供参考
                                            echo 1 > /proc/sys/net/ipv4/ip_forward
                                            iptables -t nat -I PREROUTING -d IPA -p tcp –dport 6666 -j DNAT –to-destination IPB:6666
                                            iptables -t nat -I POSTROUTING -s IPB -j SNAT –to-source IPA
                                            共同进步,如果客官配置好了,可以将配置分享出来,供大家参考学习。
                                            后面会有总结NAT的文章,欢迎评阅

                                              • avatar 风之翼 1

                                                @朱双印 感谢楼主的解答。我下来又做了测试,但iptables还是没有转发成功,最后用ngnix解决的数据转发问题。详细内容如下:
                                                请帮忙看一下我的疑问部分。谢谢。
                                                这里的应用场景是,主机A连主机B很快,本地主机L连接B很慢,连A很快,所以需要数据走LAB的通道.
                                                其中, A,B是ucloud的云主机。在不同的城市。下面的ip都是公网ip
                                                目前的进展和疑问:
                                                进展:iptables实现数据包转发,最后发现不行
                                                使用nginx做数据包转发,测试通过
                                                详细的测试过程在下面。
                                                疑问:
                                                1. 在使用iptables做数据转发的时候,iptables所在的主机需要监听6666端口吗?应该是在iptables这边分析完后直接就直接转到目的主机了吧。不知道是不是这样。目前的测试,IPA主机上没有监听6666端口,iptables也并不会去监听6666

                                                2. iptables的 FORWARD链是否只能是局域网间转发数据?有这种限制吗?目前测试的结果是在发消息的过程中FORWARD没有收到数据。感觉这个也不应该,不管最后是drop还是accept,应该收到数据才对。
                                                3. 有没有使用ucloud云主机的朋友,这个ucloud是不是在控制台上有什么限制,一个最头痛的限制是,即使管理员将ucloud控制台上的所有主机端口全部开放。我这边能被其他主机访问到的端口很有限,6000-6009这9个端口可用,如果使用6010这个端口,是不能被外界访问的。7000-7999的好像都不行,2000,8000可以。并且可用的端口显示的都是有服务名的。看起来是服务的预留端口。用户不能随便启用端口吗?
                                                使用nmap –v ipA的结果如下.
                                                Not shown: 995 closed ports
                                                PORT STATE SERVICE
                                                21/tcp open ftp
                                                22/tcp open ssh
                                                445/tcp filtered microsoft-ds
                                                4444/tcp filtered krb524
                                                6666/tcp open irc

                                                2000/tcp open cisco-sccp

                                                8008/tcp open http

                                                iptable不能转发数据成功,我有些怀疑和ucloud控制台的防火墙限制有关系。但权限不够,没法去ucloud控制台查看。谁对ucloud服务器的限制比较熟悉,能否告知一二,谢谢。
                                                iptables实现数据包转发,最后发现不行
                                                尝试了下面的方法还是不行,不知道是不是ucloud的防火墙有什么限制?
                                                配置
                                                vi /etc/sysctl.conf 添加
                                                net.ipv4.ip_forward = 1
                                                执行sysctl –p
                                                上面执行后,会修改这个文件。
                                                直接修改下面的文件也是一样的。
                                                [root@10-13-1-10 conf]# cat /proc/sys/net/ipv4/ip_forward
                                                1

                                                启动服务
                                                systemctl start iptables

                                                清理,添加规则规则
                                                [root@10-13-1-10 conf]# iptables -t nat -F
                                                [root@10-13-1-10 conf]# iptables -F
                                                [root@10-13-1-10 conf]# iptables -t nat -I PREROUTING -d IPA -p tcp –dport 6666 -j DNAT –to-destination IPB:6666
                                                [root@10-13-1-10 conf]# iptables -t nat -I PREROUTING -d IPA -p udp –dport 6666 -j DNAT –to-destination IPB:6666
                                                [root@10-13-1-10 conf]# iptables -t nat -I POSTROUTING -s IPB -j SNAT –to-source IPA
                                                查看,规则已经加上
                                                [root@10-13-1-10 conf]# iptables -nvL
                                                Chain INPUT (policy ACCEPT 254 packets, 22929 bytes)
                                                pkts bytes target prot opt in out source destination

                                                Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) //注意这个,始终为0
                                                pkts bytes target prot opt in out source destination

                                                Chain OUTPUT (policy ACCEPT 145 packets, 17323 bytes)
                                                pkts bytes target prot opt in out source destination
                                                [root@10-13-1-10 conf]# iptables -nvL -t nat
                                                Chain PREROUTING (policy ACCEPT 6 packets, 349 bytes)
                                                pkts bytes target prot opt in out source destination
                                                0 0 DNAT udp — * * 0.0.0.0/0 IPA udp dpt:6666 to:IPB:6666
                                                0 0 DNAT tcp — * * 0.0.0.0/0 IPA tcp dpt:6666 to:IPB:6666

                                                Chain INPUT (policy ACCEPT 6 packets, 349 bytes)
                                                pkts bytes target prot opt in out source destination

                                                Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
                                                pkts bytes target prot opt in out source destination

                                                Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
                                                pkts bytes target prot opt in out source destination
                                                0 0 SNAT all — * * IPB 0.0.0.0/0 to:IPA

                                                向IPA发消息,启动tcpdump查看数据流,发消息的方式很多。我这里使用windows下的ftp工具去连接
                                                ftp工具日志:
                                                [14:56:33] [R] 正在连接到 IPB 通过代理 -> IP=IPA PORT=6666
                                                [14:56:34] [R] 连接失败 (连接已拒绝)
                                                [14:56:34] [R] 尝试重新连接 #10 次后延迟 1 秒
                                                [14:56:44] [R] 正在尝试重新连接.
                                                [14:56:44] [R] 正在连接到 IPB 通过代理 -> IP=IPA PORT=6666 (次尝试 # 1)
                                                [14:56:45] [R] 连接失败 (连接已拒绝)
                                                [14:56:45] [R] 尝试重新连接 #120 次后延迟 2 秒

                                                IPA服务器日志,可以发现没有转发
                                                [root@10-13-1-10 ~]# tcpdump -nn port 6666
                                                tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
                                                listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
                                                13:49:56.178432 IP windows本地IP.25392 > ipA.6666: Flags [S], seq 609456627, win 65535, options [mss 1412,nop,wscale 7,nop,nop,sackOK], length 0
                                                13:49:56.178445 IP ipA.6666 > windows本地IP.25392: Flags [R.], seq 0, ack 609456628, win 0, length 0
                                                13:49:56.686525 IP windows本地IP.25392 > ipA.6666: Flags [S], seq 609456627, win 65535, options [mss 1412,nop,wscale 7,nop,nop,sackOK], length 0
                                                13:49:56.686608 IP ipA.6666 > windows本地IP.25392: Flags [R.], seq 0, ack 1, win 0, length 0
                                                13:49:57.195603 IP windows本地IP.25392 > ipA.6666: Flags [S], seq 609456627, win 65535, options [mss 1412,nop,nop,sackOK], length 0
                                                13:49:57.195625 IP ipA.6666 > windows本地IP.25392: Flags [R.], seq 0, ack 1, win 0, length 0
                                                13:50:07.204760 IP windows本地IP.25462 > ipA.6666: Flags [S], seq 1442462511, win 65535, options [mss 1412,nop,wscale 7,nop,nop,sackOK], length 0
                                                13:50:07.204944 IP ipA.6666 > windows本地IP.25462: Flags [R.], seq 0, ack 1442462512, win 0, length 0
                                                13:50:07.711286 IP windows本地IP.25462 > ipA.6666: Flags [S], seq 1442462511, win 65535, options [mss 1412,nop,wscale 7,nop,nop,sackOK], length 0
                                                13:50:07.711715 IP ipA.6666 > windows本地IP.25462: Flags [R.], seq 0, ack 1, win 0, length 0
                                                13:50:08.218482 IP windows本地IP.25462 > ipA.6666: Flags [S], seq 1442462511, win 65535, options [mss 1412,nop,nop,sackOK], length 0
                                                13:50:08.219029 IP ipA.6666 > windows本地IP.25462: Flags [R.], seq 0, ack 1, win 0, length 0

                                                iptable数据也可以看出,没有转发。数据基本没有出去.
                                                [root@10-13-1-10 conf]# iptables -nvL
                                                Chain INPUT (policy ACCEPT 710 packets, 59217 bytes) //有所增加
                                                pkts bytes target prot opt in out source destination

                                                Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)//始终为0
                                                pkts bytes target prot opt in out source destination

                                                Chain OUTPUT (policy ACCEPT 382 packets, 40779 bytes) //有所增加
                                                pkts bytes target prot opt in out source destination
                                                [root@10-13-1-10 conf]#
                                                [root@10-13-1-10 conf]# iptables -nvL -t nat
                                                Chain PREROUTING (policy ACCEPT 42 packets, 2371 bytes) //有所增加
                                                pkts bytes target prot opt in out source destination
                                                0 0 DNAT udp — * * 0.0.0.0/0 IPA udp dpt:6666 to:IPB:6666
                                                0 0 DNAT tcp — * * 0.0.0.0/0 IPA tcp dpt:6666 to:IPB:6666

                                                Chain INPUT (policy ACCEPT 42 packets, 2371 bytes) //有所增加
                                                pkts bytes target prot opt in out source destination

                                                Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) //始终为0,数据没有出去. 后来没做什么操作,但这个值有所增加。policy ACCEPT 3 packets, 223 bytes
                                                pkts bytes target prot opt in out source destination

                                                Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) //始终为0, 数据没有出去。后来没做什么操作,但这个值有所增加 policy ACCEPT 3 packets, 223 bytes
                                                pkts bytes target prot opt in out source destination
                                                0 0 SNAT all — * * IPB 0.0.0.0/0 to:IPA

                                                使用nginx做数据包转发,测试通过
                                                安装nginx
                                                wget http://nginx.org/download/nginx-1.13.0.tar.gz
                                                tar xvfz nginx-1.13.0.tar.gz
                                                cd nginx-1.13.0
                                                ./configure –prefix=/usr/local/nginx –with-stream
                                                make & make install

                                                编辑配置文件
                                                vi /usr/local/nginx/conf/nginx.conf添加
                                                stream{
                                                upstream destserver{
                                                server IPB:6666;
                                                }
                                                server{
                                                listen 6666 udp;
                                                listen 6666;
                                                proxy_pass destserver;
                                                }
                                                }

                                                验证配置文件是否有效
                                                /usr/local/nginx/sbin/nginx –t
                                                检查ok
                                                启动服务
                                                /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

                                                  • avatar 朱双印 Admin

                                                    @风之翼 看了客官的回复,你用nginx做反代,实现了你的需求~~ :oops: 能解决问题就是最棒的。
                                                    1、符合条件的报文就会按照动作处理,无所谓监听。
                                                    2、我理解的是可以转发的,不管是否是局域网,前提是Linux主机需要知道将报文转发给谁,对应的路由条目需要配置正确。
                                                    3、ucloud没有使用过,无法给出建议
                                                    之前用centos6.8配置核心转发功能,一直无法转发报文,我在最新的文章中也提到了这个状况,不知道和你遇到的情况是否一致
                                                    不过从回复中可以看出,客官是个动手能力很强的人啊~~常来捧场呦~~亲

                                                      • avatar 风之翼 1

                                                        @朱双印 大神带带我啊,以后还会有很多问题要请教的。

                                                          • avatar 朱双印 Admin

                                                            @风之翼 共同努力,共同进步~~~ :mrgreen:
                                                            求关注~~~打开微信,扫描文章下方的二维码,即可关注”实用运维笔记”微信公众号~~~
                                                            求关注~求推荐 :mrgreen:

                                                  • avatar 石头 1

                                                    楼主好人,请问还有nat raw等表的介绍吗?

                                                      • avatar 朱双印 Admin

                                                        @石头 总结SNAT、DNAT这些动作时会用nat表举例,目前正在写,会按照逻辑顺序发布,raw和mangle我不了解,这两个表暂时不会总结,
                                                        客官可以使用微信扫描文章下方的二维码,关注”实用运维笔记”微信公众号,当博客中有相关文章时,会第一时间得知,常来捧场哦~~客官

                                                          • avatar 石头 1

                                                            @朱双印 谢谢楼主!!!

                                                        • avatar 朱双印 Admin

                                                          :!: 突然发现文章中的格式乱了,无法阅读,已经修改回来,希望各位客官见谅 :oops: