Besides usb-vhci as mentioned by @tyler-hall there's also usbip which was designed for accessing usb devices over the network. As the "user" of the device doesn't care if the device side is real or virtual, this architecture allows almost the same options for simulating usb devices. The rust library usbip-device was explicitly written for this use case