How to Force Telnet Client to Use Specific Source Interface for SMTP Server Testing


4 views

When testing SMTP server connectivity between multi-homed servers, you often need to verify connections through specific network interfaces. The standard telnet client doesn't directly expose source interface selection, but we have several workarounds.

The most flexible solution is to use socat, which allows explicit interface binding:

socat - TCP4:mail.example.com:25,bind=192.168.1.100

Where 192.168.1.100 is your desired source IP. For IPv6:

socat - TCP6:[2001:db8::1]:25,bind=[2001:db8::2]

For systems where you can't install additional tools, create specific routes:

# Linux example
ip route add 203.0.113.5 via 192.168.1.1 src 192.168.1.100
telnet 203.0.113.5 25

For secure testing, SSH can create interface-bound tunnels:

ssh -L 192.168.1.100:2525:mail.example.com:25 user@jumpbox
telnet 127.0.0.1 2525

On Windows, PowerShell offers Test-NetConnection with source binding:

Test-NetConnection -ComputerName mail.example.com -Port 25 -LocalIP 192.168.1.100

Always verify your actual route with:

# Linux
traceroute -s 192.168.1.100 mail.example.com

# Windows
tracert -S 192.168.1.100 mail.example.com

For SMTP-specific testing, the initial connection should show your bound interface's IP in the server logs.


When testing email server connectivity between multi-homed servers, the default telnet behavior might not use your desired network interface. This becomes critical when:

  • Testing firewall rules for specific interfaces
  • Verifying routing table configuration
  • Diagnosing network segmentation issues

For Linux systems, socat provides the most reliable solution:

socat - TCP:mail.example.com:25,bind=192.168.1.100

Alternatively, with netcat:

nc -s 192.168.1.100 mail.example.com 25

On Windows, you can temporarily modify the routing table:

route add mail.example.com 192.168.1.100 metric 1
telnet mail.example.com 25
route delete mail.example.com

For scripting scenarios, consider this Python 3 solution:

import socket

def interface_telnet(source_ip, dest_host, dest_port=25):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((source_ip, 0))  # Bind to source interface
    s.connect((dest_host, dest_port))
    print(f"Connected from {source_ip} to {dest_host}:{dest_port}")
    # Insert your SMTP protocol interaction here
    s.close()

interface_telnet("192.168.1.100", "mail.example.com")

When testing enterprise email servers:

  • Always test both IPv4 and IPv6 interfaces separately
  • Consider timeouts - set socket timeout to 10 seconds for SMTP
  • Record exact timestamps for correlation with server logs

For continuous monitoring across interfaces:

#!/bin/bash
INTERFACES=("192.168.1.100" "10.0.0.5")
DEST="mail.example.com"

for intf in "${INTERFACES[@]}"; do
  echo "Testing from $intf..."
  if socat - TCP:$DEST:25,bind=$intf,connect-timeout=5 <<< "QUIT"; then
    echo "SUCCESS on $intf"
  else
    echo "FAILED on $intf"
  fi
done