Você pode usar as diretivas client-connect <cmd>
e client-disconnect <cmd>
.
Uma variável de ambiente $common_name
é passada para o script especificado em <cmd>
e pode ser avaliada para usar configurações específicas de tc
nesse cliente específico da seguinte forma:
#!/bin/bash
if [ "$common_name" == "client1" ]; then
downrate=100mbit
uprate=100mbit
elif [ "$common_name" == "client2" ]; then
downrate=10mbit
uprate=10mbit
else
downrate=10kbit
uprate=10kbit
fi
tc qdisc add dev "$dev" root handle 1: htb
tc qdisc add dev "$dev" handle ffff: ingress
# Limit traffic from VPN server to client
tc class add dev "$dev" parent 1: classid 1:1 htb rate "$downrate"
tc filter add dev "$dev" parent 1:0 protocol ip prio 1 \
u32 match ip dst "$ifconfig_pool_remote_ip"/32 flowid 1:1
# Limit traffic from client to VPN server
tc filter add dev "$dev" parent ffff:0 protocol ip prio 1 \
u32 match ip src "$ifconfig_pool_remote_ip"/32 \
police rate "$uprate" burst 80k drop flowid :1
As seguintes variáveis de ambiente são relevantes:
-
$common_name
: contendo o nome CN do cliente -
$ifconfig_pool_remote_ip
: contendo o cliente vpn IP remoto -
$dev
: contendo a interface do tun
Uma configuração detalhada pode ser encontrada em esta resposta .