目的達成のためにはかなりトリッキーなことをする必要がありそうです。
例えば、netcatで送信元IPアドレスを自身で管理していないIPアドレスで送信しようとするとエラーが発生します。
bash
1$ nc -u -s 192.168.1.1 8.8.8.8 53
2nc: bind failed: Cannot assign requested address
※ 192.168.1.1は私の家のルータのアドレス。
ソースコードを見ると、bind関数(syscallの薄いラッパーの認識)がエラーを返しています。
https://github.com/openbsd/src/blob/aeddc3fc1c2dc619781d7d37222447f40fb248a7/usr.bin/nc/netcat.c#L977
RAWパケットを扱うpingもbindで失敗します。
$ ping -I192.168.1.1 1.1.1.1
ping: bind: Cannot assign requested address
https://github.com/iputils/iputils/blob/2917e0e31dd799c9a3bf931f86b3e62452a4e217/ping/ping.c#L821
socket APIを利用しての実装は厳しそうなので、それより下位層(ethernet層など)での実装が必要になりそうです。
Linuxであれば、XDP (eBPF関連の技術)でパケット書き換えが実現できそうです。
XDPでPacket Rewriting – MySQLのポートを書き換える
上記記事ではポートを書き換えていますが、ポートの代わりに送信元IPアドレスを書き換えれば目的は達成できるのではと考えています。