Загрузить файлы в «/»
This commit is contained in:
47
find_max.cpp
Normal file
47
find_max.cpp
Normal file
@@ -0,0 +1,47 @@
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
setlocale(0, "");
|
||||
int n;
|
||||
cout << "Введите размер массива n: ";
|
||||
cin >> n;
|
||||
|
||||
if (n <= 0) {
|
||||
cout << "n должно быть положительным" << endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int *arr = new int[n];
|
||||
|
||||
srand(static_cast<unsigned int>(time(0)));
|
||||
for (int i = 0; i < n; ++i) {
|
||||
arr[i] = rand() % 61 - 30; // значения в диапазоне [-30; 30]
|
||||
}
|
||||
|
||||
cout << "Array:\n";
|
||||
for (int i = 0; i < n; ++i) {
|
||||
cout.width(4);
|
||||
cout << arr[i];
|
||||
if ((i + 1) % 10 == 0) cout << endl;
|
||||
}
|
||||
if (n % 10 != 0) cout << endl;
|
||||
|
||||
int maxValue = arr[0];
|
||||
int indexMax = 0;
|
||||
for (int i = 1; i < n; ++i) {
|
||||
if (arr[i] > maxValue) {
|
||||
maxValue = arr[i];
|
||||
indexMax = i;
|
||||
}
|
||||
}
|
||||
|
||||
cout << "max: " << maxValue << " index: " << indexMax << endl;
|
||||
|
||||
delete[] arr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
150
funny_test.cpp
Normal file
150
funny_test.cpp
Normal file
@@ -0,0 +1,150 @@
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
setlocale(0, "");
|
||||
int correct = 0;
|
||||
int answer;
|
||||
|
||||
cout << "=== ЖАРТiВЛИВИЙ ТЕСТ: ПЕРЕВiР СВОЇ МОЖЛИВОСТi ===" << endl;
|
||||
cout << "Вiдповiдай на 7 питань. Удачi!" << endl << endl;
|
||||
|
||||
// Question 1
|
||||
cout << "1) Професор лiг спати о 8 годинi, а встав о 9 годинi. Скiльки годин проспав професор?" << endl;
|
||||
cout << "Твоя вiдповiдь: ";
|
||||
cin >> answer;
|
||||
switch (answer) {
|
||||
case 1:
|
||||
cout << "Правильно!" << endl;
|
||||
correct++;
|
||||
break;
|
||||
default:
|
||||
cout << "Неправильно! Правильна вiдповiдь: 1 година." << endl;
|
||||
break;
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
// Question 2
|
||||
cout << "2) На двох руках десять пальцiв. Скiльки пальцiв на 10 руках?" << endl;
|
||||
cout << "Твоя вiдповiдь: ";
|
||||
cin >> answer;
|
||||
switch (answer) {
|
||||
case 50:
|
||||
cout << "Правильно!" << endl;
|
||||
correct++;
|
||||
break;
|
||||
default:
|
||||
cout << "Неправильно! Правильна вiдповiдь: 50 пальцiв." << endl;
|
||||
break;
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
|
||||
|
||||
// Question 3
|
||||
cout << "3) Скiльки цифр у дюжинi?" << endl;
|
||||
cout << "Твоя вiдповiдь: ";
|
||||
cin >> answer;
|
||||
switch (answer) {
|
||||
case 2:
|
||||
cout << "Правильно!" << endl;
|
||||
correct++;
|
||||
break;
|
||||
default:
|
||||
cout << "Неправильно! Правильна вiдповiдь: 2 цифри (1 i 2)." << endl;
|
||||
break;
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
// Question 4
|
||||
cout << "4) Скiльки потрiбно зробити розпилiв, щоб розпиляти колоду на 12 частин?" << endl;
|
||||
cout << "Твоя вiдповiдь: ";
|
||||
cin >> answer;
|
||||
switch (answer) {
|
||||
case 11:
|
||||
cout << "Правильно!" << endl;
|
||||
correct++;
|
||||
break;
|
||||
default:
|
||||
cout << "Неправильно! Правильна вiдповiдь: 11 розпилiв." << endl;
|
||||
break;
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
// Question 5
|
||||
cout << "5) Лiкар зробив три уколи в iнтервалi 30 хвилин. Скiльки часу вiн витратив?" << endl;
|
||||
cout << "Твоя вiдповiдь: ";
|
||||
cin >> answer;
|
||||
switch (answer) {
|
||||
case 30:
|
||||
cout << "Правильно!" << endl;
|
||||
correct++;
|
||||
break;
|
||||
default:
|
||||
cout << "Неправильно! Правильна вiдповiдь: 30 хвилин." << endl;
|
||||
break;
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
// Question 6
|
||||
cout << "6) Скiльки цифр 9 в iнтервалi 1-100?" << endl;
|
||||
cout << "Твоя вiдповiдь: ";
|
||||
cin >> answer;
|
||||
switch (answer) {
|
||||
case 1:
|
||||
cout << "Правильно!" << endl;
|
||||
correct++;
|
||||
break;
|
||||
default:
|
||||
cout << "Неправильно! Правильна вiдповiдь: 1 (тiльки число 9)." << endl;
|
||||
break;
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
// Question 7
|
||||
cout << "7) Пастух мав 30 овець. Усi, крiм однiєї, розбiглися. Скiльки овець лишилося?" << endl;
|
||||
cout << "Твоя вiдповiдь: ";
|
||||
cin >> answer;
|
||||
switch (answer) {
|
||||
case 1:
|
||||
cout << "Правильно!" << endl;
|
||||
correct++;
|
||||
break;
|
||||
default:
|
||||
cout << "Неправильно! Правильна вiдповiдь: 1 вiвця." << endl;
|
||||
break;
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
// Results
|
||||
cout << "=== РЕЗУЛЬТАТИ ===" << endl;
|
||||
cout << "Правильних вiдповiдей: " << correct << " з 7" << endl;
|
||||
|
||||
switch (correct) {
|
||||
case 7:
|
||||
cout << "ГЕНIЙ!" << endl;
|
||||
break;
|
||||
case 6:
|
||||
cout << "ЕРУДИТ!" << endl;
|
||||
break;
|
||||
case 5:
|
||||
cout << "НОРМАЛЬНИЙ!" << endl;
|
||||
break;
|
||||
case 4:
|
||||
cout << "ЗДIБНОСТI СЕРЕДНI!" << endl;
|
||||
break;
|
||||
case 3:
|
||||
cout << "ЗДIБНОСТI НИЖЧЕ СЕРЕДНЬОГО!" << endl;
|
||||
break;
|
||||
case 2:
|
||||
case 1:
|
||||
case 0:
|
||||
cout << "ВАМ ТРЕБА ВIДПОЧИТИ!" << endl;
|
||||
break;
|
||||
default:
|
||||
cout << "Помилка в пiдрахунку!" << endl;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
40
lucky_number.cpp
Normal file
40
lucky_number.cpp
Normal file
@@ -0,0 +1,40 @@
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int number;
|
||||
|
||||
cout << "Enter a 6-digit number: ";
|
||||
cin >> number;
|
||||
|
||||
// Check if the number is 6-digit (from 100000 to 999999)
|
||||
if (number < 100000 || number > 999999) {
|
||||
cout << "Error! Please enter exactly a 6-digit number (from 100000 to 999999)" << endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Extract digits separately
|
||||
int digit1 = number / 100000; // first digit
|
||||
int digit2 = (number / 10000) % 10; // second digit
|
||||
int digit3 = (number / 1000) % 10; // third digit
|
||||
int digit4 = (number / 100) % 10; // fourth digit
|
||||
int digit5 = (number / 10) % 10; // fifth digit
|
||||
int digit6 = number % 10; // sixth digit
|
||||
|
||||
// Calculate sums
|
||||
int sum_first_three = digit1 + digit2 + digit3;
|
||||
int sum_last_three = digit4 + digit5 + digit6;
|
||||
|
||||
// Check if lucky
|
||||
if (sum_first_three == sum_last_three) {
|
||||
cout << "Congratulations! Number " << number << " is lucky!" << endl;
|
||||
cout << "Sum of first three digits: " << sum_first_three << endl;
|
||||
cout << "Sum of last three digits: " << sum_last_three << endl;
|
||||
} else {
|
||||
cout << "Number " << number << " is not lucky." << endl;
|
||||
cout << "Sum of first three digits: " << sum_first_three << endl;
|
||||
cout << "Sum of last three digits: " << sum_last_three << endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
85
mult.cpp
Normal file
85
mult.cpp
Normal file
@@ -0,0 +1,85 @@
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int l;
|
||||
int q;
|
||||
int c = 0;
|
||||
|
||||
srand(time(0));
|
||||
|
||||
cout << "=== ПЕРЕВiРКА ТАБЛИЦi МНОЖЕННЯ ===" << endl;
|
||||
cout << "Оберiть рiвень складностi:" << endl;
|
||||
cout << "1) Легкий (1-5, 5 питань)" << endl;
|
||||
cout << "2) Середнiй (1-10, 7 питань)" << endl;
|
||||
cout << "3) Важкий (1-15, 10 питань)" << endl;
|
||||
cout << "Введiть номер рiвня (1-3): ";
|
||||
cin >> l;
|
||||
|
||||
switch(l) {
|
||||
case 1:
|
||||
q = 5;
|
||||
cout << "\n=== ЛЕГКИЙ РiВЕНЬ ===" << endl;
|
||||
break;
|
||||
case 2:
|
||||
q = 7;
|
||||
cout << "\n=== СЕРЕДНiЙ РiВЕНЬ ===" << endl;
|
||||
break;
|
||||
case 3:
|
||||
q = 10;
|
||||
cout << "\n=== ВАЖКИЙ РiВЕНЬ ===" << endl;
|
||||
break;
|
||||
default:
|
||||
cout << "Невiрний вибiр!" << endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (int i = 1; i <= q; i++) {
|
||||
int a;
|
||||
int b;
|
||||
int ans;
|
||||
int user;
|
||||
|
||||
if (l == 1) {
|
||||
a = rand() % 5 + 1;
|
||||
b = rand() % 5 + 1;
|
||||
} else if (l == 2) {
|
||||
a = rand() % 10 + 1;
|
||||
b = rand() % 10 + 1;
|
||||
} else {
|
||||
a = rand() % 15 + 1;
|
||||
b = rand() % 15 + 1;
|
||||
}
|
||||
|
||||
ans = a * b;
|
||||
|
||||
cout << "\nПитання " << i << "/" << q << ": " << a << " * " << b << " = ";
|
||||
cin >> user;
|
||||
|
||||
if (user == ans) {
|
||||
cout << "Правильно! +1 бал" << endl;
|
||||
c++;
|
||||
} else {
|
||||
cout << "Неправильно! Правильна вiдповiдь: " << ans << endl;
|
||||
}
|
||||
}
|
||||
|
||||
cout << "\n=== РЕЗУЛЬТАТИ ===" << endl;
|
||||
cout << "Правильних вiдповiдей: " << c << " з " << q << endl;
|
||||
|
||||
double p = (double)c / q * 100;
|
||||
|
||||
if (p >= 90) {
|
||||
cout << "Оцiнка: ВiДМiННО! (5)" << endl;
|
||||
} else if (p >= 80) {
|
||||
cout << "Оцiнка: ДОБРЕ (4)" << endl;
|
||||
} else if (p >= 70) {
|
||||
cout << "Оцiнка: ЗАДОВiЛЬНО (3)" << endl;
|
||||
} else {
|
||||
cout << "Оцiнка: НЕЗАДОВiЛЬНО (2)" << endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
344
network1.sh
Normal file
344
network1.sh
Normal file
@@ -0,0 +1,344 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
readonly IPT=iptables
|
||||
|
||||
# ------------------------- Утилиты -------------------------
|
||||
require_root() {
|
||||
if [[ ${EUID:-$(id -u)} -ne 0 ]]; then
|
||||
echo "[!] Пожалуйста, запустите скрипт от имени root (sudo)." >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
ensure_dependencies() {
|
||||
if ! command -v ${IPT} >/dev/null 2>&1; then
|
||||
echo "[!] iptables не найден. Установите: apt update && apt install -y iptables" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ! command -v netfilter-persistent >/dev/null 2>&1; then
|
||||
echo "[i] Устанавливаем iptables-persistent (без интерактивного режима)..."
|
||||
DEBIAN_FRONTEND=noninteractive apt-get update >/dev/null 2>&1 || true
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y iptables-persistent netfilter-persistent >/dev/null 2>&1 || true
|
||||
fi
|
||||
}
|
||||
|
||||
validate_port() {
|
||||
local port="$1"
|
||||
[[ "$port" =~ ^[0-9]+$ ]] || return 1
|
||||
(( port >= 1 && port <= 65535 ))
|
||||
}
|
||||
|
||||
validate_protocol() {
|
||||
local proto="$1"
|
||||
case "$proto" in
|
||||
tcp|udp|both) return 0 ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
}
|
||||
|
||||
validate_ip() {
|
||||
local ip="$1"
|
||||
# Принимаем IPv4 CIDR или одиночный IPv4
|
||||
if [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}(/([0-9]|[1-2][0-9]|3[0-2]))?$ ]]; then
|
||||
IFS=/ read -r base _ <<<"$ip"
|
||||
IFS=. read -r a b c d <<<"$base"
|
||||
for o in "$a" "$b" "$c" "$d"; do
|
||||
(( o >= 0 && o <= 255 )) || return 1
|
||||
done
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# === Сохранение правил ===
|
||||
save_rules() {
|
||||
echo "[+] Сохраняем правила..."
|
||||
# Используем iptables-persistent для сохранения правил
|
||||
netfilter-persistent save >/dev/null 2>&1 || true
|
||||
echo "[+] Правила сохранены."
|
||||
}
|
||||
|
||||
# === Показать правила ===
|
||||
show_rules() {
|
||||
echo "========== IPTABLES RULES =========="
|
||||
iptables -L -n -v --line-numbers
|
||||
echo "========== DOCKER-USER RULES =========="
|
||||
if iptables -S DOCKER-USER >/dev/null 2>&1; then
|
||||
iptables -L DOCKER-USER -n -v --line-numbers
|
||||
else
|
||||
echo "(chain DOCKER-USER not present)"
|
||||
fi
|
||||
}
|
||||
|
||||
parse_port_rules() {
|
||||
local chain="$1"
|
||||
local action_filter="${2:-}" # ACCEPT or DROP
|
||||
local src_filter="${3:-}" # -s IP
|
||||
local rules
|
||||
|
||||
rules=$(iptables -S "$chain" 2>/dev/null)
|
||||
if [[ -z "$rules" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
echo "# Chain: $chain"
|
||||
echo "# Protocol | Port | Action | Source IP"
|
||||
echo "-------------------------------------------"
|
||||
echo "$rules" | while read -r rule; do
|
||||
local proto="-" port="-" action="-" src="-"
|
||||
|
||||
[[ "$rule" =~ -p\ (tcp|udp) ]] && proto="${BASH_REMATCH[1]}"
|
||||
[[ "$rule" =~ --dport\ ([0-9]+) ]] && port="${BASH_REMATCH[1]}"
|
||||
[[ "$rule" =~ -j\ (ACCEPT|DROP) ]] && action="${BASH_REMATCH[1]}"
|
||||
[[ "$rule" =~ -s\ ([0-9\./]+) ]] && src="${BASH_REMATCH[1]}"
|
||||
|
||||
# Skip if no port rule or if action/src filter doesn't match
|
||||
if [[ "$port" == "-" ]]; then continue; fi
|
||||
if [[ -n "$action_filter" && "$action" != "$action_filter" ]]; then continue; fi
|
||||
if [[ -n "$src_filter" && "$src" != "$src_filter" ]]; then continue; fi
|
||||
|
||||
printf "%-10s | %-7s | %-6s | %s\n" "$proto" "$port" "$action" "$src"
|
||||
done
|
||||
}
|
||||
|
||||
# === Показать открытые порты ===
|
||||
show_open_ports() {
|
||||
echo "\n========== ОТКРЫТЫЕ ПОРТЫ (ACCEPT) =========="
|
||||
parse_port_rules INPUT ACCEPT
|
||||
parse_port_rules DOCKER-USER ACCEPT
|
||||
echo "============================================="
|
||||
echo "[i] Если порт открыт, но не работает, убедитесь, что служба запущена и слушает этот порт (например, командой 'ss -tulpn | grep <PORT>')."
|
||||
}
|
||||
|
||||
# === Показать закрытые порты (из DROP) ===
|
||||
show_closed_ports() {
|
||||
echo "\n========== ЗАКРЫТЫЕ ПОРТЫ (DROP) =========="
|
||||
parse_port_rules INPUT DROP
|
||||
parse_port_rules DOCKER-USER DROP
|
||||
echo "==========================================="
|
||||
}
|
||||
|
||||
show_all_ports() {
|
||||
echo "\n========== ВСЕ ПОРТОВЫЕ ПРАВИЛА =========="
|
||||
parse_port_rules INPUT
|
||||
parse_port_rules DOCKER-USER
|
||||
echo "=========================================="
|
||||
}
|
||||
|
||||
# Helper for 'Press Enter to continue...'
|
||||
press_enter() {
|
||||
read -rp $'Нажмите Enter, чтобы продолжить...'
|
||||
}
|
||||
|
||||
# === Блокировка IP ===
|
||||
block_ip() {
|
||||
read -p "Введите IP для блокировки: " ip
|
||||
if ! validate_ip "$ip"; then echo "[!] Неверный IP-адрес."; press_enter; return; fi
|
||||
iptables -A INPUT -s "$ip" -j DROP
|
||||
iptables -A DOCKER-USER -s "$ip" -j DROP
|
||||
echo "[+] IP $ip заблокирован."
|
||||
save_rules
|
||||
}
|
||||
|
||||
# === Разблокировка IP ===
|
||||
unblock_ip() {
|
||||
read -p "Введите IP для разблокировки: " ip
|
||||
if ! validate_ip "$ip"; then echo "[!] Неверный IP-адрес."; press_enter; return; fi
|
||||
iptables -D INPUT -s "$ip" -j DROP 2>/dev/null
|
||||
iptables -D DOCKER-USER -s "$ip" -j DROP 2>/dev/null
|
||||
echo "[+] IP $ip разблокирован."
|
||||
save_rules
|
||||
}
|
||||
|
||||
# === Ensure DOCKER-USER chain exists and hooked ===
|
||||
ensure_docker_user_chain() {
|
||||
iptables -S DOCKER-USER >/dev/null 2>&1 || iptables -N DOCKER-USER
|
||||
iptables -C FORWARD -j DOCKER-USER >/dev/null 2>&1 || iptables -I FORWARD -j DOCKER-USER
|
||||
}
|
||||
|
||||
# === Меню управления портами ===
|
||||
ports_menu() {
|
||||
while true; do
|
||||
cat <<MENU
|
||||
================ PORT MANAGER ================
|
||||
1) Показать открытые порты
|
||||
2) Показать закрытые порты
|
||||
3) Показать все порты
|
||||
4) Вернуться в главное меню
|
||||
MENU
|
||||
read -p "Выберите действие: " choice
|
||||
case $choice in
|
||||
1) show_open_ports; press_enter ;;
|
||||
2) show_closed_ports; press_enter ;;
|
||||
3) show_all_ports; press_enter ;;
|
||||
4) break ;;
|
||||
*) echo "Неверный выбор." ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# === Главное меню ===
|
||||
main_menu() {
|
||||
while true; do
|
||||
cat <<MENU
|
||||
================ NETWORK MANAGER ================
|
||||
1) Открыть порт
|
||||
2) Закрыть порт
|
||||
3) Добавить IP к порту
|
||||
4) Убрать IP с порта
|
||||
5) Показать правила
|
||||
6) Порты (подменю)
|
||||
7) Заблокировать IP
|
||||
8) Разблокировать IP
|
||||
9) Выход
|
||||
MENU
|
||||
read -p "Выберите действие: " action
|
||||
case $action in
|
||||
1) new_open_port; press_enter ;;
|
||||
2) new_close_port; press_enter ;;
|
||||
3) new_add_ip_to_port; press_enter ;;
|
||||
4) new_remove_ip_from_port; press_enter ;;
|
||||
5) show_rules; press_enter ;;
|
||||
6) ports_menu ;;
|
||||
7) block_ip; press_enter ;;
|
||||
8) unblock_ip; press_enter ;;
|
||||
9) echo "Выход"; exit 0 ;;
|
||||
*) echo "Неверный выбор." ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# --- Helper functions for managing iptables rules ---
|
||||
add_port_rule() {
|
||||
local chain="$1" proto="$2" port="$3" ip="$4" action="$5"
|
||||
if [[ -z "$ip" ]]; then
|
||||
${IPT} -A "$chain" -p "$proto" --dport "$port" -j "$action"
|
||||
else
|
||||
${IPT} -A "$chain" -p "$proto" --dport "$port" -s "$ip" -j "$action"
|
||||
fi
|
||||
}
|
||||
|
||||
delete_port_rule() {
|
||||
local chain="$1" proto="$2" port="$3" ip="$4" action="$5"
|
||||
if [[ -z "$ip" ]]; then
|
||||
${IPT} -D "$chain" -p "$proto" --dport "$port" -j "$action" 2>/dev/null || true
|
||||
else
|
||||
${IPT} -D "$chain" -p "$proto" --dport "$port" -s "$ip" -j "$action" 2>/dev/null || true
|
||||
fi
|
||||
}
|
||||
|
||||
new_open_port() {
|
||||
read -p "Введите номер порта: " port
|
||||
if ! validate_port "$port"; then echo "[!] Неверный номер порта."; press_enter; return; fi
|
||||
read -p "Протокол (tcp/udp/both): " proto
|
||||
proto=$(echo "$proto" | tr '[:upper:]' '[:lower:]')
|
||||
if ! validate_protocol "$proto"; then echo "[!] Неверный протокол."; press_enter; return; fi
|
||||
read -p "Ограничить доступ по IP? (y/n): " limit
|
||||
|
||||
limit=$(echo "$limit" | tr '[:upper:]' '[:lower:]')
|
||||
|
||||
if [ "$proto" == "both" ]; then
|
||||
protos=("tcp" "udp")
|
||||
else
|
||||
protos=("$proto")
|
||||
fi
|
||||
|
||||
for p in "${protos[@]}"; do
|
||||
# Удаляем ВСЕ существующие правила для этого порта из внешних цепочек
|
||||
# Удаляем правила ACCEPT
|
||||
while iptables -D INPUT -p "$p" --dport "$port" -j ACCEPT 2>/dev/null; do :; done
|
||||
while iptables -D DOCKER-USER -p "$p" --dport "$port" -j ACCEPT 2>/dev/null; do :; done
|
||||
# Удаляем правила DROP
|
||||
while iptables -D INPUT -p "$p" --dport "$port" -j DROP 2>/dev/null; do :; done
|
||||
while iptables -D DOCKER-USER -p "$p" --dport "$port" -j DROP 2>/dev/null; do :; done
|
||||
|
||||
if [ "$limit" == "y" ]; then
|
||||
read -p "Введите IP-адреса (через пробел): " ips
|
||||
for ip in $ips; do
|
||||
if ! validate_ip "$ip"; then echo "[!] Пропускаем неверный IP: $ip"; continue; fi
|
||||
iptables -I INPUT 1 -p "$p" --dport "$port" -s "$ip" -j ACCEPT
|
||||
iptables -I DOCKER-USER 1 -p "$p" --dport "$port" -s "$ip" -j ACCEPT
|
||||
done
|
||||
else
|
||||
iptables -I INPUT 1 -p "$p" --dport "$port" -j ACCEPT
|
||||
iptables -I DOCKER-USER 1 -p "$p" --dport "$port" -j ACCEPT
|
||||
fi
|
||||
done
|
||||
echo "[+] Порт $port открыт."
|
||||
save_rules
|
||||
}
|
||||
|
||||
new_close_port() {
|
||||
read -p "Введите номер порта: " port
|
||||
if ! validate_port "$port"; then echo "[!] Неверный номер порта."; press_enter; return; fi
|
||||
read -p "Протокол (tcp/udp/both): " proto
|
||||
proto=$(echo "$proto" | tr '[:upper:]' '[:lower:]')
|
||||
if ! validate_protocol "$proto"; then echo "[!] Неверный протокол."; press_enter; return; fi
|
||||
|
||||
if [ "$proto" == "both" ]; then
|
||||
protos=("tcp" "udp")
|
||||
else
|
||||
protos=("$proto")
|
||||
fi
|
||||
|
||||
for p in "${protos[@]}"; do
|
||||
# Удаляем ВСЕ существующие правила для этого порта из внешних цепочек
|
||||
# Удаляем правила ACCEPT
|
||||
while iptables -D INPUT -p "$p" --dport "$port" -j ACCEPT 2>/dev/null; do :; done
|
||||
while iptables -D DOCKER-USER -p "$p" --dport "$port" -j ACCEPT 2>/dev/null; do :; done
|
||||
# Удаляем правила DROP
|
||||
while iptables -D INPUT -p "$p" --dport "$port" -j DROP 2>/dev/null; do :; done
|
||||
while iptables -D DOCKER-USER -p "$p" --dport "$port" -j DROP 2>/dev/null; do :; done
|
||||
|
||||
# Добавляем новое правило DROP в НАЧАЛО внешних цепочек
|
||||
iptables -I INPUT 1 -p "$p" --dport "$port" -j DROP
|
||||
iptables -I DOCKER-USER 1 -p "$p" --dport "$port" -j DROP
|
||||
done
|
||||
echo "[+] Порт $port закрыт."
|
||||
save_rules
|
||||
}
|
||||
|
||||
new_add_ip_to_port() {
|
||||
read -p "Введите номер порта: " port
|
||||
if ! validate_port "$port"; then echo "[!] Неверный номер порта."; press_enter; return; fi
|
||||
read -p "Протокол (tcp/udp): " proto
|
||||
proto=$(echo "$proto" | tr '[:upper:]' '[:lower:]')
|
||||
if ! validate_protocol "$proto"; then echo "[!] Неверный протокол."; press_enter; return; fi
|
||||
read -p "Введите IP-адреса (через пробел): " ips
|
||||
|
||||
for ip in $ips; do
|
||||
if ! validate_ip "$ip"; then echo "[!] Пропускаем неверный IP: $ip"; continue; fi
|
||||
# Удаляем DROP для этого IP/порта из внешних цепочек
|
||||
while iptables -D INPUT -p "$proto" --dport "$port" -s "$ip" -j DROP 2>/dev/null; do :; done
|
||||
while iptables -D DOCKER-USER -p "$proto" --dport "$port" -s "$ip" -j DROP 2>/dev/null; do :; done
|
||||
# Добавляем ACCEPT в начало внешних цепочек
|
||||
iptables -I INPUT 1 -p "$proto" --dport "$port" -s "$ip" -j ACCEPT
|
||||
iptables -I DOCKER-USER 1 -p "$proto" --dport "$port" -s "$ip" -j ACCEPT
|
||||
echo "[+] Добавлен доступ для $ip на порт $port/$proto"
|
||||
done
|
||||
save_rules
|
||||
}
|
||||
|
||||
new_remove_ip_from_port() {
|
||||
read -p "Введите номер порта: " port
|
||||
if ! validate_port "$port"; then echo "[!] Неверный номер порта."; press_enter; return; fi
|
||||
read -p "Протокол (tcp/udp): " proto
|
||||
proto=$(echo "$proto" | tr '[:upper:]' '[:lower:]')
|
||||
if ! validate_protocol "$proto"; then echo "[!] Неверный протокол."; press_enter; return; fi
|
||||
read -p "Введите IP-адрес: " ip
|
||||
if ! validate_ip "$ip"; then echo "[!] Неверный IP-адрес."; press_enter; return; fi
|
||||
|
||||
# Удаляем ACCEPT для этого IP/порта из внешних цепочек
|
||||
while iptables -D INPUT -p "$proto" --dport "$port" -s "$ip" -j ACCEPT 2>/dev/null; do :; done
|
||||
while iptables -D DOCKER-USER -p "$proto" --dport "$port" -s "$ip" -j ACCEPT 2>/dev/null; do :; done
|
||||
echo "[+] Убран доступ для $ip с порта $port/$proto"
|
||||
save_rules
|
||||
}
|
||||
|
||||
require_root
|
||||
ensure_dependencies
|
||||
ensure_docker_user_chain
|
||||
|
||||
main_menu
|
||||
Reference in New Issue
Block a user