#!/usr/bin/env python3 """Minimal NFQUEUE example: randomly drop packets by percentage.""" import random import signal import sys from netfilterqueue import NetfilterQueue DEFAULT_LOSS_PERCENT = 10.0 nfq = NetfilterQueue() loss_percent = DEFAULT_LOSS_PERCENT def _handle_packet(packet) -> None: if random.random() < (loss_percent / 100.0): packet.drop() return packet.accept() def _stop(_sig, _frame) -> None: raise SystemExit(0) def main() -> int: global loss_percent if len(sys.argv) not in (2, 3): print("Usage: packet_loss.py [loss_percent]", file=sys.stderr) return 1 try: qnum = int(sys.argv[1]) except ValueError: print("qnum must be an integer", file=sys.stderr) return 1 if len(sys.argv) == 3: try: loss_percent = float(sys.argv[2]) except ValueError: print("loss_percent must be a number between 0 and 100", file=sys.stderr) return 1 if not 0.0 <= loss_percent <= 100.0: print("loss_percent must be between 0 and 100", file=sys.stderr) return 1 signal.signal(signal.SIGINT, _stop) signal.signal(signal.SIGTERM, _stop) nfq.bind(qnum, _handle_packet) try: nfq.run() except KeyboardInterrupt: pass finally: nfq.unbind() return 0 if __name__ == "__main__": raise SystemExit(main())