Automated L3 Leak Testing Framework for nftables (Network Sandbox Engine)

Atlas <[email protected]> Tue, 23 Jun 2026 10:04:42 +0000
Newsgroups gmane.comp.security.firewalls.netfilter.general
Message-ID <pikD6W611JTG_qlz6Ts6YIdjQP6gvHlm_iF--Wb1r5mImR-P7xB76IwUxdTbr2qPkVPqVkd01eUF4AfgqZAQMmO9sh7HogXaoGz7cJ7GpWU=@proton.me>
This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--------ad37fa301c9d7c9370a6972a510232decd40bcb9b0955cbaa7101e25b75bc9c5
Content-Type: multipart/mixed;boundary=---------------------a084fd41d3cb923cb48cd613eed26112

-----------------------a084fd41d3cb923cb48cd613eed26112
Content-Type: multipart/alternative;boundary=---------------------d9e82492d5d04786e90217ae8cf716d5

-----------------------d9e82492d5d04786e90217ae8cf716d5
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;charset=utf-8

Hi,
I am writing to share an open-source testing framework that heavily relies=
 on nftables and Linux network namespaces, which might be of interest to t=
hose working on automated firewall validation and proxy architectures.

While building a transparent proxy (TransparentTorProxy), I noticed a lack=
 of automated tools to empirically test L3/L4 cleartext leaks during proxy=
 teardown or daemon crashes (e.g., handling asynchronous TCP SYN retransmi=
ssions when a ruleset is flushed).

To solve this, I developed the Network Sandbox Engine (NSE). It dynamicall=
y spawns isolated network namespaces (ip netns), applies nftables rulesets=
, injects background traffic, and uses PCAP to verify the absence of leaks=
 during graceful teardowns.

To achieve a zero-leak teardown, the tool relies on a specific LIFO inject=
ion of reject with tcp reset rules applied just before flushing the tables=
, effectively clearing the kernel queues before the firewall goes down.

I thought this community might find the testing methodology-or the specifi=
c nftables state transition handling-useful for other proxying or containm=
ent projects.

The testing suite (and the resulting transparent proxy architecture) is av=
ailable here:=C2=A0https://github.com/onyks-os/NetworkSandboxEngine

Feedback on the nftables teardown logic or suggestions for further kernel-=
level hardening are highly appreciated.

Best regards,
onyks
-----------------------d9e82492d5d04786e90217ae8cf716d5
Content-Type: multipart/related;boundary=---------------------76cbb4169e0a0adc5d3c5228995578b2

-----------------------76cbb4169e0a0adc5d3c5228995578b2
Content-Type: text/html;charset=utf-8
Content-Transfer-Encoding: base64

PGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0
cHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+
SGksPC9zcGFuPjxkaXY+PGJyPjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJw
dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPkkgYW0gd3JpdGluZyB0byBzaGFyZSBhbiBvcGVuLXNv
dXJjZSB0ZXN0aW5nIGZyYW1ld29yayB0aGF0IGhlYXZpbHkgcmVsaWVzIG9uIG5mdGFibGVzIGFu
ZCBMaW51eCBuZXR3b3JrIG5hbWVzcGFjZXMsIHdoaWNoIG1pZ2h0IGJlIG9mIGludGVyZXN0IHRv
IHRob3NlIHdvcmtpbmcgb24gYXV0b21hdGVkIGZpcmV3YWxsIHZhbGlkYXRpb24gYW5kIHByb3h5
IGFyY2hpdGVjdHVyZXMuPC9zcGFuPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PHNwYW4gc3R5
bGU9ImZvbnQtc2l6ZTogMTJwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPldoaWxlIGJ1aWxkaW5n
IGEgdHJhbnNwYXJlbnQgcHJveHkgKDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0
OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29ueWtz
LW9zL1RyYW5zcGFyZW50VG9yUHJveHkiIHRpdGxlPSJUcmFuc3BhcmVudFRvclByb3h5Ij48c3Bh
biBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyI+VHJhbnNwYXJlbnRUb3JQcm94eTwvc3Bhbj48L2E+
PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7
Ij4pLCBJIG5vdGljZWQgYSBsYWNrIG9mIGF1dG9tYXRlZCB0b29scyB0byBlbXBpcmljYWxseSB0
ZXN0IEwzL0w0IGNsZWFydGV4dCBsZWFrcyBkdXJpbmcgcHJveHkgdGVhcmRvd24gb3IgZGFlbW9u
IGNyYXNoZXMgKGUuZy4sIGhhbmRsaW5nIGFzeW5jaHJvbm91cyBUQ1AgU1lOIHJldHJhbnNtaXNz
aW9ucyB3aGVuIGEgcnVsZXNldCBpcyBmbHVzaGVkKS48L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9k
aXY+PGRpdj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBsaW5lLWhlaWdodDogbm9ybWFs
OyI+VG8gc29sdmUgdGhpcywgSSBkZXZlbG9wZWQgdGhlIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9u
dC1zaXplOiAxMnB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PGEgaHJlZj0iaHR0cHM6Ly9naXRo
dWIuY29tL29ueWtzLW9zL05ldHdvcmtTYW5kYm94RW5naW5lIiB0aXRsZT0iTmV0d29yayBTYW5k
Ym94IEVuZ2luZSI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsiPk5ldHdvcmsgU2FuZGJv
eCBFbmdpbmU8L3NwYW4+PC9hPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBs
aW5lLWhlaWdodDogbm9ybWFsOyI+IChOU0UpLiBJdCBkeW5hbWljYWxseSBzcGF3bnMgaXNvbGF0
ZWQgbmV0d29yayBuYW1lc3BhY2VzIChpcCBuZXRucyksIGFwcGxpZXMgbmZ0YWJsZXMgcnVsZXNl
dHMsIGluamVjdHMgYmFja2dyb3VuZCB0cmFmZmljLCBhbmQgdXNlcyBQQ0FQIHRvIHZlcmlmeSB0
aGUgYWJzZW5jZSBvZiBsZWFrcyBkdXJpbmcgZ3JhY2VmdWwgdGVhcmRvd25zLjwvc3Bhbj48L2Rp
dj48ZGl2Pjxicj48L2Rpdj48ZGl2PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGxpbmUt
aGVpZ2h0OiBub3JtYWw7Ij5UbyBhY2hpZXZlIGEgemVyby1sZWFrIHRlYXJkb3duLCB0aGUgdG9v
bCByZWxpZXMgb24gYSBzcGVjaWZpYyBMSUZPIGluamVjdGlvbiBvZiByZWplY3Qgd2l0aCB0Y3Ag
cmVzZXQgcnVsZXMgYXBwbGllZCBqdXN0IGJlZm9yZSBmbHVzaGluZyB0aGUgdGFibGVzLCBlZmZl
Y3RpdmVseSBjbGVhcmluZyB0aGUga2VybmVsIHF1ZXVlcyBiZWZvcmUgdGhlIGZpcmV3YWxsIGdv
ZXMgZG93bi48L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iZm9u
dC1zaXplOiAxMnB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+SSB0aG91Z2h0IHRoaXMgY29tbXVu
aXR5IG1pZ2h0IGZpbmQgdGhlIHRlc3RpbmcgbWV0aG9kb2xvZ3ktb3IgdGhlIHNwZWNpZmljIG5m
dGFibGVzIHN0YXRlIHRyYW5zaXRpb24gaGFuZGxpbmctdXNlZnVsIGZvciBvdGhlciBwcm94eWlu
ZyBvciBjb250YWlubWVudCBwcm9qZWN0cy48L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp
dj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+VGhl
IHRlc3Rpbmcgc3VpdGUgKGFuZCB0aGUgcmVzdWx0aW5nIHRyYW5zcGFyZW50IHByb3h5IGFyY2hp
dGVjdHVyZSkgaXMgYXZhaWxhYmxlIGhlcmU6Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250
LXNpemU6IDEycHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3Bhbj48YSB0YXJnZXQ9Il9ibGFu
ayIgcmVsPSJub3JlZmVycmVyIG5vZm9sbG93IG5vb3BlbmVyIiBocmVmPSJodHRwczovL2dpdGh1
Yi5jb20vb255a3Mtb3MvTmV0d29ya1NhbmRib3hFbmdpbmUiPjxzcGFuIHN0eWxlPSJmb250LXNp
emU6IDEycHQ7Ij5odHRwczovL2dpdGh1Yi5jb20vb255a3Mtb3MvTmV0d29ya1NhbmRib3hFbmdp
bmU8L3NwYW4+PC9hPjwvc3Bhbj48L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48c3Bh
biBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+RmVlZGJhY2sg
b24gdGhlIG5mdGFibGVzIHRlYXJkb3duIGxvZ2ljIG9yIHN1Z2dlc3Rpb25zIGZvciBmdXJ0aGVy
IGtlcm5lbC1sZXZlbCBoYXJkZW5pbmcgYXJlIGhpZ2hseSBhcHByZWNpYXRlZC48L3NwYW4+PC9k
aXY+PGRpdj48YnI+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBsaW5l
LWhlaWdodDogbm9ybWFsOyI+QmVzdCByZWdhcmRzLDwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuIHN0
eWxlPSJmb250LXNpemU6IDEycHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij5vbnlrczwvc3Bhbj48
L2Rpdj48L2Rpdj48ZGl2IHN0eWxlPSJmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7IGZv
bnQtc2l6ZTogMTRweDsiIGNsYXNzPSJwcm90b25tYWlsX3NpZ25hdHVyZV9ibG9jayI+CjwvZGl2
Pgo=
-----------------------76cbb4169e0a0adc5d3c5228995578b2--
-----------------------d9e82492d5d04786e90217ae8cf716d5--
-----------------------a084fd41d3cb923cb48cd613eed26112
Content-Type: application/pgp-keys; filename="publickey - [email protected] - 0x1F67851E.asc"; name="publickey - [email protected] - 0x1F67851E.asc"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="publickey - [email protected] - 0x1F67851E.asc"; name="publickey - [email protected] - 0x1F67851E.asc"

LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCgp4ak1FYWNLOWt4WUpLd1lCQkFI
YVJ3OEJBUWRBajNYeDd2azNiWnBrMmF2b1dqWnlNUDRGMXF3aDVzYVAKbkYvUll0MUFvb1hOS1dG
MGJHRnpMV2RwZEVCd2NtOTBiMjR1YldVZ1BHRjBiR0Z6TFdkcGRFQndjbTkwCmIyNHViV1Urd3NB
UkJCTVdDZ0NEQllKcHdyMlRBd3NKQndrUW8zR1pBTnJmbjVoRkZBQUFBQUFBSEFBZwpjMkZzZEVC
dWIzUmhkR2x2Ym5NdWIzQmxibkJuY0dwekxtOXlaeUc5N0pHOTVxQXRpRFY2dkdMdkp5TUUKVzFX
V0J6eHkyaWdqazhFNTloTlJBeFVLQ0FRV0FBSUJBaGtCQXBzREFoNEJGaUVFSDJlRkhqQWljQnlr
CjhlMlpvM0daQU5yZm41Z0FBSVZMQVFDVHZhTzdtdHZRbTBGM2RhUDBhSlpabFFTeUF5STU3eDZt
ZlQzdgpqVkNsbndFQTRLeW9EWXhPMFF0dVAwaDVGSTk1MEtMTlkxWlpzN3J0RnBsN3dsRXc2d1BP
T0FScHdyMlQKRWdvckJnRUVBWmRWQVFVQkFRZEF3dkRnbGdIckR5SnQrcnR3KzFHV0VJdndUVHo3
eW8xemFyRkVPMVJvClR4Z0RBUWdId3I0RUdCWUtBSEFGZ21uQ3ZaTUpFS054bVFEYTM1K1lSUlFB
QUFBQUFCd0FJSE5oYkhSQQpibTkwWVhScGIyNXpMbTl3Wlc1d1ozQnFjeTV2Y21kVnFTaHFyRThp
QVpqbUt0SVpQSThyWmVHa01hL0kKdjhRTmtKT2x1aWVudXdLYkRCWWhCQjluaFI0d0luQWNwUEh0
bWFOeG1RRGEzNStZQUFBS0t3RCtOdit3CmZPRTE5N1VXQW9mbjZwcDJFL2N6emxQbjY3TmRGcytO
QnNhbmdjc0EvUnFUMDJIUlgvMGpFZUoxZndNMwpQUUZGby9od3d2RHBTYUJ1UXNjZXRYSUEKPVdU
bnQKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQo=
-----------------------a084fd41d3cb923cb48cd613eed26112--

--------ad37fa301c9d7c9370a6972a510232decd40bcb9b0955cbaa7101e25b75bc9c5
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: ProtonMail

wroEARYKAG0Fgmo6WiwJEKNxmQDa35+YRRQAAAAAABwAIHNhbHRAbm90YXRp
b25zLm9wZW5wZ3Bqcy5vcmfNoVLc9Tlka/yZ9PPhSdojpPplq6eYy8fbaxf8
dlDFtxYhBB9nhR4wInAcpPHtmaNxmQDa35+YAABkhgD4zKVJRIX9KZs6USgP
0uVme6Pr9qKAdssMNx57n9t0eAEA3qBt3QI5AB6zFZ3ahce8aEMkYyw+Kek8
LbWYXQ0P+wg=
=/K31
-----END PGP SIGNATURE-----


--------ad37fa301c9d7c9370a6972a510232decd40bcb9b0955cbaa7101e25b75bc9c5--