(Postado como uma resposta separada, porque é muito para ser um comentário sobre a resposta de Khaled)
Enquanto o módulo statistic
funciona, as matemáticas estão aqui. A primeira regra é atingida com p=0.1
para qualquer pacote fornecido. A segunda regra corresponde a 10% dos restantes, por isso, atinge um total de p=0.1*0.9=0.09
. A terceira regra se aplica com p=0.1*0.9*0.9=0.081
e assim por diante. Para nove regras, há apenas uma probabilidade total de p=0.651
, portanto, o DROP
implícito corresponderia a um terço de todos os pacotes. Você pode tentar por si mesmo:
$ for n in 'seq 9'; do sudo iptables -A OUTPUT --dest 10.10.10.10 -m statistic --mode random --probability 0.1 -j ACCEPT; done
$ sudo iptables -A OUTPUT --dest 10.10.10.10 -j ACCEPT
$ sudo ping -c 1000 -i 0.001 -W 0.002 10.10.10.10
$ sudo iptables-save -c | grep 10.10.10.10
[103:8652] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[90:7560] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[73:6132] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[74:6216] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[73:6132] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[70:5880] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[44:3696] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[43:3612] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[50:4200] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[380:31920] -A OUTPUT -d 10.10.10.10/32 -j DROP
Você pode ver que a primeira regra corresponde a cerca de 10% dos pacotes e a probabilidade de uma correspondência cair na linha, enquanto a% final DROP
recebe muito mais do que deveria. Você pode ajustar suas probabilidades ou, mais fácil, usar o modo não probability
, mas nth
:
$ sudo iptables -F OUTPUT
$ for n in 'seq 10 -1 2'; do sudo iptables -A OUTPUT --dest 10.10.10.10 -m statistic --mode nth --every $n --packet 0 -j DROP; done
$ sudo iptables -A OUTPUT --dest 10.10.10.10 -j DROP
$ sudo ping -c 1000 -i 0.001 -W 0.002 10.10.10.10
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 10 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 9 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 8 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 7 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 6 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 5 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 4 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 3 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 2 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -j DROP