読者です 読者をやめる 読者になる 読者になる

labunix's blog

labunixのラボUnix

Cisco C2970にローカルミラーポート(SPAN)を設定してみる。

■Cisco C2970にローカルミラーポート(SPAN)を設定してみる。
 [Linux2]側にIP設定が要るのか要らないのか気になったので、試してみる。
 結果的には、モニターポートに接続したinterfaceにはIP設定は不要でDHCPに関するパケットも流れない。
 SWの設定がクリアされてしまうなどの事態を想定するなら、[Linux2]側には同セグメントの別のIPアドレスを設定する方が良い。

$ echo "[Linux1]";lsb_release -d
Description:	Debian GNU/Linux 8.3 (jessie)
$ echo "[Linux2]";lsb_release -d
[Linux2]
Description:	Debian GNU/Linux 8.3 (jessie)

Switch>enable
Switch#show version | include ^Cisco
Cisco IOS Software, C2970 Software (C2970-LANBASE-M), Version 12.2(44)SE6, RELEASE SOFTWARE (fc1)

■初期化されたC2970をinterface単位でミラーする設定に変更する単純なイメージ図。

$ echo "[Linux1-eth1]<-->[Gi-0/23]<-- SPAN -->[Gi-0/24]-->[eth1-Linux2]" | \
  graph-easy --dot | dot -T png -o localspan.png

f:id:labunix:20160209145133p:plain

[Gi-0/23]から[Gi-0/24]へのSPAN(ローカル)の設定
 [Linux1]側が1G、[Linux2]側が100Mリンクのため、
 [Linux1]側に接続する[Ge0/23]を100M固定とした。

configure
  monitor session 1 source interface GigabitEthernet 0/23 both 
  monitor session 1 destination interface GigabitEthernet 0/24
  interface vlan 1
    ip address 172.16.16.254 255.255.255.0
    no shutdown
  interface GigabitEthernet 0/23
    speed 100
    no shutdown
  interface GigabitEthernet 0/24
    no shutdown
end

■モニタポートは設定した通り

Switch#show monitor 
Session 1
---------
Type                   : Local Session
Source Ports           : 
    Both               : Gi0/23
Destination Ports      : Gi0/24
    Encapsulation      : Native
          Ingress      : Disabled

■[Gi-0/23]はVLAN 1に所属している。

Switch#show vlan id 1

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Gi0/1, Gi0/2, Gi0/3, Gi0/4
                                                Gi0/5, Gi0/6, Gi0/7, Gi0/8
                                                Gi0/9, Gi0/10, Gi0/11, Gi0/12
                                                Gi0/13, Gi0/14, Gi0/15, Gi0/16
                                                Gi0/17, Gi0/18, Gi0/19, Gi0/20
                                                Gi0/21, Gi0/22, Gi0/23

VLAN Type  SAID       MTU   Parent RingNo BridgeNo Stp  BrdgMode Trans1 Trans2
---- ----- ---------- ----- ------ ------ -------- ---- -------- ------ ------
1    enet  100001     1500  -      -      -        -    -        0      0   

Remote SPAN VLAN
----------------
Disabled

Primary Secondary Type              Ports
------- --------- ----------------- ------------------------------------------

■各interfaceは100Mでリンクアップ、[Gi-0/24]はモニタポート。

Switch#show interfaces status | include 2[234]
Gi0/22                       connected    1          a-full  a-100 10/100/1000BaseTX
Gi0/23                       connected    1          a-full    100 10/100/1000BaseTX
Gi0/24                       monitoring   1          a-full  a-100 10/100/1000BaseTX

■[Linux1]のMACアドレスは、[XX:XX:XX:XX:10:ca][Linux2]のMACアドレスは[XX:XX:XX:XX:c2:e3]

$ echo "[Linux1]"; \
  ip a list eth1 | grep -v inet6 | \
    sed -e 's/ [0-9a-e][0-9a-e]:[0-9a-e][0-9a-e]:[0-9a-e][0-9a-e]:[0-9a-e][0-9a-e]:/ XX:XX:XX:XX:/'
[Linux1]
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether XX:XX:XX:XX:10:ca brd ff:ff:ff:ff:ff:ff
    inet 172.16.16.88/24 brd 172.16.16.255 scope global eth1
       valid_lft forever preferred_lft forever

$ echo "[Linux2]"; \
  ip a list eth1 | grep -v inet6 \
    sed -e 's/ [0-9a-e][0-9a-e]:[0-9a-e][0-9a-e]:[0-9a-e][0-9a-e]:[0-9a-e][0-9a-e]:/ XX:XX:XX:XX:/'
[Linux2]
5: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether XX:XX:XX:XX:c2:e3 brd ff:ff:ff:ff:ff:ff
       valid_lft forever preferred_lft forever

■pingを双方向で送信

Switch#ping 172.16.16.88

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 172.16.16.88, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/203/1006 ms

$ ping -c 3 172.16.16.88
PING 172.16.16.88 (172.16.16.88) 56(84) bytes of data.
64 bytes from 172.16.16.88: icmp_seq=1 ttl=64 time=0.157 ms
64 bytes from 172.16.16.88: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 172.16.16.88: icmp_seq=3 ttl=64 time=0.079 ms

--- 172.16.16.88 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.076/0.104/0.157/0.037 ms

■pingによりMACアドレスを学習しているはずなので確認
 [10:ca][Linux1-eth1]と一致

Switch#show ip arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  172.16.16.254           -   XXXX.XXXX.fcc0  ARPA   Vlan1
Internet  172.16.16.88            1   XXXX.XXXX.10ca  ARPA   Vlan1

$ echo "[Linux1]";sudo arp -an | grep eth1
[Linux1]
? (172.16.16.254) at XX:XX:XX:XX:fc:c0 [ether] on eth1

■L2のブロードキャスト範囲内なので、tcpdumpでキャプチャ出来るはず。
 ※CiscoのL2SWからのブロードキャストは[255.255.255.255]になってる?

$ echo "[Linux2]";sudo tcpdump -i eth1
[Linux2]

$ echo "[Linux1]-->[Gi0/23]";sudo ping -c 2 -b 172.16.16.255
[Linux1]-->[Gi0/23]
WARNING: pinging broadcast address
PING 172.16.16.255 (172.16.16.255) 56(84) bytes of data.
64 bytes from 172.16.16.254: icmp_seq=1 ttl=255 time=0.429 ms
64 bytes from 172.16.16.254: icmp_seq=2 ttl=255 time=0.424 ms

--- 172.16.16.255 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.424/0.426/0.429/0.020 ms

■ブロードキャストpingの実行結果

13:58:06.137331 IP 172.16.16.88 > 172.16.16.255: ICMP echo request, id 29933, seq 1, length 64
13:58:06.137639 IP 172.16.16.254 > 172.16.16.88: ICMP echo reply, id 29933, seq 1, length 64
13:58:07.136898 IP 172.16.16.88 > 172.16.16.255: ICMP echo request, id 29933, seq 2, length 64
13:58:07.137217 IP 172.16.16.254 > 172.16.16.88: ICMP echo reply, id 29933, seq 2, length 64

■普通のping

$ echo "[Linux1]-->[Gi0/23]";sudo ping -c 2 172.16.16.254
[Linux1]-->[Gi0/23]
PING 172.16.16.254 (172.16.16.254) 56(84) bytes of data.
64 bytes from 172.16.16.254: icmp_seq=1 ttl=255 time=0.432 ms
64 bytes from 172.16.16.254: icmp_seq=2 ttl=255 time=0.421 ms

--- 172.16.16.254 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.421/0.426/0.432/0.021 ms

13:59:31.701636 IP 172.16.16.88 > 172.16.16.254: ICMP echo request, id 29936, seq 1, length 64
13:59:31.701999 IP 172.16.16.254 > 172.16.16.88: ICMP echo reply, id 29936, seq 1, length 64
13:59:32.700993 IP 172.16.16.88 > 172.16.16.254: ICMP echo request, id 29936, seq 2, length 64
13:59:32.701228 IP 172.16.16.254 > 172.16.16.88: ICMP echo reply, id 29936, seq 2, length 64

■tsharkでも確認出来る。

$ echo "[Linux2]";sudo tshark -i 3
[Linux2]
 23  25.590468 172.16.16.254 -> 172.16.16.88 ICMP 114 Echo (ping) request  id=0x0009, seq=0/0, ttl=255
 24  25.590604 172.16.16.88 -> 172.16.16.254 ICMP 114 Echo (ping) reply    id=0x0009, seq=0/0, ttl=64 (request in 23)
 25  25.592127 172.16.16.254 -> 172.16.16.88 ICMP 114 Echo (ping) request  id=0x0009, seq=1/256, ttl=255
 26  25.592220 172.16.16.88 -> 172.16.16.254 ICMP 114 Echo (ping) reply    id=0x0009, seq=1/256, ttl=64 (request in 25)
 27  25.594272 172.16.16.254 -> 172.16.16.88 ICMP 114 Echo (ping) request  id=0x0009, seq=2/512, ttl=255
 28  25.594339 172.16.16.88 -> 172.16.16.254 ICMP 114 Echo (ping) reply    id=0x0009, seq=2/512, ttl=64 (request in 27)
 29  25.596420 172.16.16.254 -> 172.16.16.88 ICMP 114 Echo (ping) request  id=0x0009, seq=3/768, ttl=255
 30  25.596590 172.16.16.88 -> 172.16.16.254 ICMP 114 Echo (ping) reply    id=0x0009, seq=3/768, ttl=64 (request in 29)
 31  25.598595 172.16.16.254 -> 172.16.16.88 ICMP 114 Echo (ping) request  id=0x0009, seq=4/1024, ttl=255
 32  25.598669 172.16.16.88 -> 172.16.16.254 ICMP 114 Echo (ping) reply    id=0x0009, seq=4/1024, ttl=64 (request in 31)
 33  30.591415 OUIMaker_XX:10:ca -> Cisco_XX:fc:c0 ARP 60 Who has 172.16.16.254?  Tell 172.16.16.88
 34  30.592998 Cisco_XX:fc:c0 -> OUIMaker_XX:10:ca ARP 60 172.16.16.254 is at XX:XX:XX:XX:fc:c0

■Cisco側のリンクダウン/アップ時にはMDNSパケットは流れない。
 [Linux1]側のeth1リンクダウン/アップ時にMDNSパケットが流れる。
 方向も[172.16.16.88.5353 > 224.0.0.251.5353]なので、
 Cisco側やモニタポートに接続した[Linux2]のトリガーでは無い。

$ echo "[Linux1]";sudo ifconfig eth1 down;sudo ifconfig eth1 up
[Linux1][Linux2]のモニタポート側にもIPを設定するとしたら、
 例えば以下のようにIPをずらしておく。
 ([/etc/network/interfaces]スクリプトからifup/ifdownで操作する場合は、
 [ifconfig]を使わないので注意。)

$ echo "[Linux2]";sudo ifconfig eth1 172.16.16.89/24
[Linux2]