eocanha

bandwidth-limit

Mar 4th, 2021
60
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/bash
  2.  
  3. # Script to dynamically restrict the bandwidth of an ethernet host when
  4. # sharing the wifi internet connection.
  5. # See: http://markmaunder.com/2011/01/26/how-to-reliably-limit-the-amount-of-bandwidth-your-room-mate-or-bad-office-colleague-uses/
  6.  
  7. if [ "$UID" != "0" ]
  8. then
  9.  CMD=`which $0`
  10.  sudo "$CMD"
  11.  exit $?
  12. fi
  13.  
  14. # Device we want to restrict
  15. BOX_IP=10.43.0.180
  16.  
  17. HIGH_BW=2Gbit
  18. LOW_BW=500Kbit
  19. BANDWIDTH=${HIGH_BW}
  20.  
  21. # Old systems use eth0/wlan0. Modern systems use those unpredictable enp0s31f6 and wlp0s20f3 names.
  22. ETH0=$(/sbin/ifconfig -a | grep '^enp' | sed 's/[: ].*$//' | head -n 1)
  23. ETH1=$(/sbin/ifconfig -a | grep '^enx' | sed 's/[: ].*$//' | head -n 1)
  24. WLAN0=$(/sbin/ifconfig -a | grep '^w' | sed 's/[: ].*$//' | head -n 1)
  25.  
  26. # sh function to be used with trap
  27. ctrl_c() {
  28.  # Delete old rules
  29.  tc filter delete dev ${ETH1}
  30.  exit 0
  31. }
  32.  
  33. function manual() {
  34.  read -e -p "Enter limit bandwidth in kbps (empty to exit): " -i "${BANDWIDTH}" BANDWIDTH
  35.  
  36.  if [ -z "${BANDWIDTH}" ]                                                                                                                                                                                                                                                    
  37.  then                                                                                                                                                                                                                                                                        
  38.   tc qdisc del dev ${ETH1} root handle 1: cbq avpkt 1000 bandwidth 100mbit                                                                                                                                                                                                    
  39.   break                                                                                                                                                                                                                                                                      
  40.  fi                                                                                                                                                                                                                                                                          
  41.                                                                                                                                                                                                                                                                              
  42.  if [[ "${BANDWIDTH}" =~ ^[0-9]*$ ]]                                                                                                                                                                                                                                          
  43.  then                                                                                                                                                                                                                                                                        
  44.   BANDWIDTH="${BANDWIDTH}kbit"
  45.  fi
  46. }
  47.  
  48. function auto() {
  49.  if [ "${BANDWIDTH}" == "${HIGH_BW}" ]
  50.  then
  51.   BANDWIDTH="${LOW_BW}"
  52.  else
  53.   BANDWIDTH="${HIGH_BW}"
  54.  fi
  55.  
  56.  read -e -p "Enter to change to ${BANDWIDTH}"
  57. }
  58.  
  59. if [ "$(cat /proc/sys/net/ipv4/ip_forward)" != "1" ]
  60. then
  61.  echo "Enable wifi -> ethernet Internet connection sharing before applying bandwidth limits"
  62. fi
  63.  
  64. # Prepare for ^C
  65. trap ctrl_c INT
  66.  
  67. # Delete old rules
  68. tc filter delete dev ${ETH1}
  69.  
  70. tc qdisc add dev ${ETH1} root handle 1: cbq \
  71.  avpkt 1000 bandwidth ${BANDWIDTH}
  72.  
  73. tc class add dev ${ETH1} parent 1: classid 1:1 cbq \
  74.  rate ${BANDWIDTH} allot 1500 prio 5 bounded isolated
  75.  
  76. while true
  77. do
  78.  BANDWIDTH="$(tc class list dev ${ETH1} parent 1: classid 1:1 | { read _ _ _ _ _ _ X _; echo $X; })"
  79.  IP="$(tc -p filter list dev ${ETH1} parent 1: | grep src | { read _ _ _ X; echo $X; } | sed 's#/.*$##')"
  80.  
  81.  if [ -z "${IP}" ]
  82.  then
  83.   IP=${BOX_IP}
  84.  
  85.   tc filter add dev ${ETH1} parent 1: protocol ip \
  86.    prio 16 u32 match ip dst ${IP} flowid 1:1
  87.  
  88.   tc filter add dev ${ETH1} parent 1: protocol ip \
  89.    prio 16 u32 match ip src ${IP} flowid 1:1
  90.  
  91.   IP="$(tc -p filter list dev ${ETH1} parent 1: | grep src | { read _ _ _ X; echo $X; } | sed 's#/.*$##')"
  92.  fi
  93.  
  94.  echo "Bandwidth: ${BANDWIDTH}"
  95.  echo "Filtered IP: ${IP}"
  96.  echo
  97.  
  98.  #manual
  99.  auto
  100.  
  101.  tc class change dev ${ETH1} parent 1: classid 1:1 cbq \
  102.   rate "${BANDWIDTH}" allot 1500 prio 5 bounded isolated
  103. done
  104.  
  105. # Delete old rules
  106. tc filter delete dev ${ETH1}
  107.  
  108. exit 0
RAW Paste Data