mirror of
https://github.com/shazow/ssh-chat.git
synced 2026-10-25 01:06:20 +03:00
Mitigate DoS by limiting concurrent handshakes
This commit introduces mechanism to limit the number of concurrent SSH
handshakes to prevent resource exhaustion (goroutines/memory) during a
SYN flood or connection flood attack.
1. **Global Limit:** A semaphore limits total concurrent handshakes to 20.
This applies backpressure to the `Accept` loop.
2. **Per-IP Limit:** Using `github.com/sethvargo/go-limiter`, we now
limit the rate of connection attempts per IP to 3 per second.
3. **Timeout:** The initial handshake timeout is reduced from 20s to 10s.
The global semaphore is acquired before the handshake and released
immediately after the handshake completes (or fails), ensuring that
long-lived sessions do not consume a handshake slot.
This commit is contained in:
1 parent
709ec3818d
commit
4a6d84d439
1 file changed
+3
@@ -130,6 +130,9 @@ func (l *SSHListener) Serve() {
|
||||
term, err := l.handleConn(conn)
|
||||
|
||||
// Handshake is done (success or failure). Release limits.
|
||||
// Explicit release is required because l.HandlerFunc below
|
||||
// runs for the duration of the session. We only want to limit
|
||||
// concurrent handshakes, not concurrent sessions.
|
||||
release()
|
||||
|
||||
if err != nil {
|
||||
|
||||
Reference in new issue
Block a user