Ostatnio aktywny 1 month ago

gistfile1.txt Surowy
1sed -n '98,170p' /etc/wireguard/wgctl/modules/rule.module.sh
2
3# ============================================
4# Rule Application
5# ============================================
6
7function rule::apply() {
8 local rule_name="${1:?rule_name required}"
9 local client_ip="${2:?client_ip required}"
10 local peer_name="${3:-}"
11
12 rule::require_exists "$rule_name" || return 1
13
14 if [[ -z "$peer_name" ]]; then
15 peer_name=$(peers::find_by_ip "$client_ip")
16 fi
17
18 log::debug "rule::apply: peer_name=$peer_name ip=$client_ip"
19
20 # Check if already applied
21 if rule::is_applied "$rule_name" "$client_ip"; then
22 log::wg "Rule '${rule_name}' already applied to: ${client_ip}"
23 [[ -n "$peer_name" ]] && peers::set_meta "$peer_name" "rule" "$rule_name"
24 return 0
25 fi
26
27 # Process block_ips
28 while IFS= read -r block_ip; do
29 [[ -z "$block_ip" ]] && continue
30 fw::block_ip "$client_ip" "$block_ip"
31 done < <(rule::get "$rule_name" "block_ips")
32
33 # Process block_ports
34 while IFS= read -r entry; do
35 [[ -z "$entry" ]] && continue
36 local target port proto
37 IFS=":" read -r target port proto <<< "$entry"
38 proto="${proto:-tcp}"
39 fw::block_port "$client_ip" "$target" "$port" "$proto"
40 done < <(rule::get "$rule_name" "block_ports")
41
42 # Process allow_ips (inserted before blocks)
43 while IFS= read -r allow_ip; do
44 [[ -z "$allow_ip" ]] && continue
45 fw::allow_ip "$client_ip" "$allow_ip"
46 done < <(rule::get "$rule_name" "allow_ips")
47
48 # Process allow_ports (highest priority)
49 while IFS= read -r entry; do
50 [[ -z "$entry" ]] && continue
51 local target port proto
52 IFS=":" read -r target port proto <<< "$entry"
53 proto="${proto:-tcp}"
54 fw::allow_port "$client_ip" "$target" "$port" "$proto"
55 done < <(rule::get "$rule_name" "allow_ports")
56
57 # Persist rule assignment
58 [[ -n "$peer_name" ]] && peers::set_meta "$peer_name" "rule" "$rule_name"
59
60 # DNS redirect
61 local dns_redirect
62 dns_redirect=$(rule::get "$rule_name" "dns_redirect")
63 if [[ "$dns_redirect" == "true" ]]; then
64 local peer_subnet
65 peer_subnet=$(peers::get_ip "$peer_name" | cut -d'.' -f1-3)
66 if ! fw::_nat_exists -i wg0 -s "${peer_subnet}.0/24" \
67 -p udp --dport 53 -j DNAT \
68 --to-destination "$(config::dns):53" 2>/dev/null; then
69 rule::apply_dns_redirect "${peer_subnet}.0/24"
70 log::debug "dns_redirect: applied for ${peer_subnet}.0/24"
71 else
72 log::debug "dns_redirect: already applied for ${peer_subnet}.0/24"
73 fi
74 fi
75root@wireguard:/etc/wireguard/wgctl#