>Не работало вот так:
>[оверквотинг удален]
У меня tcpdump показывал, что ответные UDP (и ICMP) пакеты не проходили снаружи внутрь, к абоненту. На ipfw у меня dummynet, на pf [BI-]NAT. "Вскрытие" показало, что пакеты блокируются после входа в pipe, несмотря на наличие дальнейшего разрешающего правила. В итоге сделал так.
Было:
# Rule 3000: generated by utm2shaper script from billing database
$ipfw add $shapers_rulenum queue tablearg all from any to 'table(4)' // Incoming traffic shaping
$ipfw add $shapers_rulenum queue tablearg all from 'table(5)' to any // Outgoing traffic shaping
Стало:
# Rule 3000: generated by utm2shaper script from billing database
$ipfw add $shapers_rulenum queue tablearg all from any to 'table(4)' xmit $int_if // Incoming traffic shaping
$ipfw add $shapers_rulenum queue tablearg all from 'table(5)' to any xmit $ext_if // Outgoing traffic shaping
В таблицах содержатся локальные адреса пользователей и номера pipe, в которые их нужно адресовать:
root@home-vr:/root/nasscripts (308) ipfw table 4 list |head -n 3
10.54.0.8/29 141
10.54.1.8/29 69
10.54.2.8/29 19
root@home-vr:/root/nasscripts (309) ipfw table 5 list |head -n 3
10.54.0.8/29 10141
10.54.1.8/29 10069
10.54.2.8/29 10019
PF, как теперь вспомнил, не трогал, выглядит примерно вот так:
ext_if="em0"
int_if="em1"
dst_nat1="93.92.199.0/26"
dst_nat2="93.92.199.252/29"
table <allow-nat> persist file "/etc/pf.allow-nat"
table <peering-nets> const { 84.52.101.0/24 84.52.102.0/24 84.52.106.0/24 84.52.117.0/24 84.52.118.0/24 84.52.119.0/24 84.52.121.0/24 84.52.125.0/24 172.20.0.0/14 195.177.121.0/24 }
set limit { states 200000, frags 50000, src-nodes 30000 }
set state-policy if-bound
set optimization normal
set ruleset-optimization profile
set block-policy drop
set fingerprints "/etc/pf.os"
set skip on lo0
scrub in all max-mss 1440
no nat on $ext_if from <peering-nets> to any
no nat on $ext_if from any to <peering-nets>
binat-anchor "binat"
load anchor "binat" from "/etc/pf.anchor.binat"
nat on $ext_if from <allow-nat> to any -> $dst_nat1 static-port source-hash
nat on $ext_if from 10.78.78.0/24 to any -> $dst_nat2 static-port source-hash
pass in all
pass out all