Skip to content

Commit 20efb7e

Browse files
committed
pbr: update to 1.2.2-r12
* fix: detect/support point-to-point interfaces in dynamic routing mode * fix: avoid IPv4/IPv6 address collisions on Tor policies * fix: do not set triggers on boot when service is disabled in config * fix: more robust forward stop/enable Signed-off-by: Stan Grishin <stangri@melmac.ca>
1 parent f52f186 commit 20efb7e

File tree

2 files changed

+86
-38
lines changed

2 files changed

+86
-38
lines changed

net/pbr/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk
55

66
PKG_NAME:=pbr
77
PKG_VERSION:=1.2.2
8-
PKG_RELEASE:=10
8+
PKG_RELEASE:=12
99
PKG_LICENSE:=AGPL-3.0-or-later
1010
PKG_MAINTAINER:=Stan Grishin <stangri@melmac.ca>
1111

net/pbr/files/etc/init.d/pbr

Lines changed: 85 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,7 @@ mwan4_get_iface_list() {
468468
local iface_list=""
469469
mwan4_is_installed || return 1
470470

471+
# shellcheck disable=SC2329
471472
_mwan4_collect_iface() {
472473
local en
473474
config_get_bool en "$1" 'enabled' '0'
@@ -485,6 +486,7 @@ mwan4_get_strategy_list() {
485486
local strategy_list=""
486487
mwan4_is_installed || return 1
487488

489+
# shellcheck disable=SC2329
488490
_mwan4_collect_strategy() { strategy_list="${strategy_list}${1} "; }
489491
config_load 'mwan4'
490492
config_foreach _mwan4_collect_strategy 'strategy'
@@ -704,6 +706,7 @@ process_url() {
704706
}
705707

706708
load_package_config() {
709+
[ -n "$loadPackageConfigFlag" ] && return 0
707710
local param="$1"
708711
config_load "$packageName"
709712
config_get config_compat 'config' 'config_compat'
@@ -850,7 +853,7 @@ load_environment() {
850853
case "$param" in
851854
on_boot|on_start)
852855
output 1 "Loading environment ($param) "
853-
[ -n "$loadPackageConfigFlag" ] || load_package_config "$param"
856+
load_package_config "$param"
854857
if [ -z "$enabled" ]; then
855858
output 1 "$_FAIL_\n"
856859
json add error 'errorServiceDisabled'
@@ -872,11 +875,11 @@ load_environment() {
872875
output 1 "$_OK_\n"
873876
;;
874877
on_triggers)
875-
[ -n "$loadPackageConfigFlag" ] || load_package_config "$param"
878+
load_package_config "$param"
876879
;;
877880
on_interface_reload|on_reload|on_stop|*)
878881
output 1 "Loading environment ($param) "
879-
[ -n "$loadPackageConfigFlag" ] || load_package_config "$param"
882+
load_package_config "$param"
880883
load_network "$param"
881884
resolver 'check_support'
882885
output 1 "$_OK_\n"
@@ -1481,6 +1484,7 @@ resolver() {
14811484

14821485
netifd() {
14831486
# Usage: netifd install [iface] | netifd remove [iface] | netifd uninstall
1487+
# shellcheck disable=SC2329
14841488
_netifd_process_interface() {
14851489
local iface="$1" action="${2:-install}"
14861490
# Normalize table name for split uplink scenarios
@@ -1578,6 +1582,7 @@ netifd() {
15781582
nft add rule inet "$nftTable" "${nftPrefix}_mark_${_mark} ${nftRuleParams} meta mark set (meta mark & ${fw_maskXor}) | ${_mark}"
15791583
nft add rule inet "$nftTable" "${nftPrefix}_mark_${_mark} return"
15801584
fi
1585+
# shellcheck disable=SC2155
15811586
local dscp="$(uci_get "$packageName" 'config' "${iface}_dscp")"
15821587
if [ "${dscp:-0}" -ge '1' ] && [ "${dscp:-0}" -le '63' ]; then
15831588
if ! is_split_uplink || ! is_uplink6 "$iface"; then
@@ -1614,16 +1619,20 @@ netifd() {
16141619
fi
16151620
}
16161621

1617-
load_package_config
1618-
json 'init'
1619-
1622+
local _uplinkMark _uplinkPriority _uplinkTableID
16201623
local action="${1:-install}"
16211624
local target_iface="$2"
1625+
1626+
load_package_config "on_netifd_${action}"
1627+
json 'init'
1628+
1629+
# shellcheck disable=SC2155
16221630
local lan_priority="$((uplink_ip_rules_priority + 1000))"
1631+
# shellcheck disable=SC2155
16231632
local mark="$(printf '0x%06x' "$uplink_mark")"
16241633
local priority="$uplink_ip_rules_priority"
1634+
# shellcheck disable=SC2155
16251635
local tid="$(get_rt_tables_non_pbr_next_id)"
1626-
local _uplinkMark _uplinkPriority _uplinkTableID
16271636

16281637
case "$action" in
16291638
check)
@@ -1694,8 +1703,12 @@ netifd() {
16941703
uci_commit "$packageName"
16951704
uci_commit 'network'
16961705
sync
1697-
output "Restarting network ${action:+(on_${action}) }"
1698-
{ /etc/init.d/network 'reload'; /etc/init.d/firewall 'reload'; } >/dev/null 2>&1 && output_okbn || output_failn
1706+
output "Reloading network and firewall ${action:+(on_${action}) }"
1707+
if { /etc/init.d/network 'reload' && /etc/init.d/firewall 'reload'; } >/dev/null 2>&1; then
1708+
output_okbn
1709+
else
1710+
output_failn
1711+
fi
16991712
}
17001713

17011714
# original idea by @egc112: https://github.com/egc112/OpenWRT-egc-add-on/tree/main/stop-dns-leak
@@ -1708,6 +1721,12 @@ dns_policy_routing() {
17081721
local dest_dns_ipv4="$6" dest_dns_ipv6="$7"
17091722
local chain='dstnat' iface='dns'
17101723

1724+
if [ -z "$src_addr" ]; then
1725+
processDnsPolicyError='true'
1726+
json add error 'errorPolicyNoSrcDest' "$name"
1727+
return 1
1728+
fi
1729+
17111730
if [ -z "${dest_dns_ipv4}${dest_dns_ipv6}" ]; then
17121731
processDnsPolicyError='true'
17131732
json add error 'errorPolicyProcessNoInterfaceDns' "'$dest_dns'"
@@ -1816,6 +1835,12 @@ policy_routing() {
18161835
chain="${chain:-prerouting}"
18171836
mark=$(eval echo "\$mark_${iface//-/_}")
18181837

1838+
if [ -z "${src_addr}${dest_addr}${src_port}${dest_port}${proto}" ]; then
1839+
processPolicyError='true'
1840+
json add error 'errorPolicyNoSrcDest' "$name"
1841+
return 1
1842+
fi
1843+
18191844
if [ -z "$ipv6_enabled" ] && \
18201845
{ is_ipv6 "$(str_first_word "$src_addr")" || is_ipv6 "$(str_first_word "$dest_addr")"; }; then
18211846
processPolicyError='true'
@@ -1991,8 +2016,14 @@ policy_routing() {
19912016
for dest_i in dest_udp_53 dest_tcp_80 dest_udp_80 dest_tcp_443 dest_udp_443; do
19922017
eval "dest4=\$$dest_i"
19932018
eval "dest6=\$$dest_i"
1994-
nft4 "$param4" "$dest4" || ipv4_error='1'
1995-
nft6 "$param6" "$dest6" || ipv6_error='1'
2019+
if [ "$filter_group_src_addr" != 'ipv6' ] && [ "$filter_group_src_addr" != 'ipv6_negative' ] && \
2020+
[ "$filter_group_dest_addr" != 'ipv6' ] && [ "$filter_group_dest_addr" != 'ipv6_negative' ]; then
2021+
nft4 "$param4" "$dest4" || ipv4_error='1'
2022+
fi
2023+
if [ "$filter_group_src_addr" != 'ipv4' ] && [ "$filter_group_src_addr" != 'ipv4_negative' ] && \
2024+
[ "$filter_group_dest_addr" != 'ipv4' ] && [ "$filter_group_dest_addr" != 'ipv4_negative' ]; then
2025+
nft6 "$param6" "$dest6" || ipv6_error='1'
2026+
fi
19962027
if [ -n "$ipv6_enabled" ] && [ "$ipv4_error" -eq '1' ] && [ "$ipv6_error" -eq '1' ]; then
19972028
processPolicyError='true'
19982029
json add error 'errorPolicyProcessInsertionFailed' "$name"
@@ -2078,10 +2109,6 @@ dns_policy_process() {
20782109

20792110
unset processDnsPolicyError
20802111
output 2 "Routing '$name' DNS to $dest_dns:$dest_dns_port "
2081-
if [ -z "$src_addr" ]; then
2082-
json add error 'errorPolicyNoSrcDest' "$name"
2083-
output_fail; return 1;
2084-
fi
20852112
if [ -z "$dest_dns" ]; then
20862113
json add error 'errorPolicyNoDns' "$name"
20872114
output_fail; return 1;
@@ -2253,7 +2280,9 @@ interface_routing() {
22532280
ip -4 route flush table "$tid" >/dev/null 2>&1
22542281

22552282
if [ -n "$gw4" ] || [ -n "$strict_enforcement" ]; then
2256-
if [ -z "$gw4" ]; then
2283+
if [ -z "$gw4" ] && ip address show dev "$dev4" 2>/dev/null | grep -q "POINTOPOINT"; then
2284+
try ip -4 route replace default dev "$dev4" table "$tid" || ipv4_error=1
2285+
elif [ -z "$gw4" ]; then
22572286
try ip -4 route replace unreachable default table "$tid" || ipv4_error=1
22582287
else
22592288
try ip -4 route replace default via "$gw4" dev "$dev4" table "$tid" || ipv4_error=1
@@ -2274,7 +2303,9 @@ interface_routing() {
22742303
ip -6 route flush table "$tid" >/dev/null 2>&1
22752304

22762305
if { [ -n "$gw6" ] && [ "$gw6" != "::/0" ]; } || [ -n "$strict_enforcement" ]; then
2277-
if [ -z "$gw6" ] || [ "$gw6" = "::/0" ]; then
2306+
if { [ -z "$gw6" ] || [ "$gw6" = "::/0" ]; } && ip address show dev "$dev6" 2>/dev/null | grep -q "POINTOPOINT"; then
2307+
try ip -6 route replace default dev "$dev6" table "$tid" metric "$uplink_interface6_metric" || ipv6_error=1
2308+
elif [ -z "$gw6" ] || [ "$gw6" = "::/0" ]; then
22782309
try ip -6 route replace unreachable default table "$tid" || ipv6_error=1
22792310
elif ip -6 route list table main | grep -q " dev $dev6 "; then
22802311
if ip -6 address show dev "$dev6" | grep -q "BROADCAST"; then
@@ -2338,7 +2369,9 @@ interface_routing() {
23382369
ip -4 rule flush fwmark "${mark}/${fw_mask}" table "$tid" >/dev/null 2>&1
23392370
ip -4 route flush table "$tid" >/dev/null 2>&1
23402371
if [ -n "$gw4" ] || [ -n "$strict_enforcement" ]; then
2341-
if [ -z "$gw4" ]; then
2372+
if [ -z "$gw4" ] && ip address show dev "$dev4" 2>/dev/null | grep -q "POINTOPOINT"; then
2373+
try ip -4 route replace default dev "$dev4" table "$tid" || ipv4_error=1
2374+
elif [ -z "$gw4" ]; then
23422375
try ip -4 route replace unreachable default table "$tid" || ipv4_error=1
23432376
else
23442377
try ip -4 route replace default via "$gw4" dev "$dev4" table "$tid" || ipv4_error=1
@@ -2358,7 +2391,9 @@ interface_routing() {
23582391
ip -6 rule flush fwmark "${mark}/${fw_mask}" table "$tid" >/dev/null 2>&1
23592392
ip -6 route flush table "$tid" >/dev/null 2>&1
23602393
if { [ -n "$gw6" ] && [ "$gw6" != "::/0" ]; } || [ -n "$strict_enforcement" ]; then
2361-
if [ -z "$gw6" ] || [ "$gw6" = "::/0" ]; then
2394+
if { [ -z "$gw6" ] || [ "$gw6" = "::/0" ]; } && ip address show dev "$dev6" 2>/dev/null | grep -q "POINTOPOINT"; then
2395+
try ip -6 route replace default dev "$dev6" table "$tid" metric "$uplink_interface6_metric" || ipv6_error=1
2396+
elif [ -z "$gw6" ] || [ "$gw6" = "::/0" ]; then
23622397
try ip -6 route replace unreachable default table "$tid" || ipv6_error=1
23632398
elif ip -6 route list table main | grep -q " dev $dev6 "; then
23642399
if ip -6 address show dev "$dev6" | grep -q "BROADCAST"; then
@@ -2427,6 +2462,7 @@ process_interface() {
24272462
return 0
24282463
;;
24292464
create_global_rules)
2465+
# shellcheck disable=SC2329
24302466
_wg_server() {
24312467
local iface="$1"
24322468
if is_wg_server "$iface" && ! is_ignored_interface "$iface"; then
@@ -2750,30 +2786,33 @@ user_file_process() {
27502786
}
27512787

27522788
boot() {
2789+
load_package_config 'on_boot'
27532790
nft_file 'delete' 'main'
2754-
rc_procd start_service 'on_boot' && service_started 'on_boot'
2791+
[ -n "$enabled" ] || return 0
2792+
rc_procd start_service 'on_boot'
2793+
service_started 'on_boot'
27552794
}
27562795

27572796
on_interface_reload() {
2758-
if ! exists_lockfile; then
2759-
logger -t "$packageName" "Reload on interface change aborted: service is stopped."
2760-
return 0
2761-
else
2762-
rc_procd start_service 'on_interface_reload' "$1"
2763-
fi
2797+
exists_lockfile || return 1
2798+
rc_procd start_service 'on_interface_reload' "$1"
2799+
service_started 'on_interface_reload'
27642800
}
27652801

27662802
start_service() {
27672803
local param="$1"
27682804
local resolverStoredHash resolverNewHash reloadedIface
27692805
local i k
27702806

2771-
load_package_config "$param"
2772-
stop_forward
27732807
[ "$param" = 'on_boot' ] && pbrBootFlag=1 && return 0
2808+
27742809
json init
2775-
load_environment "${param:-on_start}" "$(load_validate_config)" || return 1
2810+
load_package_config "$param"
27762811

2812+
trap 'enable_forward' EXIT
2813+
stop_forward
2814+
2815+
load_environment "${param:-on_start}" "$(load_validate_config)" || return 1
27772816
output "Processing environment (${param:-on_start}) "
27782817
if ! is_wan_up "$param"; then
27792818
output_failn
@@ -2898,7 +2937,7 @@ start_service() {
28982937

28992938
json_add_int 'packageCompat' "$packageCompat"
29002939
json_add_object 'status'
2901-
[ -n "$gatewaySummary" ] && json_add_string 'gateways' "$gatewaySummary" || json add error 'errorNoGateways'
2940+
if [ -n "$gatewaySummary" ]; then json_add_string 'gateways' "$gatewaySummary"; else json_add_error 'errorNoGateways'; fi
29022941
json_close_object
29032942
json_add_array 'errors'
29042943
for k in $(json get errors); do
@@ -2921,13 +2960,14 @@ start_service() {
29212960
fi
29222961
procd_close_data
29232962
procd_close_instance
2924-
enable_forward
29252963
}
29262964

29272965
service_running() { is_service_running; }
29282966
service_started() {
2929-
[ -n "$pbrBootFlag" ] && return 0
29302967
local error warning c
2968+
enable_forward
2969+
trap - EXIT
2970+
[ -n "$pbrBootFlag" ] && return 0
29312971
if nft_file 'exists' 'main'; then
29322972
resolver 'compare_hash' && resolver 'restart'
29332973
[ -n "$gatewaySummary" ] && output "$serviceName started with gateways:\n${gatewaySummary}"
@@ -2964,12 +3004,15 @@ service_started() {
29643004
}
29653005
service_stopped() { procd_set_config_changed firewall; }
29663006

2967-
# shellcheck disable=SC2015
29683007
service_triggers() {
29693008
local n
29703009
if [ -n "$pbrBootFlag" ]; then
29713010
output "Setting trigger (on_boot) "
2972-
procd_add_raw_trigger "interface.*.up" "$procd_boot_trigger_delay" "/etc/init.d/${packageName}" start && output_okn || output_failn
3011+
if procd_add_raw_trigger "interface.*.up" "$procd_boot_trigger_delay" "/etc/init.d/${packageName}" start; then
3012+
output_okn
3013+
else
3014+
output_failn
3015+
fi
29733016
else
29743017
PROCD_RELOAD_DELAY=$(( procd_reload_delay * 1000 ))
29753018
procd_open_validate
@@ -2985,7 +3028,11 @@ service_triggers() {
29853028
output 1 "Setting interface triggers "
29863029
for n in $ifacesTriggers; do
29873030
output 2 "Setting interface trigger for $n "
2988-
procd_add_interface_trigger "interface.*" "$n" "/etc/init.d/${packageName}" on_interface_reload "$n" && output_ok || output_fail
3031+
if procd_add_interface_trigger "interface.*" "$n" "/etc/init.d/${packageName}" on_interface_reload "$n"; then
3032+
output_ok
3033+
else
3034+
output_fail
3035+
fi
29893036
done
29903037
output_1_newline
29913038
fi
@@ -2996,7 +3043,6 @@ service_triggers() {
29963043
fi
29973044
}
29983045

2999-
# shellcheck disable=SC2015
30003046
stop_service() {
30013047
local i nft_file_mode
30023048
json init
@@ -3035,13 +3081,15 @@ stop_service() {
30353081
}
30363082

30373083
restart() {
3038-
load_package_config
3084+
load_package_config 'on_restart'
3085+
trap 'enable_forward' EXIT
30393086
stop_forward
30403087
stop
30413088
# it takes time before routes are cleaned up, if started immediately a leak can occur
30423089
[ -n "$strict_enforcement" ] && sleep 2
30433090
start
30443091
enable_forward
3092+
trap - EXIT
30453093
}
30463094

30473095
version() { echo "$PKG_VERSION"; }

0 commit comments

Comments
 (0)