はじめに
CCNP ENARSIの範囲にuRPF(Unicast Reverse Path Forwarding)があります。
今回は、自宅で使用しているCisco 1812JにuRPFを設定し、送信元IPアドレスを偽装したパケットがuRPFによってフィルタリングされることを確認します。
uRPFとは?
uRPF(Unicast Reverse Path Forwarding)は、着信パケットの送信元IPアドレスについて、ルーティングテーブルを利用して正当な送信元かどうかを検証する機能です。
送信元IPアドレスを偽装したパケット(IPスプーフィング)の対策として利用できます。
やること
今回は、自宅のCisco 1812JのLAN側インターフェースにuRPFを設定します。
LAN側のクライアントはDHCPを利用しており、デフォルトゲートウェイにはCisco 1812JのLAN側インターフェースが設定されています。
クライアントには192.168.10.0/24のアドレスが割り当てられます。
Cisco 1812JにDHCPを設定した記事はこちら
設定後、クライアントPCから送信元IPアドレスを偽装したパケットを送信し、uRPFによってフィルタリングされることを確認します。
設定
LAN側のインターフェースにuRPFを設定します。
interface FastEthernet1
ip verify unicast source reachable-via rx
今回はStrictモードを使用します。
Strictモードでは、着信パケットの送信元IPアドレスについてルーティングテーブルを検索し、その送信元IPアドレスへの最適な経路が、パケットを受信したインターフェースと一致するかを確認します。
今回の構成では、192.168.10.0/24への経路がFastEthernet1に存在します。

そのため、FastEthernet1から192.168.10.0/24以外の送信元IPアドレスを持つパケットが入ってきた場合、uRPFの検証に失敗してパケットが破棄されます。
設定確認
以下のコマンドで設定を確認します。
show ip interface FastEthernet1
設定した直後なので、uRPFによるverification dropsは0です。
IP verify source reachable-via RX
0 verification drops
送信元IPアドレスを偽装したパケットを送信
クライアントPCにScapyをインストールします。※事前にPythonをインストールしてください。
powershellを管理者権限で開き以下を実行します。
python -m pip install scapy
Scapyとは?
Scapyは、Pythonからネットワークパケットを生成・解析・操作できるライブラリです。
今回は送信元IPアドレスを192.168.20.100に偽装し、Google Public DNS(8.8.8.8)宛てにICMP Echo Requestを送信します。
pythonから以下を実行します。
from scapy.all import IP, ICMP, send
pkt = IP(
src="192.168.20.100",
dst="8.8.8.8"
) / ICMP()
send(pkt)
192.168.20.100は、今回のLANで使用している192.168.10.0/24とは異なるネットワークのIPアドレスです。
そのため、このパケットがFastEthernet1から入ってきた場合、Strict uRPFの検証に失敗して破棄されることが期待できます。
uRPFによる破棄を確認
再度、以下のコマンドを実行します。
show ip interface FastEthernet1
すると、verification dropsが1増加していました。
IP verify source reachable-via RX
1 verification drops
送信元IPアドレスを偽装したパケットを送信した直後にuRPFのverification dropsが1増加したため、今回送信したパケットがuRPFによって破棄されたことを確認できました。
Wiresharkで確認
さらにWiresharkでパケットを確認します。
Scapyから送信したICMP Echo Requestを確認できました。

一方で、クライアントPCでは8.8.8.8からのICMP Echo Replyは確認できませんでした。
ただし、今回は送信元IPアドレスを192.168.20.100に偽装しているため、仮にパケットが8.8.8.8まで到達していた場合でも、Echo Replyは192.168.20.100宛てに返されます。
そのため、Echo Replyが確認できないことだけでは、uRPFによってパケットが破棄されたとは断定できません。
今回はルータ側でuRPFのverification dropsが増加していることから、送信したEcho RequestはルータのuRPFによって破棄されたと判断できます。
まとめ
今回は、自宅のCisco 1812JにuRPFを設定し、送信元IPアドレスを偽装したパケットがuRPFによって破棄されることを確認しました。
uRPFを利用することで、受信インターフェースと送信元IPアドレスの経路関係を検証し、送信元IPアドレスの偽装(IPスプーフィング)対策として利用できます。
実際にScapyで送信元IPアドレスを偽装したパケットを生成し、Cisco 1812Jのverification dropsが増加することまで確認できました。

