NEX IX ルータで PBR (Policy Based Routing) する (route-map)

# IX ルーターで route-map の設定をしてみる

 単純な宛先 ip 以外の条件で経路を選択したい場合。
 インターネット回線が 2本あり、通常は A回線、部署 B は B回線を使うけど、VoIP は両方とも回線 A を使う場合など。
- 部署 B は B回線 → 送信元でルート選択
- VoIP は両方とも回線 A → 部署 B を B回線に曲げるけど、VoIP は曲げない → 宛先と送信元の両方でルート選択

他にも、A部署 と B部署の通信は許可しないけど、A 部署の Webサーバだけ B部署からのアクセスを許可するとか、ややこしい条件がある場合など。(これは acl か...)

## 構成図
![論理 ルートマップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/37b167fc-bc68-2667-6e5a-4c7722273240.png)
青 (左) の IP アドレスの第 3オクテット目は `1`
緑 (右) の IP アドレスの第 3オクテット目は `10`
traceroute で経路が見えるように Cisco の vrf で 1段増やしました。

Cisco ルーターが大きいですが、メインは IX ルータです。

|機器|デフォルトルート|
|:-:|---|
|IX|vrf-01 へ|
|Cisco vrf-01|IX へ|
|Cisco vrf-10|IX へ|
|Cisco default|vrf-01 へ|


# 経路制御の条件
下の PC から、上の Cisco の Loopback への通信を制御します。

下の PC、青い方 10.0.1.254 から Cisco へは全て青い方を通ります。
下の PC、緑の方 10.0.10.254 から Cisco へは緑の方を通ります。
　ただし、10.20.20.4 宛てのみ IX から先は青い方を通ります。

# PBR を入れるまでの設定

## Cisco 1921

```config:基本部分
no cdp run
no ip domain lookup
spanning-tree portfast bpduguard

hostname Cisco

vlan 1
vlan 2
vlan 10
vlan 11
```

```config:宛先になる loopback とルーティング (vrf default)
interface Loopback0
 ip address 10.10.10.3 255.255.255.255

interface Loopback1
 ip address 10.20.20.3 255.255.255.255

interface Loopback2
 ip address 10.20.20.4 255.255.255.255

interface Loopback3
 ip address 10.20.20.5 255.255.255.255

ip route 0.0.0.0 0.0.0.0 10.5.1.2
ip route 192.168.10.0 255.255.255.0 10.5.10.2
```
```config:vrf default の残り
interface GigabitEthernet0/0
 mac-address fc5b.39c0.f82f
 ip address 10.5.1.3 255.255.255.0

interface GigabitEthernet0/1
 ip address 10.5.10.3 255.255.255.0
```
- Vlan の MAC アドレスは Gi 0/0 の MAC アドレスと同じになるので、Gi 0/0 側の MAC アドレスを変えておく

```config:IX の対向 (vlan1/vrf-01 と vlan10/vrf-10)
interface GigabitEthernet0/0/0
 switchport mode trunk
 no ip address
```

```config:vrf-01側
ip vrf vrf-01
ip route vrf vrf-01 0.0.0.0 0.0.0.0 192.168.1.1
ip route vrf vrf-01 10.10.10.0 255.255.255.0 10.5.1.3
ip route vrf vrf-01 10.20.20.0 255.255.255.0 10.5.1.3

interface GigabitEthernet0/0/2
 switchport access vlan 2
 no ip address

interface Vlan1
 ip vrf forwarding vrf-01
 ip address 192.168.1.2 255.255.255.0

interface Vlan2
 ip vrf forwarding vrf-01
 ip address 10.5.1.2 255.255.255.0
```

```config:vrf-10側
ip vrf vrf-10
ip route vrf vrf-10 0.0.0.0 0.0.0.0 192.168.10.1
ip route vrf vrf-10 10.10.10.0 255.255.255.0 10.5.10.3
ip route vrf vrf-10 10.20.20.0 255.255.255.0 10.5.10.3

interface GigabitEthernet0/0/3
 switchport access vlan 11
 no ip address

interface Vlan10
 ip vrf forwarding vrf-10
 ip address 192.168.10.2 255.255.255.0

interface Vlan11
 ip vrf forwarding vrf-10
 ip address 10.5.10.2 255.255.255.0
```

### Cisco 1921 の Config の全体

<details><summary>show running-config</summary>

```
Cisco#show running-config
Building configuration...

Current configuration : 2547 bytes
!
! Last configuration change at 11:11:20 UTC Sat Oct 5 2024
! NVRAM config last updated at 10:13:08 UTC Fri Oct 4 2024
! NVRAM config last updated at 10:13:08 UTC Fri Oct 4 2024
version 15.1
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname Cisco
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
no ipv6 cef
ip source-route
ip cef
!
!
!
ip vrf vrf-01
!
ip vrf vrf-10
!
!
!
no ip domain lookup
!
multilink bundle-name authenticated
!
crypto pki token default removal timeout 0
!
!
license udi pid CISCO1921/K9 sn FGL184220QJ
!
!
!
spanning-tree portfast bpduguard
!
redundancy
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
 ip address 10.10.10.3 255.255.255.255
!
interface Loopback1
 ip address 10.20.20.3 255.255.255.255
!
interface Loopback2
 ip address 10.20.20.4 255.255.255.255
!
interface Loopback3
 ip address 10.20.20.5 255.255.255.255
!
interface Embedded-Service-Engine0/0
 no ip address
 shutdown
!
interface GigabitEthernet0/0
 mac-address fc5b.39c0.f82f
 ip address 10.5.1.3 255.255.255.0
 duplex auto
 speed auto
!
interface GigabitEthernet0/1
 ip address 10.5.10.3 255.255.255.0
 duplex auto
 speed auto
!
interface GigabitEthernet0/0/0
 switchport mode trunk
 no ip address
!
interface GigabitEthernet0/0/1
 no ip address
!
interface GigabitEthernet0/0/2
 switchport access vlan 2
 no ip address
!
interface GigabitEthernet0/0/3
 switchport access vlan 11
 no ip address
!
interface Vlan1
 ip vrf forwarding vrf-01
 ip address 192.168.1.2 255.255.255.0
!
interface Vlan2
 ip vrf forwarding vrf-01
 ip address 10.5.1.2 255.255.255.0
!
interface Vlan10
 ip vrf forwarding vrf-10
 ip address 192.168.10.2 255.255.255.0
!
interface Vlan11
 ip vrf forwarding vrf-10
 ip address 10.5.10.2 255.255.255.0
!
ip forward-protocol nd
!
no ip http server
no ip http secure-server
!
ip route 0.0.0.0 0.0.0.0 10.5.1.2
ip route 192.168.10.0 255.255.255.0 10.5.10.2
ip route vrf vrf-01 0.0.0.0 0.0.0.0 192.168.1.1
ip route vrf vrf-01 10.10.10.0 255.255.255.0 10.5.1.3
ip route vrf vrf-01 10.20.20.0 255.255.255.0 10.5.1.3
ip route vrf vrf-10 0.0.0.0 0.0.0.0 192.168.10.1
ip route vrf vrf-10 10.10.10.0 255.255.255.0 10.5.10.3
ip route vrf vrf-10 10.20.20.0 255.255.255.0 10.5.10.3
!
!
no cdp run
!
!
!
!
!
control-plane
!
!
!
line con 0
line aux 0
line 2
 no activation-character
 no exec
 transport preferred none
 transport output pad telnet rlogin lapb-ta mop udptn v120 ssh
 stopbits 1
line vty 0 4
 login
 transport input all
!
scheduler allocate 20000 1000
end

Cisco#
```
</details>


## IX-2207

```config:こちらはまとめて
hostname IX-2207

ip route default 192.168.1.2
ip route 10.5.10.0/24 192.168.10.2

interface GigaEthernet0.0
  ip address 10.0.1.1/24

interface GigaEthernet1.0
  ip address 10.0.10.1/24

interface GigaEthernet2.0
  ip address 192.168.1.1/24

interface GigaEthernet2.1
  encapsulation dot1q 10
  ip address 192.168.10.1/24
```
vlan 1 (未設定) は Gi2.0 からそのまま出ます。
vlan 10 は Gi2.1 としてタグ付きで出ていきます。


## Windows
```cmd:インターフェースの一覧
C:\>netsh int ip show int

Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 35          35        1500  connected     内蔵 Wi-Fi
 23           5        1500  disconnected  内蔵 NIC
 12          25        1500  disconnected  Wi-Fi 2
 24          25        1500  connected     Wi-Fi 4
  5          25        1500  disconnected  Wi-Fi 5
 37          25        1500  connected     イーサネット 2
 38          35        1500  connected     VMware Network Adapter VMnet8
 25        5000        1500  connected     vEthernet (Default Switch)
 41        5000        1500  connected     vEthernet (WSLCore)
 59        5000        1500  connected     vEthernet (Default Switch (内蔵 NIC))
 66        5000        1500  connected     vEthernet (Default Switch (イーサネット 2))
 72        5000        1500  connected     vEthernet (Default Switch (VMware Network Adapter VMnet8))
 83        5000        1500  connected     vEthernet (Default Switch (イーサネット))
 89        5000        1500  connected     vEthernet (Default Switch (内蔵 Wi-Fi))
108        5000        1500  connected     vEthernet (Default Switch (Wi-Fi 2))
134        5000        1500  connected     vEthernet (Default Switch (Wi-Fi 4))
140        5000        1500  connected     vEthernet (Default Switch (Wi-Fi 5))
146           5        1500  disconnected  イーサネット 5
 39          25        1500  connected     イーサネット
152        5000        1500  connected     vEthernet (Default Switch (イーサネット 5))
...snip...
```

`イーサネット` `イーサネット 2` に設定をするので `39` `37` を設定する
(インターフェース名でも設定可能)

```cmd:アドレスの設定 (管理者権限で実行)
netsh int ip set addr 37 static 10.0.1.254 255.255.255.0
netsh int ip set addr 39 static 10.0.10.254 255.255.255.0
```

```cmd:アドレスの表示
C:\>netsh int ip show addr 37

インターフェイスの構成 "イーサネット 2"
    DHCP 有効:                         いいえ
    IP アドレス:                           10.0.1.254
    サブネット プレフィックス:                        10.0.1.0/24 (マスク 255.255.255.0)
    インターフェイス メトリック:                      25


C:\>netsh int ip show addr 39

インターフェイスの構成 "イーサネット"
    DHCP 有効:                         いいえ
    IP アドレス:                           10.0.10.254
    サブネット プレフィックス:                        10.0.10.0/24 (マスク 255.255.255.0)
    インターフェイス メトリック:                      25

```

```cmd:ルーティング (管理者)
route add 10.10.10.0 mask 255.255.255.0 10.0.1.1
route add 10.20.20.0 mask 255.255.255.0 10.0.1.1

route add 10.10.10.0 mask 255.255.255.0 10.0.10.1
route add 10.20.20.0 mask 255.255.255.0 10.0.10.1
```

# route-map の設定する
## traceroute (route-map 設定前)
設定前の状況の確認

(`10.0.10.254` 側のケーブルを抜いておく)
この状態で `10.0.1.254` 青 (左) から `traceroute` を打つと全て `192.168.1.2` 青 (左) を経由
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/2532725b-ec86-a2fe-6af7-3f6078ed46e9.png)

(`10.0.1.254` 側のケーブルを抜いておく)
この状態で `10.0.10.254` 緑 (右) から `traceroute` を打つと全て `192.168.1.2` 青 (左) を経由
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/13c290a2-a891-57c5-3138-5e6305ebb41b.png)

デフォルトルート (左経由) で制御されている。

## traceroute (route-map を追加 1)
`10.0.10.254` 緑 (右) からのトラフィックを `192.168.10.2` 緑 (右) へ振る
src アドレスが `10.0.10.254` の場合は 
```config:
ip access-list list_to_vrf10 permit ip src 10.0.10.0/24 dest any

route-map map_gi1 permit 20
  match ip address access-list list_to_vrf10
  set ip next-hop 192.168.10.2

interface GigaEthernet1.0
  ip policy route-map map_gi1
```

全部 `192.168.10.2` 緑 (右) へルーティングされた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/b82986e3-6ecd-44e1-ac47-15e2d83c8146.png)

## traceroute (route-map を追加 2)
`10.20.20.0/24` が緑側へ振られる前に
`10.20.20.4` 宛てのトラフィックを `192.168.10.1` 青 (左) へ振るルールを `map_gi1` に追加する
さっきのを `route-map map_gi1 permit 20` で書いたので、それより小さい `permit 10` にして前に割り込ませる

```config:
ip access-list list_to_vrf01 permit ip src 10.0.10.0/24 dest 10.20.20.4/32

route-map map_gi1 permit 10
  match ip address access-list list_to_vrf01
  set ip next-hop 192.168.1.2
```
`10.20.20.4` だけ `192.168.1.2` 青 (左) へルーティングされた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/289b08cd-eae1-a5e3-c223-ea741f3424df.png)


最後に `10.0.10.254` 緑 (右) から `traceroute` を打ってルートが変わっていないこと `192.168.1.2` 青 (左) 経由を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/fb6e9c79-ab10-71a6-ee00-2691fffc1778.png)


### IX ルータの route-map 部分を再掲
```
ip access-list list_to_vrf01 permit ip src 10.0.10.0/24 dest 10.20.20.4/32
ip access-list list_to_vrf10 permit ip src 10.0.10.0/24 dest any

route-map map_gi1 permit 10
  match ip address access-list list_to_vrf01
  set ip next-hop 192.168.1.2

route-map map_gi1 permit 20
  match ip address access-list list_to_vrf10
  set ip next-hop 192.168.10.2

interface GigaEthernet1.0
  ip policy route-map map_gi1
```

<details><summary>show running-config</summary>

```config:
IX-2207(config)# show running-config
! NEC Portable Internetwork Core Operating System Software
! IX Series IX2207 (magellan-sec) Software, Version 10.8.24, RELEASE SOFTWARE
! Compiled Dec 15-Fri-2023 14:43:11 JST #2
! Current time Oct 06-Sun-2024 20:08:08 JST
!
hostname IX-2207
timezone +09 00
!
!
ip route default 192.168.1.2
ip route 10.5.10.0/24 192.168.10.2
ip access-list list_to_vrf01 permit ip src 10.0.10.0/24 dest 10.20.20.4/32
ip access-list list_to_vrf10 permit ip src 10.0.10.0/24 dest any
!
!
!
!
!
!
!
!
!
!
!
!
!
route-map map_gi1 permit 10
  match ip address access-list list_to_vrf01
  set ip next-hop 192.168.1.2
!
route-map map_gi1 permit 20
  match ip address access-list list_to_vrf10
  set ip next-hop 192.168.10.2
!
device GigaEthernet0
!
device GigaEthernet1
!
device GigaEthernet2
!
device USB0
  shutdown
!
device USB1
  shutdown
!
interface GigaEthernet0.0
  ip address 10.0.1.1/24
  no shutdown
!
interface GigaEthernet1.0
  ip address 10.0.10.1/24
  ip policy route-map map_gi1
  no shutdown
!
interface GigaEthernet2.0
  ip address 192.168.1.1/24
  no shutdown
!
interface USB-Serial0.0
  encapsulation ppp
  no auto-connect
  no ip address
  shutdown
!
interface USB-Serial1.0
  encapsulation ppp
  no auto-connect
  no ip address
  shutdown
!
interface GigaEthernet2.1
  encapsulation dot1q 10 tpid 8100
  auto-connect
  ip address 192.168.10.1/24
  no shutdown
!
interface Loopback0.0
  no ip address
!
interface Null0.0
  no ip address
!
IX-2207(config)#
```
</details>

# おまけ : Windows で cmd から IP アドレスを設定する
```cmd:インターフェースの一覧
C:\>netsh int ip show int

Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 35          35        1500  connected     内蔵 Wi-Fi
 23           5        1500  disconnected  内蔵 NIC
...snip...
 39          25        1500  connected     イーサネット
```
`netsh int ip show int` は `netsh interface ipv4 show interface` の略
 Index 39 が "イーサネット" なので、どちらを使っても同じインターフェースを指定できる。

```
C:\>netsh int show int

Admin State    State          Type             Interface Name
-------------------------------------------------------------------------
有効             接続             専用               VMware Network Adapter VMnet8
有効             切断             専用               ASIX #1
有効             接続             専用               ASIX #2
有効             接続             専用               内蔵 Wi-Fi
有効             切断             専用               内蔵 NIC
```
`netsh int show int` は `netsh interface show interface` の省略形
こちらだと物理インターフェースのみ表示されるが Index が表示されない。 (名前の確認には使える)

```cmd:アドレスの設定 (管理者権限で実行)
netsh int ip set addr "<インターフェース名>|<インデックス番号>" static <アドレス> <マスク> <GW> <メトリック> <persistent>
```

### 実行例
```
netsh int ip set addr 39 static 192.168.100.10 255.255.255.0 192.168.100.254
```

```
netsh int ip set addr "イーサネット" static 192.168.100.10/24 gateway=192.168.100.254 store=active
```
/24 でマスクを指定すると GW は `gateway=` が必要になる
`store=active` を付けると再起動で設定が消える

```cmd:ipv4 アドレスの表示 (ip は ipv4 の省略形)
C:\>netsh int ip show addr "<インターフェース名>|<インデックス番号>"
```

```cmd:実行例
C:\>netsh int ip set addr 39 static 192.168.10.33 255.255.255.0 192.168.10.2 20


C:\>netsh int ip show addr 39

インターフェイスの構成 "イーサネット"
    DHCP 有効:                         いいえ
    IP アドレス:                           192.168.10.33
    サブネット プレフィックス:                        192.168.10.0/24 (マスク 255.255.255.0)
    デフォルト ゲートウェイ:              192.168.10.2
    ゲートウェイ メトリック:              20
    インターフェイス メトリック:                      25


C:\>netsh int ip set addr "イーサネット" static 192.168.100.10/24 gate=192.168.100.254 gw=100


C:\>netsh int ip show addr 39

インターフェイスの構成 "イーサネット"
    DHCP 有効:                         いいえ
    IP アドレス:                           192.168.100.10
    サブネット プレフィックス:                        192.168.100.0/24 (マスク 255.255.255.0)
    デフォルト ゲートウェイ:              192.168.100.254
    ゲートウェイ メトリック:              100
    インターフェイス メトリック:                      25

```

```cmd:GW が不要であればアドレスだけで良い
C:\>netsh int ip set addr 39 static 10.20.30.40/24


C:\>netsh int ip show addr 39

インターフェイスの構成 "イーサネット"
    DHCP 有効:                         いいえ
    IP アドレス:                           10.20.30.40
    サブネット プレフィックス:                        10.20.30.0/24 (マスク 255.255.255.0)
    インターフェイス メトリック:                      25
```

### コマンドラインから DHCP に設定する
```cmd:
C:\>netsh int ip set addr 39 dhcp


C:\>netsh int ip show addr 39

インターフェイスの構成 "イーサネット"
    DHCP 有効:                         はい
    インターフェイス メトリック:                      25

```