2018年1月,大家仍像往常一样忙忙碌碌,IT设备机房内设备轰隆隆的风扇声嘈杂而响亮,一切看似那么正常。
可是,如果换个视角看看设备里面的数字世界,风景完全不同。数据包暗流涌动,争先恐后抢着到达世界的尽头。
俗话说,有人的地方就有江湖。而被人操控的网络世界,免不了杀机四伏。
看看上面这张图,这可不是我个人PS上去的×××图。它是实实在在的世界级的网络 攻 击 流量图。各式各样的***流量跨越国界影响着每一台互联网设备。
成都创新互联专注于网站建设|成都网站维护|优化|托管以及网络推广,积累了大量的网站设计与制作经验,为许多企业提供了网站定制设计服务,案例作品覆盖成都花箱等行业。能根据企业所处的行业与销售的产品,结合品牌形象的塑造,量身定制品质网站。
在个人电脑难逃网络 攻 击 魔爪的情况下,网络设备怎能独善其身??
根本不可能,网络设备也是 攻 击 者的目标之一,而且是重要目标,除非你把电源线拔了。
这就好比打蛇打七寸, 攻 击 者如果想制造大范围的互联网故障,拿下网络设备相比尝试攻克各个终端目标划算得多。
怎么避免被×××者者攻陷,做安全加固啊!有本事咱就给它套上一个金钟罩铁布衫,刀枪不入。
我相信很多朋友脑海里面首先浮现的是采用类似ACL访问控制列表的方法,只允许信任的管理员访问管理设备,限制特定的协议等。
这就够了么?
1.如何限制网络设备的带内带外安全?
2.如何只允许特定源地址连接设备协议,如BGP等?
3.是否关闭了不必要的网络服务?
4.是否正确配置了设备日志记录,记录设备登陆记录以及其他网络管理痕迹?
5.配置是否定期保存,以免意外故障发生?
或者,如果你是土财主,可以直接找第三方安全公司做安全扫描,并根据评估报告进行整顿。但是会花费一笔不小的费用。
其实,除了花钱,我们还可以选择自己动手解决问题,一方面节约了公司成本,也锻炼了个人技能。这么好的事情,何乐而不为呢?
故此,为了满足部分葛朗台土豪的需求,认真贯彻自己动手,丰衣足食的精神。本文特地总结了一套网络设备安全加固的思维方法,供大家参考。
既然要讨论网络设备加固,我们需要以一个特定的产品来作为展示对象, 因为本人长期使用Juniper设备,就以其产品为例给大家讲述。
同时,需要说明的是,以下内容并不仅是局限在Juniper设备,大家除了了解Juniper的加固方式以外,最重要的是理解这一套思维方法,并应用到你身边对应的厂商设备。
这一步尤其重要,但是又极其容易被忽略。
苍蝇不叮无缝蛋,网络 攻 击 亦然。如果 攻 击 者只是盯着大家都会去关注的网络安全,例如尝试碰运气telnet登录设备等。那这个***者水平就值得怀疑了。
所以真正的 攻 击 者,是 攻 击 那些他知道而你不知道的系统Bug漏洞。很显然,实时掌握系统bug漏洞非常有必要,就拿我自己来说。我隔一小段时间就要去看看当前Juniper设备运行的JUNOS软件是否爆出重大bug,然后提出修补建议。(领导会觉得你很高瞻远瞩,涨工资哦!)
如何查看JUNOS系统漏洞
方法一:查看Juniper网站bug库: https://kb.juniper.net/InfoCenter/index?page=content&channel=SECURITY_ADVISORIES
方法二:查阅Juniper网站Problem Search 软件bug库:https://prsearch.juniper.net
通过定期查阅你所使用的JUNOS系统Bug信息并根据Juniper建议采取相关措施,从而大大避免因为系统bug从而导致网络瘫痪的问题。
这一步非常好理解,一般情况网络设备厂商会建议你使用某个版本的OS系统。它是根据厂商统计以及客户反馈汇总后,厂商认为此版本系统相对较稳定,bug相对较少。
Juniper厂商建议OS系统汇总
https://kb.juniper.net/InfoCenter/index?page=content&id=KB21476&actp=METADATA
什么是物理设备安全,物理设备安全包含但不仅限于如下:
网络设备一般都安装于机房特定机架上。但是如果机房安全环境较差,随时可以有人员进入机房挪动已经在网的网络设备,或者实施断电,插拔线缆等操作。那其他的一切安全问题都是浮云。
正如恋爱中的女孩总是给男孩说:“如果连基本的安全感你都给不了我,还谈个屁的爱情啊!”
所以,工程师们,给你们的网络设备买套好点的“房子”,给他们点安全感吧。例如我之前OOB文章《构建带外OOB网络》中提到的,采用机架门锁+感应器的方式保障设备安全。
Console接口作为设备的管理接口。论重要性,没有任何其他带内带外管理方式能够与之相提并论。
日常运维中,总免不了需要去现场通过console调试设备。当工程师用console登陆设备以后,往往忘了logout登出系统。而是直接拔出console线。其危害是,其他人员可以随后插线通过console登陆设备无需任何验证,直接使用前一位用户的权限通过console对网络设备执行各种操作。
换而言之,假如前一位工程师使用root账户登陆,那随后的 攻 击 者同样也处于root模式下,可以随时对设备进行离线,重启,关机等重大操作。
安全设置建议
1.开启logout-on-disconnect功能,拔除console线以后直接登出当前用户。
[edit system ports]
GingerBeer@Juniper# set console log-out-on-disconnect2.禁止console接口上使用root账户登陆。
[edit system ports]
GingerBeer@Juniper# set console insecure
3.使狠招:关闭console接口。在某些特定情况,例如在无法保证设备的物理环境安全的情况下,为了避免有人恶意使用console猜测密码或者执行其他任务,可以直接关闭console接口。
[edit system ports]
GingerBeer@Juniper# set console disable
Auxiliary Port 辅助接口
辅助接口,一般情况下没几个人用。它主要有两个功能。第一是可以连接一个外界modem,通过modem拨号后连接远端场所,远端可以通过此modem管理设备。辅助接口有时候可以作为第二个console使用。
既然大家平时都不用,所以最好把它关闭。以Junos为例,Junos默认情况下是关闭了Auxiliary接口,虽然配置里面看不出来。但是从安全角度出发,可以显式配置关闭Auxiliary辅助接口。
显式关闭辅助接口
[edit system ports]
GingerBeer@Juniper# set auxiliary disable
板卡诊断接口
对于高端路由器或者交换机而言,一般会存在两个Routing Engine路由引擎卡,两个交换矩阵板卡,多个业务板卡。
而就在交换矩阵板卡上,会存在一个类似于路由引擎的console接口的东西。其意义为若有一些故障需要从板卡层面诊断的话,可以通过连接交换板卡的诊断口来收集信息。
从安全角度而言,诊断接口一般没有密码。对你没看错,没-有-密-码。
以Juniper为例,某些SCB,SSB,SFM,FEB卡会存在此诊断接口。从安全角度,我们应该给他设置密码验证。
诊断接口设置密码验证
设置方法如下:
[edit system]
GingerBeer@Juniper# set diag-port-authentication plain-text-password
New password:
Retype new password:
[edit system]
或
GingerBeer@Juniper# set pic-console-authentication plain-text-password
New password:
Retype new password:
[edit system]
GingerBeer@Juniper#
USB接口安全
USB提供了便捷的文件传输和存储扩展,基于你的安全需求,你可以考虑关闭它。
[edit chassis]
GingerBeer@Juniper# show
usb {
storage {
disable;
}
}
[edit chassis]
GingerBeer@Juniper#
设备显示屏安全
这一点很有趣,在某些交换机上,会有一个小小的LCD的单色屏幕,旁边一般会有几个小小的按钮。可别小看了这个LCD显示屏。通过这个屏幕可以执行一些基本的系统维护和控制功能,例如离线板卡,重置系统配置等。所以若不常用其功能,我们可以选择关闭LCD屏幕的操作功能。
锁掉LCD屏幕操作功能,只许看,不许摸!
[edit]
GingerBeer@Juniper# set chassis craft-lockout
总的来说,类似于路由器,交换机甚至防火墙等设备。其安全性要高于服务器,原因在于网络设备一般默认开启的服务远远少于服务器。
既然做安全加固,就需要一种鸡蛋里面挑骨头的精神,让我们来看看在网络设备上还能关闭什么不必要的服务。
很多Juniper设备初始环境下,为了迎合自动化需求,例如大批量配置设备。默认是开启了自动安装配置功能。从安全角度来说,如果你不需要此功能,可以选择关闭它。
关闭自动安装
[edit]
GingerBeer@Juniper# delete system autoinstallation仅限Juniper SRX,关闭从USB自动安装
[edit]
GingerBeer@Juniper# set system autoinstallation usb disable
ICMP重定向是路由器向IP数据包的发送者发送的通知,以通知他们到达特定目标主机或网络的更好方式。 收到重定向后,源设备应修改其路由的方式,然后通过路由器建议的下一跳发送后续数据包。
攻 击 者可以利用ICMP重定向的特性,向路由器发送大量的非最优路由的数据包,促使路由器返回成千上万的ICMP重定向,从而实现DDOS***。
可是,在一个设计良好的网络环境里面,是不需要也不应该出现ICMP重定向的信息,为此我们可以关闭它。
同其他厂商类似,Juniper的Junos默认是开启ICMP重定向的。
关闭ICMP重定向
[edit]
GingerBeer@Juniper# set system no-redirects
TCP恶意flag
先说说TCP恶意flag,大家知道正常TCP协商流程会用到SYN或FIN flag标记,SYN用于TCP建立,而FIN用于TCP会话拆除。
但是没有哪一个正常数据包会同时把SYN和FIN放到标记flag里面,因为逻辑是矛盾冲突的。
可是,有人就会故意人为制造此数据包,并通过发送大量的无效数据包来制造DOS 攻 击 ,并获悉目标设备的操作系统信息等。
我们可以配置JUNOS丢弃同时含有SYN和FIN字段的无效数据,不做回应。
配置如下:
{master:0}[edit]
GingerBeer@Juniper# set system internet-options tcp-drop-synfin-set
TCP探测
攻 击 者为了探测目标网络设备的端口打开范围和状态,可以发送大量的TCP-SYN连接请求,通过查看网络设备的回复信息来知晓端口打开情况。
在高强度扫描的情况下,网络设备的负载会增加,并造成DOS 攻 击 。
**配置JUNOS对未开启的端口不回复TCP-RST,从而让 攻 击 者无法知晓此端口是否开启。
{master:0}[edit]
GingerBeer@Juniper# set system internet-options tcp-drop-synfin-set
LLDP,类似于Cisco的CDP。不过是被IEEE标准化了的邻居发现协议而已。既然是邻居发现,自然会完全暴露网络设备本身的详细信息。所以仅仅在需要的端口上开启LLDP,是网络安全的首选项。
案例如下:
如下案例,默认在所有接口关闭LLDP,除了需要的ge-0/0/0 & ge-0/0/3接口。
[edit]
GingerBeer@Juniper# edit protocols lldp
[edit protocols lldp]
GingerBeer@Juniper# set interface all disable
[edit protocols lldp]
GingerBeer@Juniper# set interface ge-0/0/0.0
[edit protocols lldp]
GingerBeer@Juniper# set interface ge-0/0/3.0
对于运维人员而言,我们希望能够看到用户登录网络设备以后的一举一动,例如哪个账号登陆的,登录以后他都执行了哪些命令。
拥有这样的功能以后,就好似在网络设备上安装了一个无形的摄像头,监控登录用户的一举一动。同时也起到了震慑作用。
Juniper的Junos在日志这方面做得非常好,它能够根据用户需求,从所有日志记录中挑出你需要的信息,并存放到特定文件或者syslog服务器上。
配置如下:
set system syslog file interactive-commands interactive-commands any
set system syslog file authorization authorization info
查看用户登陆记录:
show log authorization
效果如下:
Jan 20 01:17:08 GingerBeer-RTR01 sshd[11590]: (pam_sm_acct_mgmt): DEBUG: PAM_USER: ro
Jan 20 01:17:08 GingerBeer-RTR01 sshd[11590]: (pam_sm_acct_mgmt): DEBUG: PAM_ACTUAL_USER: Gingerbeer
Jan 20 01:17:08 GingerBeer-RTR01 sshd[11590]: Accepted password for Gingerbeer from 1.2.3.4 port 12345 ssh3
Jan 20 01:21:10 GingerBeer-RTR01 sshd[11777]: (pam_sm_acct_mgmt): DEBUG: PAM_USER: ro
Jan 20 01:21:10 GingerBeer-RTR01 sshd[11777]: (pam_sm_acct_mgmt): DEBUG: PAM_ACTUAL_USER: Gingerbeer
Jan 20 01:21:10 GingerBeer-RTR01 sshd[11775]: Accepted keyboard-interactive/pam for Gingerbeer from 12345 port 12345 ssh3
Jan 20 01:21:10 GingerBeer-RTR01 sshd[11775]: Received disconnect from 1.2.3.4: 11: PECL/ssh3 (http://pecl.php.net/packages/ssh3)
Jan 20 01:21:10 GingerBeer-RTR01 sshd[11775]: Disconnected from 1.2.3.4
查看用户执行命令记录:
show log interactive-commands | last
效果如下:
Jan 20 07:52:30 GingerBeer-RTR01 mgd[30631]: UI_CMDLINE_READ_LINE: User 'Gingerbeer', command 'show interfaces terse '
Jan 20 07:53:03 GingerBeer-RTR01 mgd[30631]: UI_CMDLINE_READ_LINE: User 'Gingerbeer', command 'show route '
Jan 20 07:53:37 GingerBeer-RTR01 mgd[30631]: UI_CMDLINE_READ_LINE: User 'Gingerbeer', command 'show configuration | display set | no-more '
Jan 20 07:53:56 GingerBeer-RTR01 mgd[30631]: UI_CMDLINE_READ_LINE: User 'Gingerbeer', command 'show log interactive-commands | last
网络设备配置,毋庸置疑,最宝贵的资料莫过于它了。我见过很多工程师朋友在网络设备down掉后急的火烧眉毛,就是因为没有定期备份配置。想找设备顶替都没办法。
而在Juniper的Junos中,自动备份配置是一件非常简单的事情。
设置如下:
[edit system archival configuration]
GingerBeer@Juniper# show
transfer-interval 1440;
archive-sites {
"scp://Gingerbeer@1.2.3.4:/Configs" password "$9$EGCyMCVb1JGnev2aajPf359AO1"; ## SECRET-DATA
}
简单解读上述设置,每隔24小时此路由器会就通过SCP给1.2.3.4的服务器发送当前配置。
所谓的不安全系统服务,是指那些在传输过程中是以明文传输。因此极其容易被中间人截获从而获取系统登录权限等。
例如如下服务:
1.关闭 Berkeley “r”
[edit system services]
GingerBeer@Juniper# delete rsh
[edit system services]
GingerBeer@Juniper# delete rlogin
2.关闭 FTP:
[edit system services]
GingerBeer@Juniper# delete ftp
3.关闭 Finger:
[edit system services]
GingerBeer@Juniper# delete finger
4.关闭 Telnet:
[edit system services]
GingerBeer@Juniper# delete telnet
5.关闭 通过HTTP登录的J-web:
[edit system services]
GingerBeer@Juniper# delete web-management http
6.关闭 Reverse Telnet:
[edit system services]
GingerBeer@Juniper# delete reverse telnet
7.关闭 clear-text Junoscript access:
[edit system services]
GingerBeer@Juniper# delete xnm-clear-text
8.关闭 TFTP server:
[edit system services]
GingerBeer@Juniper# delete tftp-server
这一步算是一个加分项,一般情况系统都会有默认值。而大家可以根据自身网络的需求修改为特定值。
用户登陆参数设置案例
{master:0}[edit system login retry-options]
GingerBeer@Juniper# show
tries-before-disconnect 3; ##在断开连接之前最多尝试3次
backoff-threshold 1; #如果用户因为密码登录失败一次以后,就会启动用户登录等待时间。
backoff-factor 6; #此处定义了用户登录等待时长。
minimum-time 30; #等待用户30秒键入密码
maximum-time 60; #当用户ssh或者其他方式登录设备时,在用户未键入用户名和密码之前,等待60秒。超时后tcp连接终止。
lockout-period 10; #当用户登陆失败超出上文限定次数以后,锁定用户名10分钟。
以上各项设置,仅仅起到了保护部分功能的效果,但是若要全盘保护整个路由器。还是得靠一个复杂而全面的路由引擎保护机制。
别搞些名词来忽悠人了,还压轴大戏,说白了不就是套个ACL访问列表限制访问路由引擎的流量么。
哥别急,ACL也有它的高级套路,否则怎么好意思称之为“设计”呢。
首先,我们需要把到达路由器的流量分为两大类:
1.管理类流量
2.协议类流量
其次,分别列出以上两类流量的所有协议。
举例说明:
管理流量,一般为SSH,SNMP,NTP,Radius,ICMP以及traceroute。
由于ACL是非状态化的。换而言之,对于路由器发往外界的流量,也需要有一个条目来允许其返回流量。例如Radius请求回复。(很重要)
协议类流量,一般为OSPF,RIP,BGP。或者MPLS类的LDP,RSVP等。
根据协议端口特性,在条目中写出开放的源和目标端口。
分析完毕以后,让我们来看个编写案例,看案例最实在了。
条目注释:第一条为防止TCP SYN 洪泛 攻 击 ,首先匹配所有BGP邻居地址,以及管理地址。然后匹配TCP字段是SYN 或者Fin 或者RST,但是不包含SYN ACK的TCP包,最后用QOS的Policer限制突发最多100k。
set firewall family inet filter protect-re term synflood-protect from source-prefix-list bgp-neighbors
set firewall family inet filter protect-re term synflood-protect from source-prefix-list mgmt-nets
set firewall family inet filter protect-re term synflood-protect from protocol tcp
set firewall family inet filter protect-re term synflood-protect from tcp-flags "(syn & !ack) | fin| rst"
set firewall family inet filter protect-re term synflood-protect then policer limit-100k
set firewall family inet filter protect-re term synflood-protect then accept
附加配置:
set policy-options prefix-list bgp-neighbors apply-path "protocols bgp group <> neighbor <>"
此命令用于自动匹配所有全局下BGP邻居的IP地址,妈妈再也不用担心我需要一个个配地址啦!
set policy-options prefix-list ipv4-interfaces apply-path "interfaces <> unit <> family inet address <*>"
此命令用于自动匹配路由器设备上配置的所有IPv4地址。
PS,可能有些朋友对于Junos的这些好玩而高效的特性不太理解,那请移步我之前写的另外一篇Juniper JUNOS技术文:回车恐惧症?13个 JUNOS 技巧助你轻松无忧配置网络
条目注释:第二条为允许隔壁邻居老王主动发起BGP到此路由器,目标地址范围为所有本地路由器的IP地址。请注意有一条是“destination-port”,目标端口179。因为这个Firewall Policy最终是应用于路由引擎的入方向,所以目标端口179是朝向路由器本身。
set firewall family inet filter protect-re term allow-bgp from source-prefix-list bgp-neighbors
set firewall family inet filter protect-re term allow-bgp from destination-prefix-list ipv4-interfaces
set firewall family inet filter protect-re term allow-bgp from protocol tcp
set firewall family inet filter protect-re term allow-bgp from destination-port bgp
set firewall family inet filter protect-re term allow-bgp then accept
条目注释:第三条为允许OSPF协议
set firewall family inet filter protect-re term allow-ospf from source-prefix-list ipv4-interfaces
set firewall family inet filter protect-re term allow-ospf from destination-prefix-list ospf-allrouters
set firewall family inet filter protect-re term allow-ospf from destination-prefix-list ipv4-interfaces
set firewall family inet filter protect-re term allow-ospf from protocol ospf
set firewall family inet filter protect-re term allow-ospf then accept
条目注释:第四条为允许SSH协议,而且通过Policer限速最高10Mbps的SSH流量,正常ssh管理流量一般都不会超过此数值
set firewall family inet filter protect-re term allow-ssh from source-prefix-list mgmt-nets
set firewall family inet filter protect-re term allow-ssh from protocol tcp
set firewall family inet filter protect-re term allow-ssh from destination-port ssh
set firewall family inet filter protect-re term allow-ssh then policer limit-10m
set firewall family inet filter protect-re term allow-ssh then accept
条目注释:第五条为允许SNMP协议,限速1Mbps
set firewall family inet filter protect-re term allow-snmp from source-prefix-list snmp-servers
set firewall family inet filter protect-re term allow-snmp from protocol udp
set firewall family inet filter protect-re term allow-snmp from destination-port snmp
set firewall family inet filter protect-re term allow-snmp then policer limit-1m
set firewall family inet filter protect-re term allow-snmp then accept
条目注释:第六条为允许NTP协议,限速32kbps
set firewall family inet filter protect-re term allow-ntp from source-prefix-list ntp-servers
set firewall family inet filter protect-re term allow-ntp from source-prefix-list localhost
set firewall family inet filter protect-re term allow-ntp from protocol udp
set firewall family inet filter protect-re term allow-ntp from destination-port ntp
set firewall family inet filter protect-re term allow-ntp then policer limit-32k
set firewall family inet filter protect-re term allow-ntp then accept
条目注释:第七条为允许Radius协议,限速32kbps
set firewall family inet filter protect-re term allow-radius from source-prefix-list radiusservers
set firewall family inet filter protect-re term allow-radius from protocol udp
set firewall family inet filter protect-re term allow-radius from source-port radius
set firewall family inet filter protect-re term allow-radius then policer limit-32k
set firewall family inet filter protect-re term allow-radius then accept
条目注释:第八条为限制ICMP分片包
set firewall family inet filter protect-re term icmp-frags from is-fragment
set firewall family inet filter protect-re term icmp-frags from protocol icmp
set firewall family inet filter protect-re term icmp-frags then syslog
set firewall family inet filter protect-re term icmp-frags then discard
条目注释:第九条为允许常见ICMP消息,并限速1Mbps
set firewall family inet filter protect-re term allow-icmp from protocol icmp
set firewall family inet filter protect-re term allow-icmp from icmp-type echo-request
set firewall family inet filter protect-re term allow-icmp from icmp-type echo-reply
set firewall family inet filter protect-re term allow-icmp from icmp-type unreachable
set firewall family inet filter protect-re term allow-icmp from icmp-type time-exceeded
set firewall family inet filter protect-re term allow-icmp then policer limit-1m
set firewall family inet filter protect-re term allow-icmp then accept
条目注释:第十条为允许常见Traceroute消息,并限速1Mbps
set firewall family inet filter protect-re term allow-traceroute from protocol udp
set firewall family inet filter protect-re term allow-traceroute from destination-port 33434-33523
set firewall family inet filter protect-re term allow-traceroute then policer limit-1m
set firewall family inet filter protect-re term allow-traceroute then accept
条目注释:第十一条为允许路由器发起的SSH,BGP能够被允许返回路由器,正如之前所说,Juniper的Firewall policy就是Cisco 的ACL,是没有session状态化,所以返回路由器的流量还需要明确指定。并限速10Mbps
set firewall family inet filter protect-re term tcp-established from protocol tcp
set firewall family inet filter protect-re term tcp-established from source-port ssh
set firewall family inet filter protect-re term tcp-established from source-port bgp
set firewall family inet filter protect-re term tcp-established from tcp-established
set firewall family inet filter protect-re term tcp-established then policer limit-10m
set firewall family inet filter protect-re term tcp-established then accept
条目注释:第十二条就很容易理解了,除了以上所有指定的流量,其他流量全部丢弃。不回应ICMP unreachable消息。
set firewall family inet filter protect-re term default-deny then log
set firewall family inet filter protect-re term default-deny then syslog
set firewall family inet filter protect-re term default-deny then discard
在Juniper设备上,lo0接口设计比较巧妙,他除了大家知道例如router-id,或者永不down的接口等常用功能以外。更重要的是,它是通往路由引擎的特殊通道。如果你想限制到达路由引擎的流量,相比Cisco使用control-plane policy,你只需要在Juniper的lo0上绑定一个Firewall policy即可。
完成firewall policy的配置以后,让我们把策略应用到还回lo0接口,从而限制了到达路由引擎的流量。
set interfaces lo0 unit 0 family inet filter input protect-re
除了以上描述的安全加固以外,大家日常工作中应该针对路由器上的二层冗余网关协议,三层路由协议以及其他协议通过md5等密码加固:
1.设定VRRP认证密码。
2.设定OSPF,RIP,BGP认证密码。
3.设定ldp,rsvp等MPLS协议认证密码。
这篇文章,我们一起讨论了如何在网络 攻 击 日益猖獗的今天,针对网络设备进行安全加固的经验分享和案例分析。
当然,每一个设备厂家对于自身设备都有相关的安全加固方法,Juniper的加固方式并不完全适用于Cisco和华为。
但是,我们做网工的,重要的在于思路两字。配置是不一样的,但是思路都是相通的。
我话多,还密密麻麻的放了一堆命令行。能看到这里的朋友们耐心可不是一般的好啊,日后必成大器!