mirror of
https://github.com/skurudo/mikrotik-chr-installer.git
synced 2026-10-19 07:23:53 +00:00
chr configuration updates
This commit is contained in:
parent
170bde257a
commit
f6edc86c59
6 changed files with 244 additions and 64 deletions
|
|
@ -27,6 +27,15 @@ generate_wireguard_key() {
|
||||||
head -c 32 /dev/urandom | base64
|
head -c 32 /dev/urandom | base64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# INPUT SANITIZATION
|
||||||
|
# ============================================
|
||||||
|
sanitize_input() {
|
||||||
|
local input="$1"
|
||||||
|
# Remove dangerous characters: ; " ' ` $ \ / and newlines
|
||||||
|
echo "$input" | tr -d ';"'\''`$\\/\n\r' | head -c 64
|
||||||
|
}
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -37,8 +46,8 @@ CHR_IMG="chr-${CHR_VERSION}.img"
|
||||||
WORK_DIR="/tmp/chr-install"
|
WORK_DIR="/tmp/chr-install"
|
||||||
MOUNT_POINT="/mnt/chr"
|
MOUNT_POINT="/mnt/chr"
|
||||||
|
|
||||||
# CHR Settings
|
# CHR Settings (password auto-generated if not specified)
|
||||||
ADMIN_PASSWORD="PASSWORD"
|
ADMIN_PASSWORD=""
|
||||||
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
||||||
ROUTER_NAME="MikroTik-VPN"
|
ROUTER_NAME="MikroTik-VPN"
|
||||||
TIMEZONE="Europe/Moscow"
|
TIMEZONE="Europe/Moscow"
|
||||||
|
|
@ -56,7 +65,7 @@ WG_SERVER_PRIVATE_KEY=""
|
||||||
WG_NETWORK="10.10.20.0/24"
|
WG_NETWORK="10.10.20.0/24"
|
||||||
OVPN_PORT="1194"
|
OVPN_PORT="1194"
|
||||||
OVPN_TCP_PORT="1195"
|
OVPN_TCP_PORT="1195"
|
||||||
SSTP_PORT="443"
|
SSTP_PORT="8443"
|
||||||
|
|
||||||
# Flags
|
# Flags
|
||||||
FORCE_DOWNLOAD=false
|
FORCE_DOWNLOAD=false
|
||||||
|
|
@ -72,7 +81,7 @@ usage() {
|
||||||
echo "CHR installation script as VPN server with all protocols:"
|
echo "CHR installation script as VPN server with all protocols:"
|
||||||
echo " - PPTP (port 1723)"
|
echo " - PPTP (port 1723)"
|
||||||
echo " - L2TP/IPsec (port 1701, UDP 500/4500)"
|
echo " - L2TP/IPsec (port 1701, UDP 500/4500)"
|
||||||
echo " - SSTP (port 443)"
|
echo " - SSTP (port 8443)"
|
||||||
echo " - OpenVPN (port 1194 UDP/TCP, 1195 TCP)"
|
echo " - OpenVPN (port 1194 UDP/TCP, 1195 TCP)"
|
||||||
echo " - WireGuard (port 51820)"
|
echo " - WireGuard (port 51820)"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
@ -81,7 +90,7 @@ usage() {
|
||||||
echo " --yes, -y No confirmations (automatic mode)"
|
echo " --yes, -y No confirmations (automatic mode)"
|
||||||
echo " --reboot Automatic reboot (requires --yes)"
|
echo " --reboot Automatic reboot (requires --yes)"
|
||||||
echo " --version VER CHR version (default: $CHR_VERSION)"
|
echo " --version VER CHR version (default: $CHR_VERSION)"
|
||||||
echo " --password PASS Admin password (default: $ADMIN_PASSWORD)"
|
echo " --password PASS Admin password (auto-generated)"
|
||||||
echo " --name NAME Router name (default: $ROUTER_NAME)"
|
echo " --name NAME Router name (default: $ROUTER_NAME)"
|
||||||
echo " --timezone TZ Timezone (default: $TIMEZONE)"
|
echo " --timezone TZ Timezone (default: $TIMEZONE)"
|
||||||
echo " --dns SERVERS DNS servers (default: $DNS_SERVERS)"
|
echo " --dns SERVERS DNS servers (default: $DNS_SERVERS)"
|
||||||
|
|
@ -121,35 +130,35 @@ while [[ $# -gt 0 ]]; do
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--password)
|
--password)
|
||||||
ADMIN_PASSWORD="$2"
|
ADMIN_PASSWORD=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--name)
|
--name)
|
||||||
ROUTER_NAME="$2"
|
ROUTER_NAME=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--timezone)
|
--timezone)
|
||||||
TIMEZONE="$2"
|
TIMEZONE=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--dns)
|
--dns)
|
||||||
DNS_SERVERS="$2"
|
DNS_SERVERS=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--vpn-user)
|
--vpn-user)
|
||||||
VPN_USER="$2"
|
VPN_USER=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--vpn-pass)
|
--vpn-pass)
|
||||||
VPN_USER_PASSWORD="$2"
|
VPN_USER_PASSWORD=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--vpn-pool)
|
--vpn-pool)
|
||||||
VPN_POOL="$2"
|
VPN_POOL=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--ipsec-secret)
|
--ipsec-secret)
|
||||||
IPSEC_SECRET="$2"
|
IPSEC_SECRET=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--wg-port)
|
--wg-port)
|
||||||
|
|
@ -171,6 +180,11 @@ done
|
||||||
# ============================================
|
# ============================================
|
||||||
log_info "Generating keys and passwords..."
|
log_info "Generating keys and passwords..."
|
||||||
|
|
||||||
|
if [[ -z "$ADMIN_PASSWORD" ]]; then
|
||||||
|
ADMIN_PASSWORD=$(generate_password 16)
|
||||||
|
log_info "Generated admin password: $ADMIN_PASSWORD"
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ -z "$VPN_USER_PASSWORD" ]]; then
|
if [[ -z "$VPN_USER_PASSWORD" ]]; then
|
||||||
VPN_USER_PASSWORD=$(generate_password 16)
|
VPN_USER_PASSWORD=$(generate_password 16)
|
||||||
log_info "Generated VPN password: $VPN_USER_PASSWORD"
|
log_info "Generated VPN password: $VPN_USER_PASSWORD"
|
||||||
|
|
@ -400,6 +414,12 @@ cat > "$MOUNT_POINT/rw/autorun.scr" <<EOF
|
||||||
# ============================================
|
# ============================================
|
||||||
/ppp profile add name=vpn-profile local-address=${VPN_LOCAL_IP} remote-address=vpn-pool dns-server=${DNS_SERVERS} use-encryption=yes
|
/ppp profile add name=vpn-profile local-address=${VPN_LOCAL_IP} remote-address=vpn-pool dns-server=${DNS_SERVERS} use-encryption=yes
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# VPN - OPENVPN PUSH ROUTES
|
||||||
|
# ============================================
|
||||||
|
# Default route through VPN (all traffic)
|
||||||
|
/ppp profile set vpn-profile push-routes="0.0.0.0/0 ${VPN_LOCAL_IP}"
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# VPN - USER
|
# VPN - USER
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -459,9 +479,15 @@ cat > "$MOUNT_POINT/rw/autorun.scr" <<EOF
|
||||||
/ip firewall nat add chain=dstnat protocol=tcp dst-port=${OVPN_TCP_PORT} action=redirect to-ports=${OVPN_PORT} comment="Redirect OpenVPN TCP alt port to main"
|
/ip firewall nat add chain=dstnat protocol=tcp dst-port=${OVPN_TCP_PORT} action=redirect to-ports=${OVPN_PORT} comment="Redirect OpenVPN TCP alt port to main"
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# FIREWALL - SSH BRUTE-FORCE PROTECTION
|
# FIREWALL - BASIC RULES (first for performance)
|
||||||
# ============================================
|
# ============================================
|
||||||
/ip firewall filter
|
/ip firewall filter
|
||||||
|
add chain=input connection-state=established,related action=accept comment="Accept established connections"
|
||||||
|
add chain=input connection-state=invalid action=drop comment="Drop invalid connections"
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# FIREWALL - SSH BRUTE-FORCE PROTECTION
|
||||||
|
# ============================================
|
||||||
add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment="Drop SSH brute force"
|
add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment="Drop SSH brute force"
|
||||||
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=1w
|
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=1w
|
||||||
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=1m
|
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=1m
|
||||||
|
|
@ -486,10 +512,8 @@ add chain=input protocol=udp dst-port=53 action=drop comment="Drop external DNS
|
||||||
add chain=input protocol=tcp dst-port=53 action=drop comment="Drop external DNS TCP queries"
|
add chain=input protocol=tcp dst-port=53 action=drop comment="Drop external DNS TCP queries"
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# FIREWALL - BASIC RULES
|
# FIREWALL - ALLOWED SERVICES
|
||||||
# ============================================
|
# ============================================
|
||||||
add chain=input connection-state=established,related action=accept comment="Accept established connections"
|
|
||||||
add chain=input connection-state=invalid action=drop comment="Drop invalid connections"
|
|
||||||
add chain=input protocol=icmp action=accept comment="Accept ICMP (ping)"
|
add chain=input protocol=icmp action=accept comment="Accept ICMP (ping)"
|
||||||
add chain=input protocol=tcp dst-port=22 action=accept comment="Accept SSH"
|
add chain=input protocol=tcp dst-port=22 action=accept comment="Accept SSH"
|
||||||
add chain=input protocol=tcp dst-port=8291 action=accept comment="Accept WinBox"
|
add chain=input protocol=tcp dst-port=8291 action=accept comment="Accept WinBox"
|
||||||
|
|
@ -543,6 +567,11 @@ add chain=forward action=drop comment="Drop all other forward"
|
||||||
# NAT - MASQUERADE FOR ALL OUTGOING TRAFFIC
|
# NAT - MASQUERADE FOR ALL OUTGOING TRAFFIC
|
||||||
# ============================================
|
# ============================================
|
||||||
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# SECURITY - REMOVE AUTORUN AFTER EXECUTION
|
||||||
|
# ============================================
|
||||||
|
/file remove [find name~"autorun"]
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
sync
|
sync
|
||||||
|
|
@ -651,6 +680,7 @@ echo -e "${GREEN} SAVE THIS INFORMATION!${NC}"
|
||||||
echo -e "${GREEN}═══════════════════════════════════════════${NC}"
|
echo -e "${GREEN}═══════════════════════════════════════════${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Server: ${SERVER_IP}"
|
echo "Server: ${SERVER_IP}"
|
||||||
|
echo "Admin password: ${ADMIN_PASSWORD}"
|
||||||
echo ""
|
echo ""
|
||||||
echo "PPTP/L2TP/SSTP/OpenVPN:"
|
echo "PPTP/L2TP/SSTP/OpenVPN:"
|
||||||
echo " Username: ${VPN_USER}"
|
echo " Username: ${VPN_USER}"
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,15 @@ generate_wireguard_key() {
|
||||||
head -c 32 /dev/urandom | base64
|
head -c 32 /dev/urandom | base64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# САНИТИЗАЦИЯ ВХОДНЫХ ДАННЫХ
|
||||||
|
# ============================================
|
||||||
|
sanitize_input() {
|
||||||
|
local input="$1"
|
||||||
|
# Удаляем опасные символы: ; " ' ` $ \ / и переносы строк
|
||||||
|
echo "$input" | tr -d ';"'\''`$\\/\n\r' | head -c 64
|
||||||
|
}
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# КОНФИГУРАЦИЯ
|
# КОНФИГУРАЦИЯ
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -37,8 +46,8 @@ CHR_IMG="chr-${CHR_VERSION}.img"
|
||||||
WORK_DIR="/tmp/chr-install"
|
WORK_DIR="/tmp/chr-install"
|
||||||
MOUNT_POINT="/mnt/chr"
|
MOUNT_POINT="/mnt/chr"
|
||||||
|
|
||||||
# Настройки CHR
|
# Настройки CHR (пароль генерируется автоматически если не указан)
|
||||||
ADMIN_PASSWORD="PASSWORD"
|
ADMIN_PASSWORD=""
|
||||||
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
||||||
ROUTER_NAME="MikroTik-VPN"
|
ROUTER_NAME="MikroTik-VPN"
|
||||||
TIMEZONE="Europe/Moscow"
|
TIMEZONE="Europe/Moscow"
|
||||||
|
|
@ -56,7 +65,7 @@ WG_SERVER_PRIVATE_KEY=""
|
||||||
WG_NETWORK="10.10.20.0/24"
|
WG_NETWORK="10.10.20.0/24"
|
||||||
OVPN_PORT="1194"
|
OVPN_PORT="1194"
|
||||||
OVPN_TCP_PORT="1195"
|
OVPN_TCP_PORT="1195"
|
||||||
SSTP_PORT="443"
|
SSTP_PORT="8443"
|
||||||
|
|
||||||
# Флаги
|
# Флаги
|
||||||
FORCE_DOWNLOAD=false
|
FORCE_DOWNLOAD=false
|
||||||
|
|
@ -72,7 +81,7 @@ usage() {
|
||||||
echo "Скрипт установки CHR как VPN-сервера со всеми протоколами:"
|
echo "Скрипт установки CHR как VPN-сервера со всеми протоколами:"
|
||||||
echo " - PPTP (порт 1723)"
|
echo " - PPTP (порт 1723)"
|
||||||
echo " - L2TP/IPsec (порт 1701, UDP 500/4500)"
|
echo " - L2TP/IPsec (порт 1701, UDP 500/4500)"
|
||||||
echo " - SSTP (порт 443)"
|
echo " - SSTP (порт 8443)"
|
||||||
echo " - OpenVPN (порт 1194 UDP/TCP, 1195 TCP)"
|
echo " - OpenVPN (порт 1194 UDP/TCP, 1195 TCP)"
|
||||||
echo " - WireGuard (порт 51820)"
|
echo " - WireGuard (порт 51820)"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
@ -81,7 +90,7 @@ usage() {
|
||||||
echo " --yes, -y Без подтверждений (автоматический режим)"
|
echo " --yes, -y Без подтверждений (автоматический режим)"
|
||||||
echo " --reboot Автоматическая перезагрузка (требует --yes)"
|
echo " --reboot Автоматическая перезагрузка (требует --yes)"
|
||||||
echo " --version VER Версия CHR (по умолчанию: $CHR_VERSION)"
|
echo " --version VER Версия CHR (по умолчанию: $CHR_VERSION)"
|
||||||
echo " --password PASS Пароль admin (по умолчанию: $ADMIN_PASSWORD)"
|
echo " --password PASS Пароль admin (генерируется автоматически)"
|
||||||
echo " --name NAME Имя роутера (по умолчанию: $ROUTER_NAME)"
|
echo " --name NAME Имя роутера (по умолчанию: $ROUTER_NAME)"
|
||||||
echo " --timezone TZ Часовой пояс (по умолчанию: $TIMEZONE)"
|
echo " --timezone TZ Часовой пояс (по умолчанию: $TIMEZONE)"
|
||||||
echo " --dns SERVERS DNS серверы (по умолчанию: $DNS_SERVERS)"
|
echo " --dns SERVERS DNS серверы (по умолчанию: $DNS_SERVERS)"
|
||||||
|
|
@ -121,35 +130,35 @@ while [[ $# -gt 0 ]]; do
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--password)
|
--password)
|
||||||
ADMIN_PASSWORD="$2"
|
ADMIN_PASSWORD=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--name)
|
--name)
|
||||||
ROUTER_NAME="$2"
|
ROUTER_NAME=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--timezone)
|
--timezone)
|
||||||
TIMEZONE="$2"
|
TIMEZONE=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--dns)
|
--dns)
|
||||||
DNS_SERVERS="$2"
|
DNS_SERVERS=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--vpn-user)
|
--vpn-user)
|
||||||
VPN_USER="$2"
|
VPN_USER=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--vpn-pass)
|
--vpn-pass)
|
||||||
VPN_USER_PASSWORD="$2"
|
VPN_USER_PASSWORD=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--vpn-pool)
|
--vpn-pool)
|
||||||
VPN_POOL="$2"
|
VPN_POOL=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--ipsec-secret)
|
--ipsec-secret)
|
||||||
IPSEC_SECRET="$2"
|
IPSEC_SECRET=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--wg-port)
|
--wg-port)
|
||||||
|
|
@ -171,6 +180,11 @@ done
|
||||||
# ============================================
|
# ============================================
|
||||||
log_info "Генерация ключей и паролей..."
|
log_info "Генерация ключей и паролей..."
|
||||||
|
|
||||||
|
if [[ -z "$ADMIN_PASSWORD" ]]; then
|
||||||
|
ADMIN_PASSWORD=$(generate_password 16)
|
||||||
|
log_info "Сгенерирован пароль admin: $ADMIN_PASSWORD"
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ -z "$VPN_USER_PASSWORD" ]]; then
|
if [[ -z "$VPN_USER_PASSWORD" ]]; then
|
||||||
VPN_USER_PASSWORD=$(generate_password 16)
|
VPN_USER_PASSWORD=$(generate_password 16)
|
||||||
log_info "Сгенерирован пароль VPN: $VPN_USER_PASSWORD"
|
log_info "Сгенерирован пароль VPN: $VPN_USER_PASSWORD"
|
||||||
|
|
@ -400,6 +414,12 @@ cat > "$MOUNT_POINT/rw/autorun.scr" <<EOF
|
||||||
# ============================================
|
# ============================================
|
||||||
/ppp profile add name=vpn-profile local-address=${VPN_LOCAL_IP} remote-address=vpn-pool dns-server=${DNS_SERVERS} use-encryption=yes
|
/ppp profile add name=vpn-profile local-address=${VPN_LOCAL_IP} remote-address=vpn-pool dns-server=${DNS_SERVERS} use-encryption=yes
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# VPN - OPENVPN PUSH ROUTES
|
||||||
|
# ============================================
|
||||||
|
# Маршрут по умолчанию через VPN (весь трафик)
|
||||||
|
/ppp profile set vpn-profile push-routes="0.0.0.0/0 ${VPN_LOCAL_IP}"
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# VPN - ПОЛЬЗОВАТЕЛЬ
|
# VPN - ПОЛЬЗОВАТЕЛЬ
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -459,9 +479,15 @@ cat > "$MOUNT_POINT/rw/autorun.scr" <<EOF
|
||||||
/ip firewall nat add chain=dstnat protocol=tcp dst-port=${OVPN_TCP_PORT} action=redirect to-ports=${OVPN_PORT} comment="Redirect OpenVPN TCP alt port to main"
|
/ip firewall nat add chain=dstnat protocol=tcp dst-port=${OVPN_TCP_PORT} action=redirect to-ports=${OVPN_PORT} comment="Redirect OpenVPN TCP alt port to main"
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# ФАЙРВОЛ - ЗАЩИТА ОТ БРУТФОРСА SSH
|
# ФАЙРВОЛ - БАЗОВЫЕ ПРАВИЛА (в начале для производительности)
|
||||||
# ============================================
|
# ============================================
|
||||||
/ip firewall filter
|
/ip firewall filter
|
||||||
|
add chain=input connection-state=established,related action=accept comment="Accept established connections"
|
||||||
|
add chain=input connection-state=invalid action=drop comment="Drop invalid connections"
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# ФАЙРВОЛ - ЗАЩИТА ОТ БРУТФОРСА SSH
|
||||||
|
# ============================================
|
||||||
add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment="Drop SSH brute force"
|
add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment="Drop SSH brute force"
|
||||||
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=1w
|
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=1w
|
||||||
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=1m
|
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=1m
|
||||||
|
|
@ -486,10 +512,8 @@ add chain=input protocol=udp dst-port=53 action=drop comment="Drop external DNS
|
||||||
add chain=input protocol=tcp dst-port=53 action=drop comment="Drop external DNS TCP queries"
|
add chain=input protocol=tcp dst-port=53 action=drop comment="Drop external DNS TCP queries"
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# ФАЙРВОЛ - БАЗОВЫЕ ПРАВИЛА
|
# ФАЙРВОЛ - РАЗРЕШЁННЫЕ СЕРВИСЫ
|
||||||
# ============================================
|
# ============================================
|
||||||
add chain=input connection-state=established,related action=accept comment="Accept established connections"
|
|
||||||
add chain=input connection-state=invalid action=drop comment="Drop invalid connections"
|
|
||||||
add chain=input protocol=icmp action=accept comment="Accept ICMP (ping)"
|
add chain=input protocol=icmp action=accept comment="Accept ICMP (ping)"
|
||||||
add chain=input protocol=tcp dst-port=22 action=accept comment="Accept SSH"
|
add chain=input protocol=tcp dst-port=22 action=accept comment="Accept SSH"
|
||||||
add chain=input protocol=tcp dst-port=8291 action=accept comment="Accept WinBox"
|
add chain=input protocol=tcp dst-port=8291 action=accept comment="Accept WinBox"
|
||||||
|
|
@ -543,6 +567,11 @@ add chain=forward action=drop comment="Drop all other forward"
|
||||||
# NAT - MASQUERADE ДЛЯ ВСЕГО ИСХОДЯЩЕГО ТРАФИКА
|
# NAT - MASQUERADE ДЛЯ ВСЕГО ИСХОДЯЩЕГО ТРАФИКА
|
||||||
# ============================================
|
# ============================================
|
||||||
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# БЕЗОПАСНОСТЬ - УДАЛЕНИЕ AUTORUN ПОСЛЕ ВЫПОЛНЕНИЯ
|
||||||
|
# ============================================
|
||||||
|
/file remove [find name~"autorun"]
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
sync
|
sync
|
||||||
|
|
@ -651,6 +680,7 @@ echo -e "${GREEN} СОХРАНИТЕ ЭТИ ДАННЫЕ!${NC}"
|
||||||
echo -e "${GREEN}═══════════════════════════════════════════${NC}"
|
echo -e "${GREEN}═══════════════════════════════════════════${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Сервер: ${SERVER_IP}"
|
echo "Сервер: ${SERVER_IP}"
|
||||||
|
echo "Admin пароль: ${ADMIN_PASSWORD}"
|
||||||
echo ""
|
echo ""
|
||||||
echo "PPTP/L2TP/SSTP/OpenVPN:"
|
echo "PPTP/L2TP/SSTP/OpenVPN:"
|
||||||
echo " Пользователь: ${VPN_USER}"
|
echo " Пользователь: ${VPN_USER}"
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,20 @@ log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||||||
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||||
log_debug() { echo -e "${CYAN}[DEBUG]${NC} $1"; }
|
log_debug() { echo -e "${CYAN}[DEBUG]${NC} $1"; }
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# PASSWORD GENERATION AND SANITIZATION
|
||||||
|
# ============================================
|
||||||
|
generate_password() {
|
||||||
|
local length=$1
|
||||||
|
tr -dc 'A-Za-z0-9' < /dev/urandom | head -c "$length"
|
||||||
|
}
|
||||||
|
|
||||||
|
sanitize_input() {
|
||||||
|
local input="$1"
|
||||||
|
# Remove dangerous characters: ; " ' ` $ \ / and newlines
|
||||||
|
echo "$input" | tr -d ';"'\''`$\\/\n\r' | head -c 64
|
||||||
|
}
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -23,8 +37,8 @@ CHR_IMG="chr-${CHR_VERSION}.img"
|
||||||
WORK_DIR="/tmp/chr-install"
|
WORK_DIR="/tmp/chr-install"
|
||||||
MOUNT_POINT="/mnt/chr"
|
MOUNT_POINT="/mnt/chr"
|
||||||
|
|
||||||
# CHR Settings
|
# CHR Settings (password auto-generated if not specified)
|
||||||
ADMIN_PASSWORD="PASSWORD"
|
ADMIN_PASSWORD=""
|
||||||
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
||||||
ROUTER_NAME="MikroTik-CHR"
|
ROUTER_NAME="MikroTik-CHR"
|
||||||
TIMEZONE="Europe/Moscow"
|
TIMEZONE="Europe/Moscow"
|
||||||
|
|
@ -52,7 +66,7 @@ usage() {
|
||||||
echo " --yes, -y No confirmations (automatic mode)"
|
echo " --yes, -y No confirmations (automatic mode)"
|
||||||
echo " --reboot Automatic reboot (requires --yes)"
|
echo " --reboot Automatic reboot (requires --yes)"
|
||||||
echo " --version VER CHR version (default: $CHR_VERSION)"
|
echo " --version VER CHR version (default: $CHR_VERSION)"
|
||||||
echo " --password PASS Admin password (default: $ADMIN_PASSWORD)"
|
echo " --password PASS Admin password (auto-generated)"
|
||||||
echo " --name NAME Router name (default: $ROUTER_NAME)"
|
echo " --name NAME Router name (default: $ROUTER_NAME)"
|
||||||
echo " --timezone TZ Timezone (default: $TIMEZONE)"
|
echo " --timezone TZ Timezone (default: $TIMEZONE)"
|
||||||
echo " --dns SERVERS DNS servers (default: $DNS_SERVERS)"
|
echo " --dns SERVERS DNS servers (default: $DNS_SERVERS)"
|
||||||
|
|
@ -87,19 +101,19 @@ while [[ $# -gt 0 ]]; do
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--password)
|
--password)
|
||||||
ADMIN_PASSWORD="$2"
|
ADMIN_PASSWORD=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--name)
|
--name)
|
||||||
ROUTER_NAME="$2"
|
ROUTER_NAME=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--timezone)
|
--timezone)
|
||||||
TIMEZONE="$2"
|
TIMEZONE=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--dns)
|
--dns)
|
||||||
DNS_SERVERS="$2"
|
DNS_SERVERS=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
-h|--help)
|
-h|--help)
|
||||||
|
|
@ -112,6 +126,14 @@ while [[ $# -gt 0 ]]; do
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# PASSWORD GENERATION (if not specified)
|
||||||
|
# ============================================
|
||||||
|
if [[ -z "$ADMIN_PASSWORD" ]]; then
|
||||||
|
ADMIN_PASSWORD=$(generate_password 16)
|
||||||
|
log_info "Generated admin password: $ADMIN_PASSWORD"
|
||||||
|
fi
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# ROOT CHECK
|
# ROOT CHECK
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -319,9 +341,15 @@ cat > "$MOUNT_POINT/rw/autorun.scr" <<EOF
|
||||||
/ip service set winbox disabled=no
|
/ip service set winbox disabled=no
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# FIREWALL - SSH BRUTE-FORCE PROTECTION
|
# FIREWALL - BASIC RULES (first for performance)
|
||||||
# ============================================
|
# ============================================
|
||||||
/ip firewall filter
|
/ip firewall filter
|
||||||
|
add chain=input connection-state=established,related action=accept comment="Accept established connections"
|
||||||
|
add chain=input connection-state=invalid action=drop comment="Drop invalid connections"
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# FIREWALL - SSH BRUTE-FORCE PROTECTION
|
||||||
|
# ============================================
|
||||||
add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment="Drop SSH brute force"
|
add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment="Drop SSH brute force"
|
||||||
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=1w
|
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=1w
|
||||||
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=1m
|
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=1m
|
||||||
|
|
@ -349,10 +377,8 @@ add chain=input protocol=udp dst-port=53 action=drop comment="Drop external DNS
|
||||||
add chain=input protocol=tcp dst-port=53 action=drop comment="Drop external DNS TCP queries"
|
add chain=input protocol=tcp dst-port=53 action=drop comment="Drop external DNS TCP queries"
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# FIREWALL - BASIC RULES
|
# FIREWALL - ALLOWED SERVICES
|
||||||
# ============================================
|
# ============================================
|
||||||
add chain=input connection-state=established,related action=accept comment="Accept established connections"
|
|
||||||
add chain=input connection-state=invalid action=drop comment="Drop invalid connections"
|
|
||||||
add chain=input protocol=icmp action=accept comment="Accept ICMP (ping)"
|
add chain=input protocol=icmp action=accept comment="Accept ICMP (ping)"
|
||||||
add chain=input protocol=tcp dst-port=22 action=accept comment="Accept SSH"
|
add chain=input protocol=tcp dst-port=22 action=accept comment="Accept SSH"
|
||||||
add chain=input protocol=tcp dst-port=8291 action=accept comment="Accept WinBox"
|
add chain=input protocol=tcp dst-port=8291 action=accept comment="Accept WinBox"
|
||||||
|
|
@ -375,6 +401,11 @@ add chain=input action=drop comment="Drop all other input"
|
||||||
# NAT - MASQUERADE
|
# NAT - MASQUERADE
|
||||||
# ============================================
|
# ============================================
|
||||||
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# SECURITY - REMOVE AUTORUN AFTER EXECUTION
|
||||||
|
# ============================================
|
||||||
|
/file remove [find name~"autorun"]
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
sync
|
sync
|
||||||
|
|
@ -467,6 +498,7 @@ log_info "CHR installation with basic config completed!"
|
||||||
log_info "=========================================="
|
log_info "=========================================="
|
||||||
echo ""
|
echo ""
|
||||||
echo "CHR will be available at: ${ADDRESS%/*}"
|
echo "CHR will be available at: ${ADDRESS%/*}"
|
||||||
|
echo "Admin password: ${ADMIN_PASSWORD}"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${GREEN}Configured:${NC}"
|
echo -e "${GREEN}Configured:${NC}"
|
||||||
echo " • Router name: $ROUTER_NAME"
|
echo " • Router name: $ROUTER_NAME"
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,20 @@ log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||||||
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||||
log_debug() { echo -e "${CYAN}[DEBUG]${NC} $1"; }
|
log_debug() { echo -e "${CYAN}[DEBUG]${NC} $1"; }
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# ГЕНЕРАЦИЯ ПАРОЛЕЙ И САНИТИЗАЦИЯ
|
||||||
|
# ============================================
|
||||||
|
generate_password() {
|
||||||
|
local length=$1
|
||||||
|
tr -dc 'A-Za-z0-9' < /dev/urandom | head -c "$length"
|
||||||
|
}
|
||||||
|
|
||||||
|
sanitize_input() {
|
||||||
|
local input="$1"
|
||||||
|
# Удаляем опасные символы: ; " ' ` $ \ / и переносы строк
|
||||||
|
echo "$input" | tr -d ';"'\''`$\\/\n\r' | head -c 64
|
||||||
|
}
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# КОНФИГУРАЦИЯ
|
# КОНФИГУРАЦИЯ
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -23,8 +37,8 @@ CHR_IMG="chr-${CHR_VERSION}.img"
|
||||||
WORK_DIR="/tmp/chr-install"
|
WORK_DIR="/tmp/chr-install"
|
||||||
MOUNT_POINT="/mnt/chr"
|
MOUNT_POINT="/mnt/chr"
|
||||||
|
|
||||||
# Настройки CHR
|
# Настройки CHR (пароль генерируется автоматически если не указан)
|
||||||
ADMIN_PASSWORD="PASSWORD"
|
ADMIN_PASSWORD=""
|
||||||
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
||||||
ROUTER_NAME="MikroTik-CHR"
|
ROUTER_NAME="MikroTik-CHR"
|
||||||
TIMEZONE="Europe/Moscow"
|
TIMEZONE="Europe/Moscow"
|
||||||
|
|
@ -52,7 +66,7 @@ usage() {
|
||||||
echo " --yes, -y Без подтверждений (автоматический режим)"
|
echo " --yes, -y Без подтверждений (автоматический режим)"
|
||||||
echo " --reboot Автоматическая перезагрузка (требует --yes)"
|
echo " --reboot Автоматическая перезагрузка (требует --yes)"
|
||||||
echo " --version VER Версия CHR (по умолчанию: $CHR_VERSION)"
|
echo " --version VER Версия CHR (по умолчанию: $CHR_VERSION)"
|
||||||
echo " --password PASS Пароль admin (по умолчанию: $ADMIN_PASSWORD)"
|
echo " --password PASS Пароль admin (генерируется автоматически)"
|
||||||
echo " --name NAME Имя роутера (по умолчанию: $ROUTER_NAME)"
|
echo " --name NAME Имя роутера (по умолчанию: $ROUTER_NAME)"
|
||||||
echo " --timezone TZ Часовой пояс (по умолчанию: $TIMEZONE)"
|
echo " --timezone TZ Часовой пояс (по умолчанию: $TIMEZONE)"
|
||||||
echo " --dns SERVERS DNS серверы (по умолчанию: $DNS_SERVERS)"
|
echo " --dns SERVERS DNS серверы (по умолчанию: $DNS_SERVERS)"
|
||||||
|
|
@ -87,19 +101,19 @@ while [[ $# -gt 0 ]]; do
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--password)
|
--password)
|
||||||
ADMIN_PASSWORD="$2"
|
ADMIN_PASSWORD=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--name)
|
--name)
|
||||||
ROUTER_NAME="$2"
|
ROUTER_NAME=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--timezone)
|
--timezone)
|
||||||
TIMEZONE="$2"
|
TIMEZONE=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--dns)
|
--dns)
|
||||||
DNS_SERVERS="$2"
|
DNS_SERVERS=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
-h|--help)
|
-h|--help)
|
||||||
|
|
@ -112,6 +126,14 @@ while [[ $# -gt 0 ]]; do
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# ГЕНЕРАЦИЯ ПАРОЛЯ (если не задан)
|
||||||
|
# ============================================
|
||||||
|
if [[ -z "$ADMIN_PASSWORD" ]]; then
|
||||||
|
ADMIN_PASSWORD=$(generate_password 16)
|
||||||
|
log_info "Сгенерирован пароль admin: $ADMIN_PASSWORD"
|
||||||
|
fi
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# ПРОВЕРКА ROOT
|
# ПРОВЕРКА ROOT
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -319,9 +341,15 @@ cat > "$MOUNT_POINT/rw/autorun.scr" <<EOF
|
||||||
/ip service set winbox disabled=no
|
/ip service set winbox disabled=no
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# ФАЙРВОЛ - ЗАЩИТА ОТ БРУТФОРСА SSH
|
# ФАЙРВОЛ - БАЗОВЫЕ ПРАВИЛА (в начале для производительности)
|
||||||
# ============================================
|
# ============================================
|
||||||
/ip firewall filter
|
/ip firewall filter
|
||||||
|
add chain=input connection-state=established,related action=accept comment="Accept established connections"
|
||||||
|
add chain=input connection-state=invalid action=drop comment="Drop invalid connections"
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# ФАЙРВОЛ - ЗАЩИТА ОТ БРУТФОРСА SSH
|
||||||
|
# ============================================
|
||||||
add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment="Drop SSH brute force"
|
add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment="Drop SSH brute force"
|
||||||
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=1w
|
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=1w
|
||||||
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=1m
|
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=1m
|
||||||
|
|
@ -349,10 +377,8 @@ add chain=input protocol=udp dst-port=53 action=drop comment="Drop external DNS
|
||||||
add chain=input protocol=tcp dst-port=53 action=drop comment="Drop external DNS TCP queries"
|
add chain=input protocol=tcp dst-port=53 action=drop comment="Drop external DNS TCP queries"
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# ФАЙРВОЛ - БАЗОВЫЕ ПРАВИЛА
|
# ФАЙРВОЛ - РАЗРЕШЁННЫЕ СЕРВИСЫ
|
||||||
# ============================================
|
# ============================================
|
||||||
add chain=input connection-state=established,related action=accept comment="Accept established connections"
|
|
||||||
add chain=input connection-state=invalid action=drop comment="Drop invalid connections"
|
|
||||||
add chain=input protocol=icmp action=accept comment="Accept ICMP (ping)"
|
add chain=input protocol=icmp action=accept comment="Accept ICMP (ping)"
|
||||||
add chain=input protocol=tcp dst-port=22 action=accept comment="Accept SSH"
|
add chain=input protocol=tcp dst-port=22 action=accept comment="Accept SSH"
|
||||||
add chain=input protocol=tcp dst-port=8291 action=accept comment="Accept WinBox"
|
add chain=input protocol=tcp dst-port=8291 action=accept comment="Accept WinBox"
|
||||||
|
|
@ -375,6 +401,11 @@ add chain=input action=drop comment="Drop all other input"
|
||||||
# NAT - MASQUERADE
|
# NAT - MASQUERADE
|
||||||
# ============================================
|
# ============================================
|
||||||
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# БЕЗОПАСНОСТЬ - УДАЛЕНИЕ AUTORUN ПОСЛЕ ВЫПОЛНЕНИЯ
|
||||||
|
# ============================================
|
||||||
|
/file remove [find name~"autorun"]
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
sync
|
sync
|
||||||
|
|
@ -467,6 +498,7 @@ log_info "Установка CHR с базовой настройкой заве
|
||||||
log_info "=========================================="
|
log_info "=========================================="
|
||||||
echo ""
|
echo ""
|
||||||
echo "CHR будет доступен: ${ADDRESS%/*}"
|
echo "CHR будет доступен: ${ADDRESS%/*}"
|
||||||
|
echo "Admin пароль: ${ADMIN_PASSWORD}"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${GREEN}Настроено:${NC}"
|
echo -e "${GREEN}Настроено:${NC}"
|
||||||
echo " • Имя роутера: $ROUTER_NAME"
|
echo " • Имя роутера: $ROUTER_NAME"
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,20 @@ log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||||||
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||||
log_debug() { echo -e "${CYAN}[DEBUG]${NC} $1"; }
|
log_debug() { echo -e "${CYAN}[DEBUG]${NC} $1"; }
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# PASSWORD GENERATION AND SANITIZATION
|
||||||
|
# ============================================
|
||||||
|
generate_password() {
|
||||||
|
local length=$1
|
||||||
|
tr -dc 'A-Za-z0-9' < /dev/urandom | head -c "$length"
|
||||||
|
}
|
||||||
|
|
||||||
|
sanitize_input() {
|
||||||
|
local input="$1"
|
||||||
|
# Remove dangerous characters: ; " ' ` $ \ / and newlines
|
||||||
|
echo "$input" | tr -d ';"'\''`$\\/\n\r' | head -c 64
|
||||||
|
}
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -23,8 +37,8 @@ CHR_IMG="chr-${CHR_VERSION}.img"
|
||||||
WORK_DIR="/tmp/chr-install"
|
WORK_DIR="/tmp/chr-install"
|
||||||
MOUNT_POINT="/mnt/chr"
|
MOUNT_POINT="/mnt/chr"
|
||||||
|
|
||||||
# CHR Settings
|
# CHR Settings (password auto-generated if not specified)
|
||||||
ADMIN_PASSWORD="PASSWORD"
|
ADMIN_PASSWORD=""
|
||||||
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
||||||
|
|
||||||
# Flags
|
# Flags
|
||||||
|
|
@ -47,7 +61,7 @@ usage() {
|
||||||
echo " --yes, -y No confirmations (automatic mode)"
|
echo " --yes, -y No confirmations (automatic mode)"
|
||||||
echo " --reboot Automatic reboot (requires --yes)"
|
echo " --reboot Automatic reboot (requires --yes)"
|
||||||
echo " --version VER CHR version (default: $CHR_VERSION)"
|
echo " --version VER CHR version (default: $CHR_VERSION)"
|
||||||
echo " --password PASS Admin password (default: $ADMIN_PASSWORD)"
|
echo " --password PASS Admin password (auto-generated)"
|
||||||
echo " -h, --help Show help"
|
echo " -h, --help Show help"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Examples:"
|
echo "Examples:"
|
||||||
|
|
@ -87,7 +101,7 @@ while [[ $# -gt 0 ]]; do
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--password)
|
--password)
|
||||||
ADMIN_PASSWORD="$2"
|
ADMIN_PASSWORD=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
-h|--help)
|
-h|--help)
|
||||||
|
|
@ -100,6 +114,14 @@ while [[ $# -gt 0 ]]; do
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# PASSWORD GENERATION (if not specified)
|
||||||
|
# ============================================
|
||||||
|
if [[ -z "$ADMIN_PASSWORD" ]]; then
|
||||||
|
ADMIN_PASSWORD=$(generate_password 16)
|
||||||
|
log_info "Generated admin password: $ADMIN_PASSWORD"
|
||||||
|
fi
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# ROOT CHECK
|
# ROOT CHECK
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -308,6 +330,11 @@ else
|
||||||
/ip route add gateway=${GATEWAY}
|
/ip route add gateway=${GATEWAY}
|
||||||
/user set 0 name=admin password=${ADMIN_PASSWORD}
|
/user set 0 name=admin password=${ADMIN_PASSWORD}
|
||||||
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# SECURITY - REMOVE AUTORUN AFTER EXECUTION
|
||||||
|
# ============================================
|
||||||
|
/file remove [find name~"autorun"]
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Sync filesystem before unmounting
|
# Sync filesystem before unmounting
|
||||||
|
|
@ -419,6 +446,7 @@ if [[ "$SKIP_AUTORUN" == true ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "CHR will be available at: ${ADDRESS%/*}"
|
echo "CHR will be available at: ${ADDRESS%/*}"
|
||||||
|
echo "Admin password: ${ADMIN_PASSWORD}"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
if [[ "$AUTO_YES" == true && "$AUTO_REBOOT" == true ]]; then
|
if [[ "$AUTO_YES" == true && "$AUTO_REBOOT" == true ]]; then
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,20 @@ log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||||||
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||||
log_debug() { echo -e "${CYAN}[DEBUG]${NC} $1"; }
|
log_debug() { echo -e "${CYAN}[DEBUG]${NC} $1"; }
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# ГЕНЕРАЦИЯ ПАРОЛЕЙ И САНИТИЗАЦИЯ
|
||||||
|
# ============================================
|
||||||
|
generate_password() {
|
||||||
|
local length=$1
|
||||||
|
tr -dc 'A-Za-z0-9' < /dev/urandom | head -c "$length"
|
||||||
|
}
|
||||||
|
|
||||||
|
sanitize_input() {
|
||||||
|
local input="$1"
|
||||||
|
# Удаляем опасные символы: ; " ' ` $ \ / и переносы строк
|
||||||
|
echo "$input" | tr -d ';"'\''`$\\/\n\r' | head -c 64
|
||||||
|
}
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# КОНФИГУРАЦИЯ
|
# КОНФИГУРАЦИЯ
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -23,8 +37,8 @@ CHR_IMG="chr-${CHR_VERSION}.img"
|
||||||
WORK_DIR="/tmp/chr-install"
|
WORK_DIR="/tmp/chr-install"
|
||||||
MOUNT_POINT="/mnt/chr"
|
MOUNT_POINT="/mnt/chr"
|
||||||
|
|
||||||
# Настройки CHR
|
# Настройки CHR (пароль генерируется автоматически если не указан)
|
||||||
ADMIN_PASSWORD="PASSWORD"
|
ADMIN_PASSWORD=""
|
||||||
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
DNS_SERVERS="8.8.8.8,8.8.4.4"
|
||||||
|
|
||||||
# Флаги
|
# Флаги
|
||||||
|
|
@ -47,7 +61,7 @@ usage() {
|
||||||
echo " --yes, -y Без подтверждений (автоматический режим)"
|
echo " --yes, -y Без подтверждений (автоматический режим)"
|
||||||
echo " --reboot Автоматическая перезагрузка (требует --yes)"
|
echo " --reboot Автоматическая перезагрузка (требует --yes)"
|
||||||
echo " --version VER Версия CHR (по умолчанию: $CHR_VERSION)"
|
echo " --version VER Версия CHR (по умолчанию: $CHR_VERSION)"
|
||||||
echo " --password PASS Пароль admin (по умолчанию: $ADMIN_PASSWORD)"
|
echo " --password PASS Пароль admin (генерируется автоматически)"
|
||||||
echo " -h, --help Показать справку"
|
echo " -h, --help Показать справку"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Примеры:"
|
echo "Примеры:"
|
||||||
|
|
@ -87,7 +101,7 @@ while [[ $# -gt 0 ]]; do
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--password)
|
--password)
|
||||||
ADMIN_PASSWORD="$2"
|
ADMIN_PASSWORD=$(sanitize_input "$2")
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
-h|--help)
|
-h|--help)
|
||||||
|
|
@ -100,6 +114,14 @@ while [[ $# -gt 0 ]]; do
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# ГЕНЕРАЦИЯ ПАРОЛЯ (если не задан)
|
||||||
|
# ============================================
|
||||||
|
if [[ -z "$ADMIN_PASSWORD" ]]; then
|
||||||
|
ADMIN_PASSWORD=$(generate_password 16)
|
||||||
|
log_info "Сгенерирован пароль admin: $ADMIN_PASSWORD"
|
||||||
|
fi
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# ПРОВЕРКА ROOT
|
# ПРОВЕРКА ROOT
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
@ -308,6 +330,11 @@ else
|
||||||
/ip route add gateway=${GATEWAY}
|
/ip route add gateway=${GATEWAY}
|
||||||
/user set 0 name=admin password=${ADMIN_PASSWORD}
|
/user set 0 name=admin password=${ADMIN_PASSWORD}
|
||||||
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT for all outgoing traffic"
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# БЕЗОПАСНОСТЬ - УДАЛЕНИЕ AUTORUN ПОСЛЕ ВЫПОЛНЕНИЯ
|
||||||
|
# ============================================
|
||||||
|
/file remove [find name~"autorun"]
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Синхронизация ФС перед размонтированием
|
# Синхронизация ФС перед размонтированием
|
||||||
|
|
@ -419,6 +446,7 @@ if [[ "$SKIP_AUTORUN" == true ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "CHR будет доступен: ${ADDRESS%/*}"
|
echo "CHR будет доступен: ${ADDRESS%/*}"
|
||||||
|
echo "Admin пароль: ${ADMIN_PASSWORD}"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
if [[ "$AUTO_YES" == true && "$AUTO_REBOOT" == true ]]; then
|
if [[ "$AUTO_YES" == true && "$AUTO_REBOOT" == true ]]; then
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue