Making the laptop into a router is a popular way to fix the wrong problem. Forwarding exists so a machine can pass packets whose destination is not itself, and it has no opinion about how quickly a browser on that same machine loads a page. The two paths only look alike because both send traffic through one tunnel. Separate them once and a great deal of advice about enabling forwarding or opening the firewall turns out to describe a topology you do not have.

Two packet paths that look identical from the desk

A browser on the laptop creates its own request. The host selects the tunnel route, the client process wraps the packet and ships it to the peer, and the reply comes back to the application. Nothing in that sequence crosses a forwarding decision, because this machine is both the source and the destination of the conversation.

Now put another device on a deliberately configured Ethernet segment and make the laptop its default gateway. That device originates the request, the laptop receives a packet addressed somewhere else, and the kernel has to decide whether to pass it onward. That is the forwarding role, and it arrives with prerequisites the client role never needed: a permitted transit path, routes on both sides, and a return path that still works if translation is part of the design.

RoleWho originates the trafficWhat has to be true
Client onlyThe laptop itselfTunnel route, working resolver, supported profile
GatewayAnother deviceForwarding enabled, permitted transit, routes both ways, return-path decision

What ip_forward actually changes

The kernel's IPv4 sysctl documentation describes ip_forward as the switch that lets a host forward packets between interfaces. It is not a fast path for traffic the host generated, and no reading of that parameter makes a local browser quicker. If anything, forwarding adds state and policy to a machine that was doing less work before.

The same documentation warns that changing the value resets other IPv4 parameters to their host or router defaults. That makes the toggle a configuration event rather than a probe: tuned settings can revert underneath you, and the change may be responsible for a regression nobody would think to attribute to it. It also means the switch should be set once, deliberately, by whoever owns the gateway role. Flipping it during a slowdown investigation is the one case where the side effect is guaranteed to be confused with the symptom.

Three firewall questions that are not the same question

Allowing a VPN listener, allowing services the laptop runs, and allowing traffic to pass through the laptop are three separate permissions. The first lets a peer reach a daemon, the second exposes something local, and the third turns the machine into transit for somebody else. Each has a different scope, and the last is far broader than the replies that an ordinary outbound application needs.

When a specific flow is blocked, name its source, destination, direction and policy owner before editing a rule. A narrow rule for that flow is a fix; accepting everything on the tunnel interface is a policy change that happens to include the fix. A browser that works afterwards proves the flow works, not that the broad rule was necessary.

Only benchmark once the path is correct

Measure with the same destination, the same workload and comparable conditions, and change one variable at a time. A test that bundles a forwarding change, a firewall widening and a copied cipher setting produces a number and no explanation, because nothing in it tells you which of the three moved the result.

Keep route and resolver failures out of the performance conversation altogether. A name that resolves slowly is not a throughput problem, and a transfer that stalls at one fixed size is usually an MTU question rather than a rate limit. Record which of those three you actually observed before comparing any numbers. Otherwise the next reader inherits a benchmark that measures the wrong thing and a change nobody can justify.

Describe the topology you have, not the label on the client

A laptop that shares its connection, hosts a routed container network or carries traffic for a virtual machine is a gateway, whatever the software calls itself. The word client describes how the tunnel is configured, not whether packets get passed to somebody else.

Make the role explicit in the runbook: what originates traffic, what must traverse the machine, and which of the two the current task is about. Enable the gateway role when it belongs to the supported plan, not as an unexplained speed adjustment applied to a topology that never needed one.

Lahatsoratra mifandraika