Skip to content

binding port with ipv6 #3483

@thib-d

Description

@thib-d

🐛 IPv6 binding issue with SMTPServer::Server

The current SMTP server only binds to IPv4 (AF_INET) sockets, making it impossible to listen on IPv6 addresses such as :: or to accept dual-stack connections (IPv6 + IPv4).
When using a config like:

smtp_server:
default_bind_address: "::"
default_port: 25

Postal fails to start or doesn’t accept connections on IPv6 interfaces.

Expected behavior
The SMTP server should be able to bind to both IPv4 and IPv6 addresses when configured with ::, similar to how modern mail servers handle dual-stack operation.

To reproduce
1. Set default_bind_address: "::" in the configuration file.
2. Start Postal.
3. Observe that the server either:
• Fails with a “Cannot assign requested address” error, or
• Listens only on IPv4-mapped connections.

Technical analysis
TCPServer.open(bind_address, port) in Ruby only opens an IPv4 socket.
Ruby doesn’t automatically create a dual-stack socket unless explicitly requested via AF_INET6.
Therefore, Postal’s current code cannot handle IPv6-only or dual-stack setups.

Proposed fix
Modify the listen method in SMTPServer::Server to support IPv6, by explicitly opening both sockets when needed:

["::", "0.0.0.0"].uniq.each do |addr|
s = TCPServer.new(addr, port)
...
end

This ensures proper IPv6 compatibility on systems where net.ipv6.bindv6only=1.

Environment
• OS: Ubuntu/Debian docker
• IPv6 enabled: yes

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions