Em geral, ifup
/ ifdown
não garante que seu script seja executado apenas uma vez. Assim, seu script tem que ser idempotente; isto é, contém sua própria lógica para não estabelecer um túnel que já existe. A melhor maneira, é claro, é iniciar o script verificando se o túnel já está lá:
# Exit if network device "tun0" exists.
ip link show dev tun0 >/dev/null 2>&1 && exit 0
Além disso, os scripts em if-up.d
etc. são executados para cada interface criada.
Como Jeff observa corretamente, os scripts if-*.d
não recebem argumentos especificando, e. qual interface está chegando.
Em vez disso, na página de manual interfaces (5) :
There exists for each of the above mentioned options a directory
/etc/network/if-<option>.d/ [...]
All of these commands have access to the following environment vari‐
ables.
IFACE physical name of the interface being processed
LOGICAL
logical name of the interface being processed
[... and more ...]
A solução é iniciar o script com uma verificação do valor correto de IFACE
, por exemplo:
# Exit if we're not starting "eth0".
[ "$IFACE" = 'eth0' ] || exit 0
Caso contrário, o script será executado para todos os dispositivos de rede, incluindo lo
, quando poderá ser muito cedo para estabelecer um túnel.