Record inbound decision and cost estimate in VoIP.ms planning doc

Inbound (DID) is now decided as wanted, not outbound-only. Adds a cost
estimate table for 100 min/month each direction, and clarifies that
NANP-only restriction bounds cost-per-minute but not burn speed, so the
concurrent-call cap and spend alert are required before funding a live
trunk, not optional hardening.
This commit is contained in:
Claude
2026-07-21 22:41:22 +00:00
parent 5f60cc1e14
commit 719f9117be
+46 -7
View File
@@ -18,6 +18,31 @@ addition on top of `asterisk-digital-ocean`.
VoIP.ms requires for US routing, and again independently in Asterisk's own VoIP.ms requires for US routing, and again independently in Asterisk's own
dialplan (see below), so a compromised extension can't reach anything dialplan (see below), so a compromised extension can't reach anything
outside the US even if the trunk itself would technically allow more later. outside the US even if the trunk itself would technically allow more later.
- **Inbound: wanted.** A DID is in scope, not outbound-only. Decide pay-per-minute
vs. unlimited DID plan based on expected inbound volume (see cost estimate
below), and decide E911 deliberately rather than skipping it by default —
VoIP.ms doesn't require it, but without it 911 dialed from the line either
fails or doesn't carry accurate address/location info.
## Cost estimate (100 min/month each direction, US-only)
Verified against VoIP.ms's public wiki/rate pages, not a live account — confirm
at sign-up since rates can change.
| Item | Rate | Monthly | Annual |
|---|---|---|---|
| DID (phone number), pay-per-minute plan | $0.85/mo flat | — | $10.20 |
| Inbound usage | $0.009/min | $0.90 | $10.80 |
| Outbound usage | $0.01/min | $1.00 | $12.00 |
| **Total** | | **~$2.75** | **~$33** |
- Skipping the DID (outbound-only) drops this to ~$12/year.
- Adding E911 adds a $1.50 one-time fee plus **$1.50/month** regulatory fee
(~$18/year) — pushes the total above to ~$51/year.
- **Funding minimum:** VoIP.ms requires a **$15 minimum deposit** to activate
calling — a one-time balance top-up, not a recurring charge. At ~$2.75/month
usage that balance lasts ~5 months before a refill is needed (longer at
lower volume). Leave auto-recharge **off** per the toll-fraud design above.
## Why this matters (toll fraud) ## Why this matters (toll fraud)
A compromised Asterisk box can dial premium-rate or international numbers A compromised Asterisk box can dial premium-rate or international numbers
@@ -32,6 +57,19 @@ anyone notices. Two independent layers matter more than either alone:
This is the first line of defense and should exist independent of the This is the first line of defense and should exist independent of the
trunk's own capabilities. trunk's own capabilities.
**Important nuance: these two layers bound different things, and neither
alone bounds both.** NANP-only restriction bounds *cost-per-minute* (a
compromised box can only ever reach $0.01/min US numbers, never $25/min
international/premium destinations) — that risk is fully closed. It does
**not** bound *how fast* the prepaid balance gets burned: nothing stops a
compromised box from opening many concurrent US-destination calls in
parallel and draining the whole balance (e.g. $15 balance ÷ $0.01/min =
1,500 minutes total, which 20 concurrent legs could burn through in under
an hour). The prepaid-balance-off-auto-recharge layer bounds the *dollar*
ceiling; only a concurrent-call cap bounds the *speed* of a breach. Treat
the per-extension concurrent-call cap and spend/volume alert below as
required before funding a live trunk, not optional hardening.
## What it takes technically (asterisk-digital-ocean) ## What it takes technically (asterisk-digital-ocean)
- A PJSIP trunk to VoIP.ms: `endpoint` / `aor` / `auth` / `identify` - A PJSIP trunk to VoIP.ms: `endpoint` / `aor` / `auth` / `identify`
sections in the pjsip config, using either IP authentication or SIP sections in the pjsip config, using either IP authentication or SIP
@@ -45,10 +83,10 @@ anyone notices. Two independent layers matter more than either alone:
catch-all `_X.` pattern — an explicit NANP pattern is itself a hard block catch-all `_X.` pattern — an explicit NANP pattern is itself a hard block
on non-US destinations at the dialplan level. on non-US destinations at the dialplan level.
- VoIP.ms-specific setup that isn't scriptable (user does this manually): - VoIP.ms-specific setup that isn't scriptable (user does this manually):
create the account, decide whether a DID is needed (this research was create the account, order a DID (inbound is wanted — see above), decide
outbound-only — inbound PSTN wasn't discussed/decided), pick a VoIP.ms pay-per-minute vs. unlimited DID plan and whether to add E911, pick a
POP/server (affects the trunk hostname), fund the prepaid balance, turn VoIP.ms POP/server (affects the trunk hostname), fund the prepaid balance
off auto-recharge. ($15 minimum), turn off auto-recharge.
- Defense-in-depth to design alongside the trunk (not yet designed): - Defense-in-depth to design alongside the trunk (not yet designed):
- Per-extension concurrent-call cap in the dialplan (`GROUP()` / - Per-extension concurrent-call cap in the dialplan (`GROUP()` /
`GROUP_COUNT()`) so one compromised extension can't open dozens of `GROUP_COUNT()`) so one compromised extension can't open dozens of
@@ -81,7 +119,8 @@ anyone notices. Two independent layers matter more than either alone:
2. IP auth vs. registration — confirm which VoIP.ms recommends for a single 2. IP auth vs. registration — confirm which VoIP.ms recommends for a single
fixed-IP droplet. fixed-IP droplet.
3. Exact NANP dial pattern(s) and any prefix-stripping VoIP.ms requires. 3. Exact NANP dial pattern(s) and any prefix-stripping VoIP.ms requires.
4. Whether inbound (a DID) is wanted at all, or outbound-only for now — not 4. Inbound is decided (wanted) — still need to pick pay-per-minute vs.
discussed yet. unlimited DID plan based on real expected volume, and decide on E911.
5. Design the concurrent-call cap and any spend/volume alerting mentioned 5. Design the concurrent-call cap and any spend/volume alerting mentioned
above. above — treat as required before funding a live trunk, not optional
(see toll-fraud nuance above: NANP-only bounds cost/min, not burn speed).