Skip to content

Commit deb2d5e

Browse files
committed
Add configurable unknown SNI policy — mask (default) or drop (#40)
New setting UNKNOWN_SNI_ACTION controls how the engine handles TLS connections whose SNI doesn't match the configured tls_domain. - mask (default): redirect to mask backend, keeps old proxy links working after domain changes - drop (strict): reject immediately, more secure but breaks old links that have a previous domain encoded in the ee-prefixed secret Configurable via TUI (Security & Routing > Unknown SNI Policy) or CLI (mtproxymax sni-policy [mask|drop]). Changes hot-reload without container restart.
1 parent 0299262 commit deb2d5e

1 file changed

Lines changed: 56 additions & 2 deletions

File tree

mtproxymax.sh

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ BLOCKLIST_COUNTRIES=""
114114
MASKING_ENABLED="true"
115115
MASKING_HOST=""
116116
MASKING_PORT=443
117+
UNKNOWN_SNI_ACTION="mask"
117118
TELEGRAM_ENABLED="false"
118119
TELEGRAM_BOT_TOKEN=""
119120
TELEGRAM_CHAT_ID=""
@@ -589,6 +590,7 @@ BLOCKLIST_COUNTRIES='${BLOCKLIST_COUNTRIES}'
589590
MASKING_ENABLED='${MASKING_ENABLED}'
590591
MASKING_HOST='${MASKING_HOST}'
591592
MASKING_PORT='${MASKING_PORT}'
593+
UNKNOWN_SNI_ACTION='${UNKNOWN_SNI_ACTION}'
592594
593595
# Telegram Integration
594596
TELEGRAM_ENABLED='${TELEGRAM_ENABLED}'
@@ -630,7 +632,7 @@ load_settings() {
630632
case "$key" in
631633
PROXY_PORT|PROXY_METRICS_PORT|PROXY_DOMAIN|PROXY_CONCURRENCY|\
632634
PROXY_CPUS|PROXY_MEMORY|CUSTOM_IP|FAKE_CERT_LEN|PROXY_PROTOCOL|PROXY_PROTOCOL_TRUSTED_CIDRS|AD_TAG|GEOBLOCK_MODE|BLOCKLIST_COUNTRIES|\
633-
MASKING_ENABLED|MASKING_HOST|MASKING_PORT|\
635+
MASKING_ENABLED|MASKING_HOST|MASKING_PORT|UNKNOWN_SNI_ACTION|\
634636
TELEGRAM_ENABLED|TELEGRAM_BOT_TOKEN|TELEGRAM_CHAT_ID|\
635637
TELEGRAM_INTERVAL|TELEGRAM_ALERTS_ENABLED|TELEGRAM_SERVER_LABEL|\
636638
AUTO_UPDATE_ENABLED)
@@ -647,6 +649,7 @@ load_settings() {
647649
[[ "$PROXY_CONCURRENCY" =~ ^[0-9]+$ ]] || PROXY_CONCURRENCY=8192
648650
[[ "$PROXY_PROTOCOL" == "true" ]] || PROXY_PROTOCOL="false"
649651
[[ "$GEOBLOCK_MODE" == "whitelist" ]] || GEOBLOCK_MODE="blacklist"
652+
[[ "$UNKNOWN_SNI_ACTION" == "drop" ]] || UNKNOWN_SNI_ACTION="mask"
650653
[[ "$TELEGRAM_INTERVAL" =~ ^[0-9]+$ ]] || TELEGRAM_INTERVAL=6
651654
[[ "$TELEGRAM_CHAT_ID" =~ ^-?[0-9]+$ ]] || TELEGRAM_CHAT_ID=""
652655
}
@@ -1082,7 +1085,7 @@ client_ack = 90
10821085
10831086
[censorship]
10841087
tls_domain = "${domain}"
1085-
unknown_sni_action = "mask"
1088+
unknown_sni_action = "${UNKNOWN_SNI_ACTION:-mask}"
10861089
mask = ${mask_enabled}
10871090
mask_port = ${mask_port}
10881091
$([ "$mask_enabled" = "true" ] && [ -n "$mask_host" ] && echo "mask_host = \"${mask_host}\"")
@@ -4970,6 +4973,7 @@ show_cli_help() {
49704973
echo -e " ${GREEN}domain${NC} [get|clear|<host>] Show, clear, or change FakeTLS domain"
49714974
echo -e " ${GREEN}adtag${NC} [set <hex>|remove|view] Manage ad-tag"
49724975
echo -e " ${GREEN}geoblock${NC} [add|remove|list|clear] Manage geo-blocking"
4976+
echo -e " ${GREEN}sni-policy${NC} [mask|drop] Unknown SNI action (mask=permissive, drop=strict)"
49734977
echo ""
49744978
echo -e " ${BOLD}Monitoring:${NC}"
49754979
echo -e " ${GREEN}traffic${NC} Show traffic stats"
@@ -5592,6 +5596,28 @@ cli_main() {
55925596
esac
55935597
;;
55945598

5599+
sni-policy)
5600+
load_settings
5601+
case "$1" in
5602+
mask)
5603+
check_root
5604+
UNKNOWN_SNI_ACTION="mask"; save_settings; reload_proxy_config
5605+
log_success "Unknown SNI policy set to Mask (permissive)"
5606+
;;
5607+
drop)
5608+
check_root
5609+
UNKNOWN_SNI_ACTION="drop"; save_settings; reload_proxy_config
5610+
log_success "Unknown SNI policy set to Drop (strict)"
5611+
;;
5612+
"")
5613+
echo -e " ${BOLD}Unknown SNI policy:${NC} ${UNKNOWN_SNI_ACTION}"
5614+
;;
5615+
*)
5616+
log_error "Usage: mtproxymax sni-policy [mask|drop]"; return 1
5617+
;;
5618+
esac
5619+
;;
5620+
55955621
traffic)
55965622
load_settings
55975623
load_secrets
@@ -5859,15 +5885,43 @@ show_security_menu() {
58595885
clear_screen
58605886
draw_header "SECURITY & ROUTING"
58615887
echo ""
5888+
local sni_label
5889+
if [ "$UNKNOWN_SNI_ACTION" = "drop" ]; then
5890+
sni_label="${RED}Drop${NC} (strict)"
5891+
else
5892+
sni_label="${GREEN}Mask${NC} (permissive)"
5893+
fi
58625894
echo -e " ${DIM}[1]${NC} Geo-Blocking"
58635895
echo -e " ${DIM}[2]${NC} Proxy Chaining (Upstreams)"
5896+
echo -e " ${DIM}[3]${NC} Unknown SNI Policy: ${sni_label}"
58645897
echo -e " ${DIM}[0]${NC} Back"
58655898

58665899
local choice
58675900
choice=$(read_choice "Choice" "0")
58685901
case "$choice" in
58695902
1) show_geoblock_menu ;;
58705903
2) show_upstream_menu ;;
5904+
3)
5905+
echo ""
5906+
echo -e " ${BOLD}Unknown SNI Policy${NC}"
5907+
echo -e " Controls how the engine handles TLS connections whose SNI"
5908+
echo -e " doesn't match your configured domain."
5909+
echo ""
5910+
echo -e " ${DIM}[1]${NC} ${GREEN}Mask${NC} — redirect to mask backend (recommended)"
5911+
echo -e " Keeps old proxy links working after domain changes."
5912+
echo -e " ${DIM}[2]${NC} ${RED}Drop${NC} — reject immediately (strict)"
5913+
echo -e " More secure, but old proxy links with a previous"
5914+
echo -e " domain will stop working."
5915+
echo ""
5916+
local sni_choice
5917+
sni_choice=$(read_choice "Choice" "0")
5918+
case "$sni_choice" in
5919+
1) UNKNOWN_SNI_ACTION="mask"; save_settings; reload_proxy_config; log_success "Unknown SNI policy set to Mask" ;;
5920+
2) UNKNOWN_SNI_ACTION="drop"; save_settings; reload_proxy_config; log_success "Unknown SNI policy set to Drop" ;;
5921+
*) ;;
5922+
esac
5923+
press_any_key
5924+
;;
58715925
0|"") return ;;
58725926
*) ;;
58735927
esac

0 commit comments

Comments
 (0)