Назад | Перейти на главную страницу

Добавить фильтр на основе имени сертификата клиента (OpenVPN)

Может ли кто-нибудь показать мне, как фильтровать (изменять пропускную способность, задержку и т. Д.) Одного или нескольких пользователей, подключающихся к OpenVPN, на основе имени их сертификата клиента?

Почему я хотел бы использовать имя клиентского сертификата, так это то, что у меня может быть 100 пользователей, подключающихся к OpenVPN, и я хотел бы индивидуально ограничить пропускную способность каждого клиента.

Большое спасибо

Вы можете использовать директивы client-connect <cmd> и client-disconnect <cmd>.

Переменная среды $common_name передается в сценарий, указанный в <cmd> и могут быть оценены для использования конкретных tc настройки для этого конкретного клиента следующим образом:

#!/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

Следующие переменные среды имеют значение:

  • $common_name: содержащий CN-имя клиента
  • $ifconfig_pool_remote_ip: содержащий удаленный IP-адрес vpn клиента
  • $dev: содержащий интерфейс tun

Подробную настройку можно найти в этот ответ.