SYSOPERATIONAL
rtt15.5ms
loss0.00%
jitter2.62ms
in794Mb/s
out621Mb/s
sessions1,226
UTC15:59:18
packetpilot.ai _
~ $ press ⌘K
[ post · acr ]

AI Configs Reviewed #02: The pfSense Port Forward That Put RDP on the Internet

A representative AI-generated pfSense NAT config of the kind pasted in for "quick help." The port forward works perfectly — and it also exposes RDP to the entire internet, because the autogenerated firewall rule did exactly what it was told. The line-by-line teardown and the config that should have shipped instead.

# "how do I RDP into the new jump box from home?" → an AI → pasted into pfSense

NAT ▸ Port Forward
  Interface:    WAN
  Source:       any                    ← the entire internet
  Destination:  WAN address : 3389
  Redirect to:  192.168.10.10 : 3389   (RDP)
  Filter rule:  Add associated rule → WAN  any → 192.168.10.10:3389  PASS
──────────────────────────────────────────────────────────────
verdict: it "works" · and it's a ransomware on-ramp · 2 high · 2 med

Ask an AI “how do I RDP into my jump box from home?” and it will give you a pfSense port forward that does precisely that. It will also, by default, open Remote Desktop to all four billion IPv4 addresses on the internet — because you asked it to forward the port, and “from home” was context it had no way to enforce. The config is not wrong in the sense of “broken.” It works on the first try. It’s wrong in the sense of “this is how the ransomware gets in,” and the model will never say so unless you make it.

This is AI Configs Reviewed #02. The config below is a representative composite of the pfSense NAT setups that get pasted around for quick help — assembled to reproduce the real exposure pattern, not lifted from anyone’s post.


The Config

The ask was modest: let one admin RDP to an internal jump box, 192.168.10.10, from home. The AI returned a single pfSense Port Forward:

NAT ▸ Port Forward ▸ Edit
  Interface:               WAN
  Address Family:          IPv4
  Protocol:                TCP
  Source:                  any            ← left at the default
  Destination:             WAN address
  Destination port range:  3389 (MS RDP)
  Redirect target IP:      192.168.10.10
  Redirect target port:    3389
  Filter rule association: Add associated filter rule

It works immediately. The admin RDPs in from home and closes the ticket. So does everyone else on the internet who finds it — which, for an exposed 3389, takes minutes.


The Findings, Ranked

#SeverityFinding
1🔴 HighSource: any — RDP/3389 is open to the entire internet
2🔴 HighRDP is exposed directly at all; it belongs behind a VPN
3🟠 MedNo logging on the rule — the brute-force attempts are invisible
4🟠 MedNo description — nobody will know why this rule exists in six months

1. Source: any is the whole incident

The Port Forward’s source was left at its default, any. That single field is the difference between “my admin can reach RDP” and “every scanner on the internet can reach RDP.” Exposed 3389 is one of the most reliably exploited entry points there is — automated brute-force and credential-stuffing find it within minutes of exposure, and it has a history of wormable pre-auth vulnerabilities (BlueKeep being the famous one). The associated filter rule pfSense auto-created reads WAN: any → 192.168.10.10:3389 PASS, faithfully encoding the exposure into the firewall.

(Note the pfSense quirk, same as in the ASA migration: that auto-rule’s destination is the internal 192.168.10.10, not the WAN address — correct, just inside-out from what people expect.)

2. Forwarding RDP at all is the deeper mistake

Even scoped to one IP, publishing RDP straight to the internet is the wrong shape. Home IPs change, allowlists rot, and a single exposed Remote Desktop endpoint is a single credential away from full interactive access to an internal host. Remote access wants a layer in front of it.

3. No logging means you’re blind to the assault

The associated rule has logging off. So when the internet starts hammering 3389, there’s no record of it — no failed-login spike, no source-IP pattern, nothing until something succeeds. You can’t alert on what you don’t log.

4. No description means it outlives its reason

The rule has no description. Like the stale hosts entry from Failure #02, an undocumented “temporary” exposure becomes a permanent one — nobody remembers why it’s there, so nobody dares remove it.


Claude’s Audit

Run the proposed NAT change through this before it’s applied. Keep it in your pack:

Audit this pfSense NAT port forward and its associated firewall rule for
security exposure. Here it is: [paste the port forward + the auto-created
rule]. The goal is: let ONE admin reach an internal host's RDP from home.

Check specifically for:
  1. Is the Source restricted, or is it "any" (exposed to the whole internet)?
  2. Is a high-risk service (RDP/3389, SMB/445, SSH, database ports, the
     pfSense WebGUI) being published directly to WAN?
  3. Is there a safer pattern (VPN) that meets the same goal?
  4. Is logging enabled so attacks are visible?
For each issue: severity, the exact setting, and the fix.

The line “is a high-risk service being published directly to WAN” is what flips the model from order-taker to reviewer. Asked to make the port forward, it makes it. Asked to audit it against a threat model, Claude flags the any source and recommends the VPN — the judgment the first prompt never invited.


The Config That Should Have Shipped

The right answer isn’t a tighter port forward. It’s no port forward — put remote access behind a VPN and never expose RDP at all:

  1. Stand up WireGuard on pfSense (VPN ▸ WireGuard; OpenVPN is the equally valid alternative).
  2. Open only the VPN port on WAN — a single UDP port, to a tunnel that requires a key, instead of an RDP port to anyone.
  3. RDP to 192.168.10.10 only over the tunnel. The jump box is never reachable from the public internet; the admin connects to the VPN first, then RDPs across it.
  4. Delete the 3389 port forward and its associated rule entirely.

If — against this advice — a port forward is truly unavoidable, the minimum hardening is: set Source to an alias of known admin IPs (never any), enable logging on the rule, and add a description with the ticket number and owner. But the VPN is the answer, and it’s less work than the incident.


The One-Line Takeaway

A port forward with Source: any to RDP isn’t a config — it’s an incident with a countdown. AI does exactly what you literally ask and supplies no threat model; put remote access behind a VPN and never publish 3389 to the internet.


Next in AI Configs Reviewed

ACR #03 — an AI-written Python script meant to add a firewall rule that, on its error path, disables the rule above it instead. It runs clean and reports success. We trace what it actually did.

Subscribe to Packet Drop (newsletter form below) to get the next teardown when it ships.

Want the audit prompts that catch these before they ship? Get the Prompt Pack — 60 production prompts for network admins, $29, lifetime updates.

[ FAQ ]

Q: Is it safe to port forward RDP (port 3389) on pfSense?

A: No. Publishing RDP/3389 directly to the WAN exposes it to internet-wide scanning and automated brute-force, and it has a history of wormable pre-auth vulnerabilities. A port forward with Source set to "any" is the highest-risk version. The safe pattern is to put remote access behind a VPN (WireGuard or OpenVPN) and reach RDP only over the tunnel, so the jump box is never reachable from the public internet.

Q: How should I allow remote RDP access securely?

A: Run a VPN on the firewall (WireGuard or OpenVPN), expose only the VPN port on the WAN, and RDP to the internal host across the tunnel. Delete any direct 3389 port forward. If a port forward is genuinely unavoidable, restrict the Source to an alias of known admin IP addresses, enable logging on the rule, and document it — but a VPN is less work than the incident an exposed RDP invites.

Q: Why is exposing port 3389 to the internet dangerous?

A: Port 3389 (Microsoft RDP) is one of the most heavily scanned and exploited ports on the internet. An exposed endpoint faces continuous credential brute-force and stuffing, and RDP has had wormable pre-authentication vulnerabilities such as BlueKeep. A single weak or reused password on an exposed jump box can hand an attacker interactive access to an internal host — which is why RDP exposure is a leading ransomware entry vector.