热门标签 | 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



推荐阅读
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
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社区 版权所有