Open a familiar site through a VPN and get an extra challenge, and the tempting explanation is that the tunnel was detected. Something was detected, but it was not you. The site scored a set of signals, one of which is the source address, and that address is shared with strangers who may have been generating failed logins a minute earlier. Reading the decision as a verdict about your connection misreads what the score is for.

What a source address can and cannot settle

An IP address describes a path through the network at a moment in time. It does not identify a person, a device or even a single account, and with carrier-grade NAT or a busy VPN pool it may front thousands of unrelated sessions simultaneously. A site that treats the address as an identity is really treating it as a reputation, which is a statistical statement rather than a fact.

Two people can share an exit and produce opposite evidence: one signs in successfully with a second factor, the other tries forty passwords. The address is identical, so any rule keyed to the address alone cannot distinguish them, and whichever response it triggers applies to both.

That is not an argument for ignoring addresses. It is an argument for remembering what the signal measures, because most of the surprising behaviour around VPN logins comes from a control being applied at the wrong granularity rather than from a wrong observation.

Why blocking the exit punishes strangers

An address-level block is cheap to implement and expensive to aim. Its blast radius is every session behind that address, which is why shared-address and NAT behaviour has its own history in operational documentation: the same reasoning appears in the IETF work on shared source addresses and the collateral effects of address-based filtering.

SignalWhat it provides evidence aboutWhat it cannot settle
Source address and its reputationThe network path, and how that path behaved recently for othersWhich account or person is behind the request
Authenticator resultWhether the account claim was proved at the required strengthWhether the account's owner initiated it
Request timing and volumeWhether the pattern looks automated or burst-likeWhether the intent was malicious or a shared client
Application event historyWhat this account has done while signed inAnything about requests that never authenticated

Consider the two failures a block creates. A legitimate customer behind the same exit is refused service and files a support ticket that costs more than the abuse did. An actual attacker moves to the next exit in a pool of thousands and continues, having spent nothing but a reconnect.

Proportionality is the missing step. Repeated failed sign-ins, a burst of automated requests and an authenticated permission violation are three different events, and only the second is plausibly an address-shaped problem. Applying the same site-wide network ban to all three is how a security control becomes a support queue.

Put the decision where the evidence lives

Account-level controls follow the account across addresses, which matches the entity you actually care about. Rate limiting, waiting periods after repeated failures and step-up authentication for sensitive actions all operate on the account or the action rather than on the network path. That is a better match for the entity you are actually protecting. It also removes the attacker's incentive to hunt for a fresh exit address.

NIST's authentication guidance treats those as inputs to a risk assessment and lists address, geolocation and request timing among the signals, which is exactly the framing to borrow: a signal informs a decision, it does not replace an authenticator. Read that list as inputs, not as a menu of things to ban. The authenticator still does the proving, and the other signals only decide how much friction to place around it.

Two design constraints keep the account-level approach from becoming its own outage. Rate limits need a safe review path so a user can report a wrong classification without publishing credentials, and step-up challenges must not be answerable with a password or a one-time code handed to an unverified support contact.

What a fair policy looks like from outside

Write down which decision each control supports, then check that the control's granularity matches. Address controls answer questions about traffic from a network; account controls answer questions about an account; application events answer questions about behaviour after authentication. A policy that names all three is auditable, and one that names only "VPN traffic" is not.

Then measure the outcome rather than the rule count. Unauthorized attempts should fall, legitimate users should keep a supported path, and the number of support contacts per thousand sign-ins should not rise. A block that improves the first number while wrecking the other two has moved the problem, not solved it.

Accepting VPN connections and enforcing abuse controls are compatible goals. The version that works treats the source address as one input among several, applies the narrowest control that fits the evidence, and leaves an honest route for the person who was misclassified. The version that fails treats an address as a suspect and calls it a policy.

Nuŋlɔɖi siwo ku ɖe eŋu