tunnel: add -keepalive-timeout-secs for dead connection detection
Tracks last server receive time (atomic) and runs a watchdog goroutine that closes the connection if no data arrives within the timeout, triggering reconnection. Also fixes Close() to guard Conn.Close() inside sync.Once so concurrent/repeated calls are safe. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1d919aafc5
commit
1a397c363f
5 changed files with 57 additions and 18 deletions
|
|
@ -82,6 +82,7 @@ softether-go [flags]
|
|||
| `-accept-dns` | `false` | Set `/etc/resolv.conf` from DHCP-provided DNS servers |
|
||||
| `-policy-route-table` | `0` | Policy routing table number (0 = disabled) |
|
||||
| `-connmark` | `false` | Use CONNMARK to route DNAT reply traffic back through VPN |
|
||||
| `-keepalive-timeout-secs` | `0` | Close connection if no server data within N seconds (0 = disabled) |
|
||||
| `-reconnect-delay` | `5s` | Delay between reconnection attempts |
|
||||
|
||||
### Authentication
|
||||
|
|
@ -112,6 +113,8 @@ softether-go -host vpn.example.com -user admin -pass secret -plain-password
|
|||
|
||||
**`-connmark`** — requires `-policy-route-table`. Uses iptables CONNMARK to route DNAT reply traffic back through the VPN tunnel. Without this, traffic forwarded to local namespaces/VMs (via DNAT) gets replies routed via the default gateway instead of the tunnel, breaking the connection. Adds `CONNMARK --set-mark` on incoming VPN packets and `CONNMARK --restore-mark` on reply packets from other interfaces.
|
||||
|
||||
**`-keepalive-timeout-secs N`** — enables a receive-side keepalive watchdog. The server sends keepalives every ~3 seconds. If no data (frames or keepalives) is received within N seconds, the connection is closed and the reconnect loop kicks in. Detects half-open TCP connections that would otherwise stall for minutes. Recommended value: `15`.
|
||||
|
||||
### Examples
|
||||
|
||||
Minimal:
|
||||
|
|
@ -238,7 +241,7 @@ SoftEther uses **SHA-0** (not SHA-1) — no left-rotate in message schedule. `Ha
|
|||
|
||||
### Keepalive
|
||||
|
||||
Sent every 3 seconds: `uint32(0xFFFFFFFF) + uint32(randSize) + randData`. Silently consumed, never forwarded to TAP.
|
||||
Sent every 3 seconds: `uint32(0xFFFFFFFF) + uint32(randSize) + randData`. Incoming keepalives update a receive timestamp. With `-keepalive-timeout-secs N`, a watchdog checks this timestamp at `N/3` intervals and closes the connection if no data arrived within N seconds, triggering reconnection.
|
||||
|
||||
## Project structure
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue