-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup_firewall.sh
More file actions
114 lines (94 loc) · 5.31 KB
/
setup_firewall.sh
File metadata and controls
114 lines (94 loc) · 5.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/env bash
set -eu
# set -e остановка при любой ошибке
# set -u завершит скрипт с ошибкой при использовании неопределенной переменной (unset variable).
# предотвращает скрытые ошибки от опечаток или забытых инициализаций, заставляя явно проверять переменные
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
source "$SCRIPT_DIR/utils.sh"
FW_CONFIG="$SCRIPT_DIR/configs/firewall.conf"
setup_docker_support() {
local tool=$1
echo "----- Настройка специфики Docker для $tool -----"
if [ "$tool" == "ufw" ]; then
# 1. Разрешаем Forwarding (критично для Docker)
sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw
# 2. Разрешаем трафик с интерфейса Docker (docker0)
ufw route allow in on docker0
ufw route allow out on docker0
# 3. Дополнительно: Разрешаем трафик для всех подсетей Docker (для GitLab Runner).
# GitLab Runner создает динамические мосты (br-xxx), а не использует только docker0.
# Обычно Docker использует подсети из диапазона 172.16.0.0/12.
# Разрешаем маршрутизацию из этих подсетей в любую точку.
ufw route allow from 172.16.0.0/12 to any
ufw route allow from any to 172.16.0.0/12
elif [ "$tool" == "firewalld" ]; then
# Firewalld обычно работает через зоны
firewall-cmd --permanent --add-masquerade
# Добавляем docker0 в доверенные
firewall-cmd --permanent --zone=trusted --add-interface=docker0
# Для GitLab Runner и динамических сетей в firewalld сложнее заранее узнать имя интерфейса.
# Добавляем весь диапазон IP docker-сетей в trusted source.
firewall-cmd --permanent --zone=trusted --add-source=172.16.0.0/12
fi
}
setup_firewall() {
echo "----- Настройка файрвола -----"
local p_in p_out
while true; do
read -p "Входящий трафик (allow/a или deny/d) [deny]: " p_in
p_in=${p_in:-deny}
if POLICY_IN=$(validate_policy "$p_in"); then break; else echo "Ошибка: введите 'a' или 'd'"; fi
done
while true; do
read -p "Исходящий трафик (allow/a или deny/d) [allow]: " p_out
p_out=${p_out:-allow}
if POLICY_OUT=$(validate_policy "$p_out"); then break; else echo "Ошибка: введите 'a' или 'd'"; fi
done
NEW_SSH_PORT=$(get_current_ssh_port)
if command -v ufw >/dev/null 2>&1; then
FW_TOOL="ufw"
ufw --force reset
sed -i 's/-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT/-A ufw-before-input -p icmp --icmp-type echo-request -j DROP/' /etc/ufw/before.rules
ufw default "$POLICY_IN" incoming
ufw default "$POLICY_OUT" outgoing
ufw allow "$NEW_SSH_PORT/tcp"
if [ -n "${INSTALLED_DOCKER-}" ] && [ "$INSTALLED_DOCKER" == "true" ] || command -v docker >/dev/null 2>&1; then
setup_docker_support "ufw"
fi
elif command -v firewall-cmd >/dev/null 2>&1; then
FW_TOOL="firewalld"
systemctl start firewalld
firewall-cmd --permanent --add-icmp-block=echo-request
[ "$POLICY_IN" == "deny" ] && firewall-cmd --set-default-zone=drop || firewall-cmd --set-default-zone=public
firewall-cmd --permanent --add-port="$NEW_SSH_PORT/tcp"
if [ -n "${INSTALLED_DOCKER-}" ] && [ "$INSTALLED_DOCKER" == "true" ] || command -v docker >/dev/null 2>&1; then
setup_docker_support "firewalld"
fi
else
echo "Ошибка: Ни ufw, ни firewalld не найдены."
return 1
fi
if [ -f "$FW_CONFIG" ]; then
while IFS='|' read -r action direction port_proto || [ -n "$action" ]; do
[[ "$action" =~ ^#.* ]] || [ -z "$action" ] && continue
if [ "$FW_TOOL" == "ufw" ]; then
if [ "$direction" == "in" ]; then
ufw "$action" "$port_proto"
elif [ "$direction" == "out" ]; then
ufw "$action" out "$port_proto"
else
echo "Ошибка: Неверное direction: $direction"
continue
fi
else
[ "$direction" == "in" ] && [ "$action" == "allow" ] && firewall-cmd --permanent --add-port="$port_proto"
[ "$direction" == "out" ] && [ "$action" == "allow" ] && echo "Предупреждение: firewalld out rules требуют прямой настройки rich rules, пропущено: $port_proto"
fi
done < "$FW_CONFIG"
else
echo "Ошибка: Файл конфигурации $FW_CONFIG не найден."
fi
[ "$FW_TOOL" == "ufw" ] && ufw --force enable || firewall-cmd --reload
echo "Файрвол настроен (IN: $POLICY_IN, OUT: $POLICY_OUT)."
}
setup_firewall