大家好,今天我們要來講如何抓取SMF與UPF中間通訊的封包,也就是PFCP,當然有很多方式可以解析封包,特別像是eBPF等在處理這些封包,不過我們這邊就簡單的透過scapy與socket進行轉發即可
而scapy在這幾年有新增PFCP的函式庫 scapy PFCP document
from scapy.all import *
from scapy.contrib.pfcp import *
import socket
LOCAL_DATA_HANDLER = lambda x:x
REMOTE_DATA_HANDLER = lambda x:x
BUFFER_SIZE = 2 ** 15
PFCP_ASSOCIATION_DATA = None
PFCP_SESSION_ESTABLISHMENT_DATA = None
PFCP_SESSION_MODIFICATION_DATA = None
PFCP_ASSOCIATION_RESENDING = False
PFCP_SESSION_ESTABLISHMENT_RESENDING = False
PFCP_SESSION_MODIFICATION_RESENDING = False
proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
proxy_socket.bind(("10.20.1.22", 8805))
while True:
data, address = proxy_socket.recvfrom(BUFFER_SIZE)
print(str(PFCP(data)))
執行並啟動SMF(config裡UPF IP記得修改為python程式的ip)後,可以看到他有收到資訊
而我們在PFCP(data)後面加.show()
可以看到PFCP完整的封包
修改UPF的config後
可以看到UPF回復的資訊
因此我們這邊可以看到SMF首先會先送一個request UPF會回覆一個response,因此我們這邊進行過濾與分析,分別將封包進行轉送這樣我們DAY13才能繼續下去抓取UE的註冊時PFCP的封包
while True:
data, address = proxy_socket.recvfrom(BUFFER_SIZE)
print(PFCP(data).show())
if str(PFCP(data)[0]) == "PFCP / PFCPAssociationSetupRequest":
proxy_socket.sendto(data, ("10.244.0.90", 8805))
if str(PFCP(data)[0]) == "PFCP / PFCPAssociationSetupResponse":
proxy_socket.sendto(data, ("10.244.0.88", 8805))
可以看到smf有成功註冊UPF而ip為PFCP程式的ip
day13會繼續往下做到抓取UE註冊時pdusession建立時的PFCP封包