-
-
Save diegargon/414dd5511e7d0bd32ef79a1556312729 to your computer and use it in GitHub Desktop.
QoS Ubuntu Script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Diego García Gonzalez (diegargon) diego@envigo.net | |
# v1.0 | |
### BEGIN INIT INFO | |
# Provides: myQoS | |
# Required-Start: networking, myFirewall | |
# Required-Stop: | |
# Should-Start: | |
# Should-Stop: | |
# Default-Start: 2 3 4 5 | |
# Default-Stop: 0 1 6 | |
# Short-Description: Start and Stop | |
# Description: | |
### END INIT INFO | |
#CONFIG START | |
DEBUG=0 | |
FLUSH_MANGLE=1 | |
RULE_RETURN=1 | |
DOWN_SPEED=1600 #200mb | |
UP_SPEED=152 #19mb | |
# mbit kbit | |
UNIT=mbit | |
EXT_IF=enp1s10 | |
INT_IF=enp1s8 | |
#CONFIG END | |
if [ $DEBUG = 1 ]; then | |
echo "********* ALERT: QoS in debug mode, rules not active *********" | |
IPTABLES="echo" | |
TC="echo" | |
else | |
TC=`which tc` | |
IPTABLES=`which iptables` | |
fi | |
clear_qos() { | |
if [ $FLUSH_MANGLE = 1 ]; then | |
echo "Flushing mangle..." | |
$IPTABLES -F -t mangle | |
fi | |
ITS_SET=`$TC -s class show dev $EXT_IF` | |
if [ ! -z "$ITS_SET" ]; then | |
echo "Cleaning QoS rules" | |
$TC qdisc del dev $EXT_IF root | |
fi | |
} | |
classify() { | |
$TC filter add dev $EXT_IF parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10 | |
$TC filter add dev $EXT_IF parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11 | |
$TC filter add dev $EXT_IF parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12 | |
$TC filter add dev $EXT_IF parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13 | |
#$TC filter add dev $EXT_IF parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14 | |
#$TC filter add dev $EXT_IF parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15 | |
return 0 | |
} | |
add_rules() { | |
ADD_MANGLE="$IPTABLES -t mangle" | |
ADD_MANGLE_PRE="$ADD_MANGLE -A PREROUTING" | |
ADD_MANGLE_OUT="$ADD_MANGLE -A OUTPUT" | |
#ADD_MANGLE_INP="$ADD_MANGLE -A INPUT" | |
### TOS | |
$ADD_MANGLE_PRE -m tos --tos Minimize-Delay -j MARK --set-mark 0x1 | |
$ADD_MANGLE_OUT -m tos --tos Minimize-Delay -j MARK --set-mark 0x1 | |
if [ $RULE_RETURN = 1 ]; then | |
$ADD_MANGLE_PRE -m tos --tos Minimize-Delay -j RETURN | |
$ADD_MANGLE_OUT -m tos --tos Minimize-Delay -j RETURN | |
fi | |
$ADD_MANGLE_PRE -m tos --tos Minimize-Cost -j MARK --set-mark 0x2 | |
$ADD_MANGLE_OUT -m tos --tos Minimize-Cost -j MARK --set-mark 0x2 | |
if [ $RULE_RETURN = 1 ]; then | |
$ADD_MANGLE_PRE -m tos --tos Minimize-Cost -j RETURN | |
$ADD_MANGLE_OUT -m tos --tos Minimize-Cost -j RETURN | |
fi | |
$ADD_MANGLE_PRE -m tos --tos Maximize-Throughput -j MARK --set-mark 0x4 | |
$ADD_MANGLE_OUT -m tos --tos Maximize-Throughput -j MARK --set-mark 0x4 | |
if [ $RULE_RETURN = 1 ]; then | |
$ADD_MANGLE_PRE -m tos --tos Maximize-Throughput -j RETURN | |
$ADD_MANGLE_OUT -m tos --tos Maximize-Throughput -j RETURN | |
fi | |
### ICMP | |
$ADD_MANGLE_PRE -p icmp -j MARK --set-mark 0x1 | |
$ADD_MANGLE_OUT -p icmp -j MARK --set-mark 0x1 | |
if [ $RULE_RETURN = 1 ]; then | |
$ADD_MANGLE_PRE -p icmp -j RETURN | |
$ADD_MANGLE_OUT -p icmp -j RETURN | |
fi | |
### SSH | |
$ADD_MANGLE_PRE -p tcp -m tcp --dport 22 -j MARK --set-mark 0x1 | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1 | |
$ADD_MANGLE_OUT -p tcp -m tcp --dport 22 -j MARK --set-mark 0x1 | |
if [ $RULE_RETURN = 1 ]; then | |
$ADD_MANGLE_PRE -p tcp -m tcp --dport 22 -j RETURN | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 22 -j RETURN | |
$ADD_MANGLE_OUT -p tcp -m tcp --dport 22 -j RETURN | |
fi | |
### SYNC,RST,ACK | |
$ADD_MANGLE -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1 | |
$ADD_MANGLE -I OUTPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1 | |
if [ $RULE_RETURN = 1 ]; then | |
$ADD_MANGLE -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN | |
$ADD_MANGLE -I OUTPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN | |
fi | |
### WEB Traffic | |
# Internal Traffic | |
$ADD_MANGLE_PRE -p tcp -m tcp --dport 443 -j MARK --set-mark 0x2 | |
$ADD_MANGLE_PRE -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2 | |
# Server Traffic (rare but i add) | |
$ADD_MANGLE_OUT -p tcp -m tcp --dport 443 -j MARK --set-mark 0x2 | |
$ADD_MANGLE_OUT -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2 | |
# Webserver | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 443 -j MARK --set-mark 0x2 | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 80 -j MARK --set-mark 0x2 | |
if [ $RULE_RETURN = 1 ]; then | |
# Internal traffic | |
$ADD_MANGLE_PRE -p tcp -m tcp --dport 443 -j RETURN | |
$ADD_MANGLE_PRE -p tcp -m tcp --dport 80 -j RETURN | |
# Server Trafic | |
$ADD_MANGLE_OUT -p tcp -m tcp --dport 443 -j RETURN | |
$ADD_MANGLE_OUT -p tcp -m tcp --dport 80 -j RETURN | |
# Webserver | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 443 -j RETURN | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 443 -j RETURN | |
fi | |
### DNS SERVER TCP | |
$ADD_MANGLE_PRE -p tcp -m tcp --dport 53 -j MARK --set-mark 0x1 | |
$ADD_MANGLE_OUT -p tcp -m tcp --dport 53 -j MARK --set-mark 0x1 | |
if [ $RULE_RETURN = 1 ]; then | |
$ADD_MANGLE_PRE -p tcp -m tcp --dport 53 -j RETURN | |
$ADD_MANGLE_OUT -p tcp -m tcp --dport 53 -j RETURN | |
fi | |
### ALL UDP, include DNS | |
$ADD_MANGLE_PRE -p udp -j MARK --set-mark 0x1 | |
$ADD_MANGLE_OUT -p udp -j MARK --set-mark 0x1 | |
if [ $RULE_RETURN = 1 ]; then | |
$ADD_MANGLE_PRE -p udp -j RETURN | |
$ADD_MANGLE_OUT -p udp -j RETURN | |
fi | |
### Other Server Services to #3 | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 25 -j MARK --set-mark 0x3 | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 110 -j MARK --set-mark 0x3 | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 587 -j MARK --set-mark 0x3 | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 993 -j MARK --set-mark 0x3 | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 995 -j MARK --set-mark 0x3 | |
if [ $RULE_RETURN = 1 ]; then | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 25 -j RETURN | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 110 -j RETURN | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 587 -j RETURN | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 993 -j RETURN | |
$ADD_MANGLE_OUT -p tcp -m tcp --sport 995 -j RETURN | |
fi | |
} | |
do_start() { | |
$TC qdisc add dev $EXT_IF root handle 1: htb default 13 | |
$TC class add dev $EXT_IF parent 1: classid 1:1 htb rate ${UP_SPEED}${UNIT} ceil ${UP_SPEED}${UNIT} | |
$TC class add dev $EXT_IF parent 1:1 classid 1:10 htb rate $(( UP_SPEED / 4 ))${UNIT} ceil ${UP_SPEED}${UNIT} prio 0 | |
$TC class add dev $EXT_IF parent 1:1 classid 1:11 htb rate $(( UP_SPEED / 4 ))${UNIT} ceil ${UP_SPEED}${UNIT} prio 1 | |
$TC class add dev $EXT_IF parent 1:1 classid 1:12 htb rate $(( UP_SPEED / 4 ))${UNIT} ceil ${UP_SPEED}${UNIT} prio 2 | |
$TC class add dev $EXT_IF parent 1:1 classid 1:13 htb rate $(( UP_SPEED / 4 ))${UNIT} ceil ${UP_SPEED}${UNIT} prio 3 | |
#$TC class add dev $EXT_IF parent 1:1 classid 1:14 htb rate $(( UP_SPEED / 5 ))${UNIT} ceil ${UP_SPEED}${UNIT} prio 3 | |
#$TC class add dev $EXT_IF parent 1:1 classid 1:15 htb rate $(( UP_SPEED / 6 ))${UNIT} ceil ${UP_SPEED}${UNIT} prio 3 | |
$TC qdisc add dev $EXT_IF parent 1:11 handle 110: sfq perturb 10 | |
$TC qdisc add dev $EXT_IF parent 1:12 handle 120: sfq perturb 10 | |
$TC qdisc add dev $EXT_IF parent 1:13 handle 130: sfq perturb 10 | |
#$TC qdisc add dev $EXT_IF parent 1:14 handle 140: sfq perturb 10 | |
#$TC qdisc add dev $EXT_IF parent 1:15 handle 150: sfq perturb 10 | |
classify | |
add_rules | |
return 0 | |
} | |
do_stop() { | |
clear_qos | |
return 0 | |
} | |
case "$1" in | |
start) | |
do_start | |
;; | |
stop) | |
do_stop | |
;; | |
restart) | |
do_stop | |
do_start | |
;; | |
status) | |
exit 0 | |
;; | |
*) | |
echo "Usage: /etc/init.d/QoS {start|stop|restart} " | |
;; | |
esac | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment