回车恐惧症?13个 JUNOS 技巧助你轻松无忧配置网络

回车键,平常电脑使用中,扮演“确认”或“执行”事件的功效。服务器


在网络工程师的平日运维工做中,不管是计划性的网络配置修改,仍是临时性的故障处理,你们是否都存在一样的感觉:特别当心敲击回车键,再三确认之后才执行网络


相信如下场景是不少作网络的朋友曾经都遇到过的,在远程配置 Cisco 或者其余厂商路由器或交换机时,一顿复制粘贴而后敲下回车结果就是这样:app

1. 配错接口 IP 地址——Game Over!less

2. 修改静态路由条目或者动态路由协议,致使路由丢失----Game Over!运维

3. 配置错 VLAN ID 或者二层接口 ACCESS/TRUNK 配置错误----Game Over!tcp


这个时候大部分人都是一脸惊慌,脑子琢磨怎么解决:给远端人员打电话把路由器交换机重启。反正配置没保存呢,重启就回来了。ide


可是若是远端就是客户的话,后面几天日子恐怕就不太好过了。要是这是公司另一个厂房的核心交换,这事儿就大了。重启是不可能了,再去现场花费的时间成本无可估量。工具


总的来讲,在作平常网络配置中,回车恐惧症来源于以下几个方面:测试

● 对本身准备的配置没信心,担忧配置中有低级错误spa

● 惧怕配置设备过程当中遇到意料以外的问题

● 和对端联调的时候,不信任对端,惧怕远端工程师犯错致使联调不成功


以上的问题也曾让我在平常运维中头疼不已。直到后来我入职某运营商后,不管从客户的 CPE,到核心 PE,BNG 或者 P 路由器,绝大部分设备都是 Juniper。在慢慢从 Cisco 习惯过渡到 Juniper 的过程当中,我发现这些担心和问题极大地减小了。并且准确来讲你有很大的机会在敲回车执行之间,就已经发现错误并予以纠正。


那到底在 Juniper 环境下,有什么行之有效并且简单易用的工具可以解决工程师的烦恼呢?


为了回答上面的问题,我将用一个平常割接流程来给你们揭晓答案。


说到割接流程,无非就三点: 

● 割接前期配置准备

● 进行割接

● 割接后复查


在介绍这些技巧以前,先给较少接触过 Juniper 设备的朋友们作个知识铺垫:和 Cisco 的 IOS 系统配置模式不一样,JUNOS 系统配置模式里面,配置修改并非当即生效。你能够随意增添甚至删除整个设备配置,只有你在经过 commit 提交配置后,才会生效。


(PS:请勿在现网设备随意模仿,能够在Juniper实验室或者模拟器上测试。)



割接前期配置准备


在前期配置准备过程当中,咱们怎么保证预配置没有低级错误,如打错字符,写错 IP 等?难道要每次都把预配置加载到实验室设备或者模拟器上跑一遍看看?


另外,因为配置脚本行数多,配置量大。在割接期间逐个复制粘贴很耗费时间;同时,在复制粘贴过程当中,若是人眼跟踪不及时,容易忽略设备提示的错误。


那么,下面让咱们用一个简单的例子来讲明 JUNOS 都有哪些工具可以解决以上问题。

 

案例:

某部门计划隔天割接几台关键服务器到另一台 Juniper 设备上,工程师计划配置一个新的 vlan 及 vlan interface。并划分两个物理接口到这个新 vlan 内。如下为该工程师作的预配置: 

set interfaces ge-0/0/6 unit 0 family ethernet-switching interface-mode access
set interfaces ge-0/0/6 unit 0 family ethernet-switching vlan members internal
set interfaces ge-0/0/7 unit 0 family ethernet-switching interface-mode access
set interfaces ge-0/0/7 unit 0 family ethernet-switching vlan members internal
 
set interfaces irb unit 5 family inet address 192.168.1.1/24
 
set vlans internal vlan-id 5
set vlans internal l3-interface irb.5


问题 1:通常状况,工程师会等到割接时才把全部准备的配置加载到设备上,那咱们能否在准备配置前期提早加载到设备上?等到割接的时候,只须要执行几条关键的命令,就完成整个割接?这样既节省时间,也减小了出错率。

 

答案是能够的,上工具!


工具 1: load set terminal (加载set命令的配置,若是有语法错误会当即提醒)

load set terminal 是一个批量添加配置的工具,相比逐个命令复制粘贴,批量添加的好处是配置清晰明了。能够一目了然地发现错误的参数,尤为是在配置行数特别多的状况下,很是方便工程师查错。


它还有其余孪生兄弟,例如:load merge terminal,load patch terminal等。具体你们能够查阅Juniper文档。


让咱们使用 load set terminal 把工程师准备的割接配置加载到设备上,方法以下: 

admin@Juniper>configure 
Entering configuration mode
 
admin@Juniper# load set terminal 
[Type ^D at a new line to end input]
set interfaces ge-0/0/6 unit 0 family ethernet-switching interface-mode access
set interfaces ge-0/0/6 unit 0 family ethernet-switching vlan members internal
set interfaces ge-0/0/7 unit 0 family ethernet-switching interface-mode access
set interfaces ge-0/0/7 unit 0 family ethernet-switching vlan members internal
 
set interfaces irbunit 5 family inet address 192.168.1.1/24
 
set vlans internal vlan-id 5
set vlans internal l3-interface irb.5
load complete
 
[edit]
admin@Juniper#

当全部命令加载完毕之后,键入 Ctrl+D 后就能够结束 load setterminal 的界面并回到了配置模式下。


工具 2: deactivate(告知 JUNOS 忽略某配置)

经过 deactivate 这一配置技巧,咱们能够人为地忽略某配置。从而让 JUNOS 在读取配置的时候,不读取对应的配置参数。可是在经过 show configuration 的时候,仍然可见。


回到案例中,为了不割接前配置的 vlan 接口 irb.5 的 IP 地址被其余路由协议发布到网络中,咱们先把它 deactivate 掉。方法以下: 

[edit]
admin@Juniper# deactivate interfaces irb unit 5 family inet address 192.168.1.1/24


工具 3: disable (admin shut down某接口)

disable 就等同于 Cisco 的接口 shutdown。与 Cisco 类似,它也只能应用于接口级别。


为了让接口在割接前不开启,咱们能够 shutdown ge-0/0/6 以及 ge-0/0/7 接口。方法以下:

admin@Juniper# set interfacesge-0/0/6 disable 
 
[edit]
admin@Juniper# setinterfaces ge-0/0/7 disable


最后,让咱们来看看经过以上工具配置后的最终结果:

admin@Juniper# show interfaces | display set 
setinterfaces ge-0/0/6 disable
set interfacesge-0/0/6 unit 0 family ethernet-switching interface-mode access
set interfacesge-0/0/6 unit 0 family ethernet-switching vlan members internal
setinterfaces ge-0/0/7 disable
set interfacesge-0/0/7 unit 0 family ethernet-switching interface-mode access
set interfacesge-0/0/7 unit 0 family ethernet-switching vlan members internal
set interfaces irb unit 5 family inet address 192.168.1.1/24
deactivate interfaces irb unit 5 family inet address 192.168.1.1/24
 
admin@Juniper# show vlans | display set 
set vlans internal vlan-id 5
set vlans internal l3-interface irb.5

这里你可能会注意到在每一个配置里面,都有一个对应的 deactivate 或者 disable 配置。


Tips:deactivate 和 disable 有什么区别?

disable 等同于 Cisco 的 shutdown,可是 JUNOS 系统会继续读取 ge-0/0/6 或者 ge-0/0/7 的接口配置,只是把它admin down了而已。

而 deactivate 直接让 JUNOS 忽略此配置,虽然你经过 show config 仍然能看见 irb unit 5 的 IP 地址,可是对于设备自己来讲,它会彻底忽略此IP。


问题 2:预配置完成之后,如何经过JUNOS核查配置错误,如何知道当前的配置与现有配置是否冲突呢?


工具 4: show | compare (对比原配置和加载的新配置之间的区别)

show | compare可以对比配置先后的差异,从而看出配置是否有误。


在本案例中,使用 show | compare 能够对比配置加载先后的区别,方法以下:

admin@Juniper# show |compare 
[edit interfaces]
+   ge-0/0/6 {
+       disable;
+       unit 0 {
+           family ethernet-switching {
+               interface-mode access;
+               vlan {
+                   members internal;
+               }
+           }
+       }
+   }
+   ge-0/0/7 {
+       disable;
+       unit 0 {
+           family ethernet-switching {
+               interface-mode access;
+               vlan {
+                   members internal;
+               }
+           }
+       }
+   }
[edit interfaces irb]
+    unit 5 {
+        family inet {
+            inactive: address 192.168.1.1/24;
+        }
+    }
[edit vlans]
+   internal {
+       vlan-id 5;
+       l3-interface irb.5;
+   }
 
[edit]
admin@Juniper#

你能够看到,左边为加号(+),证实此配置是新增配置。若是是减号(-),那么表明删除配置。


为了增强对这个工具的理解,下面再加一个示例:


### 额外示例 ###

某个工程师准备把接口 ge-0/0/5 从 access 模式变为 trunk 模式,并新增一个 Internet 的 vlan 在此接口下。完成配置并 show | compare 后,经过加减号就能够知道哪一个配置删除了,哪一个配置是新增的。示例以下:

admin@Juniper# show |compare 
[edit interfaces ge-0/0/5 unit 0 family ethernet-switching]
-      interface-mode access;
+      interface-mode trunk;
[edit interfaces ge-0/0/5 unit 0 family ethernet-switching vlan]
-       members MGMT;
+       members [ MGMT Internet ];

注意,show | compare 在平常 Juniper 运维中,占据了很是重要的角色,经过 show| compare 你能够清楚知道本身的配置是否符合预期。


工具5: commit check (设备配置自动核查)

经过 commit check,可以在提交配置以前,作最后一步的系统配置自检。


回到咱们开头的案例。完成 show | compare 的检查之后,咱们继续让 JUNOS 自行检查配置: 

[edit]
admin@Juniper# commit check 

configuration check succeeds
 
[edit]
admin@Juniper#

commit check 会告知你配置是否有误,是否与其余配置有冲突等。上面输出能够看出咱们的配置没有问题。接下来就能够放心去提交配置了。

 

问题 3:在配置中若是须要修正错误配置或须要新增其余配置时,如何简洁高效地完成任务?


有些时候,你们载入配置过程当中,发现脚本里面接口配置错误,或者IP地址配置错误。按照通常思路来的话,确定是删除掉此命令,而后再重配置一遍。其实还有比这个更简单的方法,咱们来看看对比:


上面的案例里,咱们配置了 ge-0/0/6 和 ge-0/0/7 两个接口。假设服务器部门告诉你,正确接口应该是 ge-0/0/5,你须要把 ge-0/0/7 的配置挪到 ge-0/0/5 上。


传统方法:

delete interfaces ge-0/0/7 
 
set interfaces ge-0/0/5 disable
set interfaces ge-0/0/5 unit 0 family ethernet-switching interface-mode access
set interfaces ge-0/0/5 unit 0 family ethernet-switching vlan members internal


而更简单的方法能够用到如下工具:

 

工具 6: rename (重命名某一个变量)

顾名思义,rename 能够把你在 JUNOS 内配置的任何参数变量重命名。在这里咱们把接口 ge-0/0/7 重命名为 ge-0/0/5,全部 ge-0/0/7 相关的配置被挪到 ge-0/0/5 层级之下。

admin@Juniper# rename interfaces ge-0/0/7 to ge-0/0/5 
 
[edit]
admin@Juniper# show |compare 
[edit interfaces]
+   ge-0/0/5 {
+       unit 0 {
+           family ethernet-switching {
+               interface-mode access;
+               vlan {
+                   members internal;
+               }
+           }
+       }
+   }
-   ge-0/0/7 {
-       unit 0 {
-           family ethernet-switching {
-               interface-mode access;
-               vlan {
-                   members internal;
-               }
-           }
-       }
-   }
 
[edit]
admin@Juniper#

 

工具 7: replace pattern(替换字符串)

相比 renamereplace pattern 的功能更为强大,他能够替换整个 JUNOS 配置里面的参数。假设 ge-0/0/7 被某一个 routing-instance VRF)调用,在执行 replace pattern ge-0/0/7 with ge-0/0/5 之后,接口配置和 routing-instance 配置都会同时改变。这在大批量修改某一个参数的时候尤为方便。


在此案例中,ge-0/0/7 仅有接口配置,并未被其余协议等调用。因此 show | compare 仅仅替换接口相关参数。

admin@Juniper# replace pattern ge-0/0/7 with ge-0/0/5


替换完成后,使用前面讲到的 show | compare 查看结果,方法以下:

admin@Juniper# show |compare 
[edit interfaces]
+   ge-0/0/5 {
+       unit 0 {
+           family ethernet-switching {
+               interface-mode access;
+               vlan {
+                   members internal;
+               }
+           }
+       }
+   }
-   ge-0/0/7 {
-       unit 0 {
-           family ethernet-switching {
-               interface-mode access;
-               vlan {
-                   members internal;
-               }
-           }
-       }
-   }
 
[edit]


能够看出,运用此工具后,全部的 ge-0/07 都被替换成了 ge-0/0/5。

 

工具 8: copy (复制某一个变量到其余变量)

若是这个时候,服务器部门又发邮件告知你,索性把ge-0/0/5和ge-0/0/7都配置了吧,很简单,咱们把ge-0/0/7的配置复制到ge-0/0/5就好了。


下面咱们以ge-0/0/7为模板复制配置到ge-0/0/5。

admin@Juniper# copy interfaces ge-0/0/7 to ge-0/0/5 
 
[edit]
admin@Juniper# show |compare 
[edit interfaces]
+   ge-0/0/5 {
+       unit 0 {
+           family ethernet-switching {
+               interface-mode access;
+               vlan {
+                   members internal;
+               }
+           }
+       }
+   }
 
[edit]
admin@Juniper#

完成以上的预配置以后咱们须要让其生效。正如我以前提到过,Juniper 的配置是须要 commit 提交之后才能生效的,可是为了不提交配置之后,出现意外状况致使工程师丢失与路由器的管理链接,JUNOS 引入了自动倒回功能。


工具9: commit confirm xxx comment “xxx”  (提交配置,若没有工程师确认,系统会在xx分钟以内倒回,并附上配置备注)


这是 JUNOS 最让人爱不释手的一个功能。先看例子:使用 commit confirm comment 来提交配置

admin@Juniper# commit confirmed 2 comment "add new interfaces as well as vlan configuration" 
 
commit confirmed will be automatically rolled back in 2 minutes unless confirmed
commit complete
 
# commit confirmed will be rolled back in 2 minutes
[edit]
admin@Juniper#

如上所示,confirm 2 是告知路由器,两分钟以内若是工程师没有确认此配置,那么以前配置的内容将被删除并还原回配置以前的状态。若是在 confirm 以后不加数字,默认是 10 分钟。最低能够设置一分钟。


更贴心的是,你还可使用 comment 关键字添加备注,这样大大方便了后续核查的时候了解每次操做的大概内容。以上面的配置为例,经过备注能够知道这次配置内容为新增两个接口和一个 vlan。


下面再来演示一下 Juniper 设备在 2 分钟后无人确认配置的状况下,自动倒回的输出:

[edit]
                                                                              
Broadcast Message from root@Juniper                                            
        (no tty) at 17:35 NZST...                                              
                                                                              
Commit was not confirmed; automatic rollback complete.                                                                              
 
[edit]
admin@Juniper#


那么在 commit 以后,一切工做正常,我如何避免配置被自动倒回呢?


咱们只须要在倒回时间超时以前再作一个核查配置的 commit check 就好了。以下所示:

# commit confirmed will be rolled back in 2 minute
[edit]

admin@Juniper# commit check

configuration check succeeds
 
[edit]
admin@Juniper#


是否是很贴心?



割接中


由于有前期的预配置,割接就显得很轻松了。咱们只须要删除 disable 以及 deactivate 的命令行就完成了。这里会用到以下工具:

 

工具 10: activate(激活忽略的预配置)

经过删除以前的disable 配置,并activate以前的deactivate的配置,就能够激活以前加载的全部预配置。

admin@Juniper# load set terminal 
[Type ^D at a new line to end input]
 
delete interfaces ge-0/0/6 disable
delete interfaces ge-0/0/7 disable
activate interfaces irb unit 5 family inet address192.168.1.1/24
 
load complete
[edit]


用 show | compare 确认激活行为:

admin@Juniper# show |compare 
[edit interfacesge-0/0/6]
-   disable;
[edit interfacesge-0/0/7]
-   disable;
[edit interfaces irbunit 5 family inet]
!        active: address 192.168.1.1/24 { ... }


工具 11: commit at(定点提交配置)

激活配置之后,一样咱们也须要向 JUNOS 提交配置,相比以前的 commit confirm,此次咱们换一个方法,使用 commitat。以下所示,它会告知路由器,请在晚上 10 点整的时候提交这个配置。(你能够根据本身的时间修改,可是须要比当前时间晚。)

admin@Juniper# commitcomment "cut over the vlan and ge-0/0/5,ge-0/0/6" at 22:00    

configuration checksucceeds

commit at will beexecuted at 2017-09-14 22:00:00 NZST

The configuration hasbeen changed but not committed

Exiting configurationmode

如上所示,系统提示配置会在晚上10点被执行。


须要说明的是,为了给你们展示各个工具的使用方法,特意挑选了一个及其简单的案例。可是带来的反作用就是没有彻底体现出预先加载割接配置的优点。可是试想一下若是这次割接须要大量的配置,例如大量的 VRF 配置,大量的 BGP 邻居配置以及接口配置等。经过在割接前加载全部配置并 deactivate 掉,割接时只须要少许命令行来 activate 激活预配置,从而大大简化了割接的步骤和复杂度,进而减少了犯错误的可能性。



割接完成


割接完成之后,最重要的就是核查网络运行状况,确认提交的配置是否按照预期运行,而且没有引入任何其余网络故障。为了达到这样的目的,咱们能够采用如下介绍的工具:


工具11: monitor interface(设备接口流量监控)

完成接口配置之后,咱们须要核查接口是否有流量。若是用传统的 show interface xxx 看到的都是静态数据,那有没有更好的方法?例如动态地观测数据。


借助 monitor interface,咱们就能够轻松实现这个功能,以下实例:

admin@Juniper>monitor interface ge-0/0/5
 
Interface: ge-0/0/5,Enabled, Link is Up
Encapsulation:Ethernet, Speed: 1000mbps
Trafficstatistics:                                             Current delta
<如下为接口实时动态输入输出流量,每秒都在刷新,我只截取了某一秒的输出内容>
  Input bytes:                  17411220 (200 bps)                        [52]
  Output bytes:                 24971481 (947704 bps)                 [438150]
  Input packets:                  324059 (0 pps)                           [1]
  Output packets:                 319355 (789 pps)                      [2921]
Errorstatistics:
  Input errors:                        0                                   [0]
  Input drops:                         0                                   [0]
  Input framing errors:                0                                   [0]
  Policed discards:                    0                                   [0]
  L3 incompletes:                      0                                   [0]
  L2 channel errors:                 232                                   [0]
  L2 mismatch timeouts:                0                                   [0]
  Carrier transitions:                 1                                   [0]
  Output errors:                       0                                   [0]
  Output drops:                        0                                   [0]
  Aged packets:                        0                                   [0]
 
<为了便于阅读,此处省略了其余无关的输出内容>

此命令是每秒钟都在刷新,若是你们有条件能够在设备上尝试一下,博客上没法动态展示给你们。


工具 12: monitor traffic interface (cli 层面的tcpdump 数据抓包)

有些时候配置了路由协议,可是发现其没有正常工做,在开启 debug 模式以前,咱们还有一个最简单的办法来排错,那就是抓包。


想到抓包,你们是否是第一印象就是作镜像端口,而后把 PC 接入设备用 Wireshark 抓取。


在 Juniper 设备上,若是你只是想抓取到达路由器自己的流量,例如像上面所述的路由协议排查,咱们能够很简单地在命令行模式下抓取到达路由器的数据包。


下面演示一个命令行模式下用 monitor trafficinterface 的抓包:

admin@Juniper>monitor traffic interface ge-1/1/4.100 no-resolve    
verbose outputsuppressed, use <detail> or <extensive> for full protocol decode
Address resolution isOFF.
Listening onge-1/1/4.100, capture size 96 bytes
 
s00:46:38.271636  In IP 1.2.3.4.179 > 1.2.3.5.61855: P662902184:662902203(19) ack 2900796289 win 16384 <nop,nop,timestamp3271803181 643396392>: BGP, length: 19
00:46:38.371433 Out IPtruncated-ip - 2 bytes missing! 1.2.3.5.61855 > 1.2.3.4.179: . ack 19 win16384 <nop,nop,timestamp 643418995[|tcp]>
00:46:38.724938 OutIS-IS, L2 Lan IIH, src-id 0011.0000.0001, lan-id 0011.0000.0001.03, prio 64,length 47
00:46:39.174455 OutES-IS, ISH, length 26
00:46:41.199436 OutIS-IS, L2 Lan IIH, src-id 0011.0000.0001, lan-id 0011.0000.0001.03, prio 64,length 47
00:46:42.161045  In IS-IS, L2 Lan IIH, src-id 0011.0000.0254,lan-id 0011.0000.0001.03, prio 64, length 47
00:46:42.481016 OutIS-IS, L2 CSNP, src-id 0011.0000.0001.00, length 47
00:46:43.797914 OutIS-IS, L2 Lan IIH, src-id 0011.0000.0001, lan-id 0011.0000.0001.03, prio 64,length 47
00:46:43.864907 Out IPtruncated-ip - 21 bytes missing! 1.2.3.5.61855 > 1.2.3.4.179: P 1:20(19) ack19 win 16384 <nop,nop,timestamp 643424488[|tcp]>
00:46:43.964852  In IP 1.2.3.4.179 > 1.2.3.5.61855: . ack20 win 16384 <nop,nop,timestamp 3271808875 643424488>
00:46:46.147386 OutIS-IS, L2 Lan IIH, src-id 0011.0000.0001, lan-id 0011.0000.0001.03, prio 64,length 47
00:46:48.400363 OutIS-IS, L2 Lan IIH, src-id 0011.0000.0001, lan-id 0011.0000.0001.03, prio 64,length 47
00:46:49.340934  In IS-IS, L2 Lan IIH, src-id 0011.0000.0254,lan-id 0011.0000.0001.03, prio 64, length 47
^C
15 packets received byfilter
0 packets dropped bykernel

从上面输出能够看出,两台路由器之间有 BGP 通讯流量,同时还有 IS-IS IGP 路由协议流量。


固然,monitor traffic interface 还有更多选项。例如 extensive 能够看到更多的数据包内容,经过 match 能够像 tcpdump 同样,设定源、目标地址,端口等信息来过滤数据包。

 

工具 13: show interface terse | refresh xxx (按期自动刷新)

此工具是用于定时自动刷新某些显示的命令行内容。打个比方,有时候咱们不免遇到须要同远端联调设备端口。在完成相应配置后,双方须要确认接口是否 up。通常方法是按向上的方向键调出命令不断手工刷新状态,其实更简单的办法就是使用 refresh。


Refresh 能够用于任何状态显示的自动按期刷新,例如按期接口状态,按期刷新 OSPF,ISIS,BGP 邻居状态等。


以下案例,设定路由器每 秒钟自动刷新一次接口状态。

admin@Juniper> showinterfaces terse ge-0/0/2 | refresh 1 | no-more 
---(refreshed at2017-09-14 22:00:55 NZST)---
Interface               Admin Link Proto    Local                 Remote
ge-0/0/2                up    up
ge-0/0/2.10             up    up  
ge-0/0/2.32767          up   up  
---(refreshed at2017-09-14 22:00:56 NZST)---
Interface               Admin Link Proto    Local                 Remote
ge-0/0/2                up    up
ge-0/0/2.10             up    up  
ge-0/0/2.32767          up   up  
---(refreshed at2017-09-14 22:00:58 NZST)---
Interface               Admin Link Proto    Local                 Remote
ge-0/0/2                up    up
ge-0/0/2.10             up    up  
ge-0/0/2.32767          up   up  
---(refreshed at2017-09-14 22:00:59 NZST)---
Interface               Admin Link Proto    Local                 Remote
ge-0/0/2                up    up
ge-0/0/2.10             up    up  
ge-0/0/2.32767          up   up  
---(refreshed at2017-09-14 22:01:00 NZST)---
Interface               Admin Link Proto    Local                 Remote
ge-0/0/2                up    up
ge-0/0/2.10             up    up  
ge-0/0/2.32767          up   up  
---(refreshed at2017-09-14 22:01:01 NZST)---
Interface               Admin Link Proto    Local                 Remote
ge-0/0/2                up    up
ge-0/0/2.10             up    up  
ge-0/0/2.32767          up   up

### 割接结束 ####


以上就是在使用 Juniper 设备过程当中经常使用的运维技巧和方法,相信有了这么多工具和思路的帮助下,对于你们的平常工做相比原来是否就不那么恐慌了。至少能够对本身的配置成竹在胸,自信的敲下 commit 的回车键了!




附录:如下为额外赠送的福利,拿走不谢。


福利一:apply-group

你是否是在配置 Juniper SRX 的时候但愿在每个 zone 层级下配置 host-inbound-traffic 容许基本的 ping 和 traceroute。


例若有三个 zone:internal,external,dmz。普通的方法就是针对每个 zone,配置对应的 host-inbound-policy,其实还有更简单的方法,那就是利用 apply-group。


示例:

set groups ALLOW_PING_TRACEsecurity zones security-zone <*> interfaces <*>host-inbound-traffic system-services ping
set groupsALLOW_PING_TRACE security zones security-zone <*> interfaces <*>host-inbound-traffic system-services traceroute


你会发现这里使用了通配符。这就是秘诀所在,经过通配符的方式,你能够匹配任意的 security zone 的任意接口。并在其底下容许 ping 和 traceroute


应用 groups:

set security zonesapply-groups ALLOW_PING_TRACE


查看配置,以 internal zone 为例:

admin@JuniperSRX>show configuration security zones security-zone internal |display set            
set security zones security-zoneinternal interfaces irb.5


貌似没看见配置?别急,让咱们使用 inheritance 的查看方式,此命令用于查看从其余地方继承下来的配置,例如上文的 groups 配置。 

lg@JuniperSRX>show configuration security zones security-zone internal |display inheritance 
interfaces {
    irb.5 {
        ##
        ## 'host-inbound-traffic' was inheritedfrom group ALLOW_PING_TRACE
        ##
        host-inbound-traffic {
            system-services {
                ##
                ## 'ping' was inherited fromgroup ALLOW_PING_TRACE
                ##
                ping;
                ##
                ## 'traceroute' was inheritedfrom group ALLOW_PING_TRACE
                ##
                traceroute;
            }
        }
    }
}


福利二:apply-path

你们在配置 Juniper 路由器自身防御的时候,但愿只容许设备配置的 BGP 邻居与设备经过 TCP 端口 179 通信,对于其余未配置的 BGP 邻居丢弃目标为 TCP 端口 179 的数据。


一般方法为,先搜集设备配置的全部 BGP 邻居 IP 地址,在 firewall filter 里面逐个添加。


费时费力不说,最不方便的是它是静态配置,若是后续有新的 BGP 邻居添加的时候,还得同步更新此 firewall filter。


那有什么既省时,又省力的方法呢?让咱们来看看神奇的 apply-path


示例:

在这一台 MX 路由器上,有以下的 BGP 邻居配置:

admin@MX480> show configuration | grep bgp | display set | except "firewall|policy" |grep local-add 

set protocols bgp group TO_RR local-address 1.1.0.1

set routing-instances Internet protocols bgp group UpStream_Peering neighbor 2.2.2.1 local-address2.2.2.2

set routing-instances Internet protocols bgp group UpStream_Peering-IPv6 neighbor 2:2:37::2local-address 2:2:37::1

set routing-instances Internet protocols bgp group CUSTOMER_InternetA neighbor 1.1.4.4 local-address1.1.4.5

set routing-instances Internet protocols bgp group CUSTOMER_InternetA-IPv6 neighbor 1:1:4::4local-address 1:1:4::5

set routing-instances VRF_A protocols bgp group customer_A neighbor 10.10.2.100 local-address10.10.2.1

set routing-instances VRF_A protocols bgp group customer_A_v6 neighbor 10:10:2::100 local-address10:10:2::1

set routing-instances VRF_A protocols bgp group customer_B_v6 neighbor 10:10:20::100 local-address10:10:20::1


经过 apply-path 自动挑出邻居 IP


先在 prefix-list 里面定义 apply-path:

set policy-optionsprefix-list bgp-neighbors apply-path "protocols bgp group <*>neighbor <*>"

set policy-optionsprefix-list bgp-neighbors-logical-systems apply-path "logical-systems<*> protocols bgp group <*> neighbor <*>"

set policy-optionsprefix-list bgp-neighbors-routing-instance apply-path "routing-instances<*> protocols bgp group <*> neighbor <*>"

set policy-optionsprefix-list bgp-neighbors-routing-instance-logical-systems apply-path"logical-systems <*> routing-instances <*> protocols bgp group<*> neighbor <*>"


这个命令会挑出符合以上路径的最后一个通配符的数值,在这里就是 neighbor 后面的 IP 地址。通常状况在 Juniper 里面 bgp 会存在于三个地方,全局路由表下,VRF 下,以及逻辑路由器下。因此上面就定义了三个 apply-path,并分别放置在不一样的 prefix-list 内部。


让咱们来查看一下匹配是否成功,仍是经过 inheritance 查看全局路由表的 BGP 邻居匹配状况:

admin@MX480# showpolicy-options prefix-list bgp-neighbors | display inheritance 
##
## apply-path wasexpanded to:
##     1.1.0.1/32; 
##
apply-path"protocols bgp group <*> neighbor <*>";


最后就是引用prefix-list :

set firewall family inet filter router-protect term 1-accept-bgp from source-prefix-list bgp-neighbors

set firewall family inet filter router-protect term 1-accept-bgp from source-prefix-list bgp-neighbors-routing-instance

set firewall family inet filter router-protect term 1-accept-bgp from source-prefix-list bgp-neighbors-logical-systems

set firewall family inet filter router-protect term 1-accept-bgp from source-prefix-list bgp-neighbors-routing-instance-logical-systems

set firewall family inet6 filter router-protect6 term 1-accept-bgp from source-prefix-list bgp-neighbors

set firewall family inet6 filter router-protect6 term 1-accept-bgp from source-prefix-list bgp-neighbors-routing-instance

set firewall family inet6 filter router-protect6 term 1-accept-bgp from source-prefix-list bgp-neighbors-logical-systems

set firewall family inet6 filter router-protect6 term 1-accept-bgp from source-prefix-list bgp-neighbors-routing-instance-logical-systems


并把 firewall filter 应用到 lo0 接口上。(注:在 Juniper 的 JUNOS 内,路由器防御通常方法就是添加 ACL 并绑定在 lo0 接口上)

set interfaces lo0 unit 0 family inet filter input router-protect
set interfaces lo0 unit 0 family inet6 filter input router-protect6


大功告成!码字很辛苦,赞一个吧?

相关文章
相关标签/搜索