热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iptables防火墙指南

防火墙概念从逻辑上将,防火墙大体可以分为主机防火墙和网络防火墙。主机防火墙:针对于单个主机进行防护网络防火墙:往往处于网络入口或边缘&#x

防火墙概念

  1. 从逻辑上将,防火墙大体可以分为主机防火墙和网络防火墙。
    主机防火墙:针对于单个主机进行防护
    网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网

  2. 从物理上讲,防火墙可以分为硬件防火墙和软件防火墙
    硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高
    软件防火墙:应用软件处理逻辑运行与通用硬件平台上的防火墙,性能低,成本低

iptables

iptables并不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,而这个框架的名字叫做netfilter。
netfilter才是防火墙真正的安全框架,它位于内核空间。
然而,iptables只是一个命令行工具,位于用户空间,我们借助这个工具操作真正的框架。

iptables基础

我们知道iptables是按照规则来办事的,而规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

防火墙存在着“四表五链”,下面我们来谈谈表和链的概念

  1. 当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听的套接字(IP:port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标重点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点。所以,如果我们想要防火墙能够达到“防火”的目的,则需要在内核中设置关卡,所有进出的报文都要通过这个关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止。于是,就出现了INPUT关卡和OUTPUT关卡,而这些关卡在iptables中被称之为“链”。
  2. 另一种情况,客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文给其他服务器,所以这个时候,我们就会提到iptables中的其他“关卡”,也就是其他“链”,他们就是“路由前”、“转发”、“路由后”,他们的英文名称为:PREROUTING、FORWARD、POSTROUTING。
    总结:当我们启用了防火墙功能时,报文需要经过关卡,也就是说,根据实际情况的不同,报文经过“链”可能不同。如果报文需要转发,那么报文则不会经过INPUT链发往用户空间,而是直接在内核空间经过FORWARD链和POSTROUTING链转发出去。

由此我们可以总结出报文的流向

  1. 到本机某进程的报文:PREROUTING --> INPUT
  2. 由本级转发的报文:PREROUTING --> FORWARD --> POSTROUTING
  3. 有本机的某进程发出的报文(通常为响应报文):OUTPUT --> POSTROUTING

当我们对每个“链”上都放置了一串规则,但是这些规则是有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们就需要把实现相同功能的规则放在一起。
我们把具有相同功能的规则的集合叫做“表”。所以说,不同功能的规则,我们可以放置在不同的表中进行管理。而iptables已经为我们定义了4中表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4中功能的范围,也就是说,所有的规则都存在于这4张“表”中。
iptables为我们提供的表的分类,如下:

  1. filter表:负责过滤功能,烦恼歌×××;内核模块;iptables_filter
  2. nat表:网络地址转换功能;内核模块;iptables_nat
  3. mangle表:拆解报文,做出修改,并重新封装的功能;iptables_mangle
  4. raw表:关闭nat表上启用的连接追踪机制;iptables_raw

表链关系

链的规则存放于哪些表中(从链到表的对应关系)

PREROUTING 的规则可以存在于:raw表、mangle表、nat表。
INPUT 的规则可以存在于:mangle表、filter表 (centos7中还有nat表,centos6中没有)。
FORWARD 的规则可以存在于:mangle表、filter表。
OUTPUT 的规则可以存在于:raw表、mangle表、nat表、filter表。
POSTROUTING 的规则可以存在于:mangle表、nat表。

表中的规则可以被哪些链使用(从表到链的对应关系)

raw 表中的规则可以被哪些链使用:PREROUTING、OUTPUT
mangle 表中的规则可以被哪些链使用:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat 表中的规则可以被哪些链使用:PREROUTING、OUTPUT、POSTROUTING(centos7中还有INPUT,centos6中没有)
filter 表中的规则可以被哪些链使用:INPUT、FORWARD、OUTPUT

注意:当数据包经过一个“链”的时候,会将当前链的所有规则都匹配一遍,但是匹配时要按照顺序,一条一条的去匹配。

处理动作

  ACCEPT:允许数据包通过
  DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求石沉大海了,过了超时时间才会有反应。
  REJECT:拒绝数据包通过,必要时会给数据发送端一个相应的信息,客户端刚请求就会收到拒绝的信息。
  SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
  MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上。
  DNAT:目标地址转换。
  REDIRECT:在本机做端口映射。
  LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条数据,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

iptables命令参数

-n:以数字格式显示地址和端口号
-v:显示详细信息
-vv:更详细
-L:查看规则

[root@CentOS7-2 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 14412 packets, 1265K bytes)pkts bytes target prot opt in out source destinationChain FORWARD (policy ACCEPT 22 packets, 1848 bytes)pkts bytes target prot opt in out source destinationChain OUTPUT (policy ACCEPT 1154 packets, 139K bytes)pkts bytes target prot opt in out source destination

-t:指定表

[root@CentOS7-2 ~]#iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 154 packets, 21417 bytes)pkts bytes target prot opt in out source destinationChain INPUT (policy ACCEPT 139 packets, 20247 bytes)pkts bytes target prot opt in out source destinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destinationChain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination

-A:添加规则
  -p:指定协议、--dport:指定目标端口、--sport:指定源端口

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.104 -p icmp -j REJECT
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.1 -j ACCEPT

--line-numbers:查看规则序列号

[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable120 8148 ACCEPT all -- * * 192.168.36.1
....

-R:替换指定链上的指定规则编号

[root@CentOS7-2 ~]#iptables -R INPUT 1 -s 192.168.36.100 -p icmp -j REJECT
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 56 packets, 5013 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable
....

-Z:置零,将计数器清零

[root@CentOS7-2 ~]#iptables -Z INPUT
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 9 packets, 662 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable
....

-S:以命令格式显示

[root@CentOS7-2 ~]#iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N TEST
-A INPUT -s 192.168.36.100/32 -p icmp -j REJECT --reject-with icmp-port-unreachable

-I:插入,要指明插入至的规则编号

[root@CentOS7-2 ~]#iptables -I INPUT 3 -j REJECT

-D:删除规则,要指明规则编号

规则删除,后面的规则编号自动进行排序
[root@CentOS7-2 ~]#iptables -D INPUT 1
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 193 13252 ACCEPT all -- * * 192.168.36.1 0.0.0.0/0
2 679 62517 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable

-N:new, 自定义一条新的规则链

[root@CentOS7-2 ~]#iptables -N TEST
[root@CentOS7-2 ~]#iptables -vnL
...
Chain TEST (0 references)pkts bytes target prot opt in out source destination

-X:delete,删除自定义的空的规则链

[root@CentOS7-2 ~]#iptables -X TEST-M

-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受、DROP:丢弃

[root@CentOS7-2 ~]#iptables -P INPUT DROP
[root@CentOS7-2 ~]#iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes)

-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除

[root@CentOS7-2 ~]#iptables -E TEST TEST-M
[root@CentOS7-2 ~]#iptables -vnL
....
Chain TEST-M (0 references)pkts bytes target prot opt in out source destination

-F:清空指定的规则链,不指定链则清空当前表

[root@CentOS7-2 ~]#iptables -F -t filter

iptables的显示扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块

multiport扩展

以离散方式定义多端口匹配,最多指定15个端口

  1. --source-ports,--sports port[,port|,port:port]... 指定多个源端口
  2. --destination-ports,--dports port[,port|,port:port]... 指定多个目标端口
  3. --ports port[,port|,port:port]... 多个源或目标端口

例题:拒绝192.1688.36.100主机访问192.168.36.104(本机)的20,21,22,80端口

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -d 192.168.36.104 -p tcp -m multiport --dport 20:22,80 -j REJECT

iprange扩展

指明连续的(但一般不是整个网络)ip地址范围

  1. --src-range from[-to] 源IP地址范围
  2. --dst-range from[-to] 目标IP地址范围

例题:禁止192.168.36.90-192.168.36.101主机访问192.168.36.104主机的80端口

[root@CentOS7-2 ~]#iptables -A INPUT -d 192.168.36.104 -p tcp --dport 80 -m iprange --src-range 192.168.36.90-192.168.36.101 -j REJECT

mac扩展

指明源MAC地址
适用于:PREROUTING, FORWARD,INPUT链

  1. --mac-source XX:XX:XX:XX:XX:XX

例题:指明源MAC地址,可以通过icmp协议访问本机

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -p icmp -m mac --mac-source 00:0C:29:5A:43:B7 -j ACCEPT
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -j REJECT

string扩展

对报文中的应用层数据做字符串模式匹配检测

  1. --algo {bm|kmp} 字符串匹配检测算法
    bm:Boyer-Moore
    kmp:Knuth-Pratt-Morris
  2. --from offset 开始偏移
  3. --to offset 结束偏移
  4. --string pattern 要检测的字符串模式
  5. --hex-string pattern要检测字符串模式,16进制格式

例题1:对访问的地址进行限制

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -p tcp --dport 80 -m string --algo bm --string "mage" -j REJECT

例题2:对web站点页面中任何包含magedu的字符串的页面进行规则限制

请求报文中不会包含mage,一半来讲只包含访问某个页面,那么请求内容无非包含了请求某个链接而已。
响应报文中会封装页面的内容信息,因此网页内容会出现在响应报文中,而不是请求报文。
所以,对web页面内容进行规则限制需要在OUTPUT链进行规则设定[root@CentOS7-2 ~]#iptables -A OUTPUT -d 192.168.36.100 -p tcp --sport 80 -m string --algo bm --string "magedu" -j REJECT

例题3:拒绝含有“OOXX”字样的报文进入主机

[root@CentOS7-2 ~]#iptables -A INPUT -m string --algo bm --string "OOXX" -j REJECT

time扩展

根据将报文到达的时间与指定的时间范围进行匹配

  1. --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
  2. --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
  3. --timestart hh:mm[:ss] 时间
  4. --timestop hh:mm[:ss]
    4.1 [!] --monthdays day[,day...] 每个月的几号
    4.2 [!] --weekdays day[,day...] 星期几,1 – 7 分别表示星期一到星期日
    4.3 [!] --kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
    注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)

例题1:禁止192.168.36.0/24网段主机在08:00~18:00时间段内访问主机80端口

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.0/24 -d 192.168.36.104 -p tcp --dport 80 -m time --timestart 08:00 --timestop 18:00 --kerneltz -j DROP

例题2:周六日不能访问80端口

[root@CentOS7-2 ~]#iptables -A OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j DROP

connlimit扩展模块

使用connlimit扩展模块,可以限制每个IP地址同时链接到server端的连接数量,注意:不需要指定IP,此模块默认就是针对“每个客户端IP”,即对单IP的并发连接数限制。

  1. --connlimit-upto #:连接的数量小于等于#时匹配
  2. --connlimit-above #:连接的数量大于#时匹配
  3. --connlimit-mask #:某网段范围内的IP匹配

例题1:每个IP地址最多只能占用两个ssh链接远程到本机

[root@CentOS7-2 ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j
REJECT

例题2:24网段的IP地址限制server端ssh最多连接10个

[root@CentOS7-2 ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j REJECT

limit扩展模块

限制单位时间内流入的包的数量,基于收发报文的速率做匹配

  1. --limit #[/second|/minute|/hour|/day]
  2. --limit-burst number :指出“空闲时可放行的包的数量”,默认值为5

例题:每分钟生成放行10个icmp包

[root@CentOS7-2 ~]#iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
[root@CentOS7-2 ~]#iptables -t filter -A INPUT -p icmp -j REJECT

state扩展

conntrack机制:追踪本机上的请求和响应之间的关系
状态有如下几种:

  1. NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
  2. ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
  3. RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
  4. INVALID:无效的连接,如flag标记不正确
  5. UNTRACKED:未进行追踪的连接,如raw表中关闭追踪

例题1:让已经建立的连接允许通过

[root@node2 ~]# iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT

例题2:开启连接追踪放行响应的报文

[root@node2 ~]# iptables -I CLASS -m state --state ESTABLISHED,RELATED -j ACCEPT

网络防火墙实现

方法一:通过请求(--icmp-type=8)与响应包(--icmp-type=0)进行iptables策略的配置

[root@LVS ~]#iptables -I FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT
[root@LVS ~]#iptables -I FORWARD -d 192.168.36.0/24 -p icmp --icmp-type 0 -j ACCEPT

方法二:通过报文状态跟踪进行判断

[root@LVS ~]#iptables -I FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT
[root@LVS ~]#iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@LVS ~]#iptables -vnL
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED91 7644 ACCEPT icmp -- * * 192.168.36.0/24 0.0.0.0/0 icmptype 816 1344 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable

SNAT

SNAT解决局域网访问互联网,本地网络中的主机通过某一特定的地址访问外部网络,实现地址伪装。请求报文:修改源IP---POSTROUTING

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE

DNAT

DNAT解决内网私有地址可以被互联网访问, 指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B。请求报文:修改目的IP---PREROUTING

iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22

转:https://blog.51cto.com/12980155/2399305



推荐阅读
  • 本文详细解析了Java中流的概念,特别是OutputStream和InputStream的区别,并通过实际案例介绍了如何实现Java对象的序列化。文章不仅解释了流的基本概念,还探讨了序列化的重要性和具体实现步骤。 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • 本文介绍了如何使用C# Winform开发局域网内的文件传输功能,详细描述了从用户界面到后端网络通信的具体实现。 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • 利用Cookie实现用户登录状态的持久化
    本文探讨了如何使用Cookie技术在Web应用中实现用户登录状态的持久化,包括Cookie的基本概念、优势及主要操作方法,并通过一个简单的Java Web项目示例展示了具体实现过程。 ... [详细]
  • 本文详细介绍了跨站脚本攻击(XSS)的基本概念、工作原理,并通过实际案例演示如何构建XSS漏洞的测试环境,以及探讨了XSS攻击的不同形式和防御策略。 ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • Spring框架下发送嵌入图片邮件时遇到的技术挑战与解决方案
    在Spring框架中发送嵌入图片的HTML格式邮件时,常遇到技术挑战。一种有效的解决方案是在邮件内容中直接使用``标签来引用图片。此外,还可以通过MimeMessageHelper类的addInline方法将图片作为内联资源添加到邮件中,确保图片能够正确显示。这种方法不仅提高了邮件的可读性,还增强了用户体验。 ... [详细]
  • Struts2框架构建指南
    本文详细介绍了如何使用Struts2(版本2.3.16.3)构建Web应用,包括必要的依赖库添加、配置文件设置以及简单的示例代码。Struts2是Apache软件基金会下的一个开源框架,用于简化Java Web应用程序的开发。 ... [详细]
  • 深入解析轻量级数据库 SQL Server Express LocalDB
    本文详细介绍了 SQL Server Express LocalDB,这是一种轻量级的本地 T-SQL 数据库解决方案,特别适合开发环境使用。文章还探讨了 LocalDB 与其他轻量级数据库的对比,并提供了安装和连接 LocalDB 的步骤。 ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
  • 深入解析Nacos服务自动注册机制
    本文将探讨Nacos服务自动注册的具体实现方法,特别是如何通过Spring事件机制完成服务注册。通过对Nacos源码的详细分析,帮助读者理解其背后的原理。 ... [详细]
author-avatar
Emily嘿嘿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有