Why SSH Works from Windows but Not Ubuntu in Proxmox + GNS3
Posted on Tue 05 August 2025 in Networking
The Symptom
I ran into a strange issue while labbing in Proxmox with GNS3:
- Windows (bare metal) could SSH to my GNS3 router without a problem.
- Ubuntu (running as a VM in Proxmox) could
ping
the router but SSH timed out. - Both were on the same subnet and connected to the same Proxmox bridge (
vmbr0
).
At first glance, this made no sense. Ping worked, so Layer 3 was fine — why not TCP/22?
First Clues
Inside the Ubuntu VM:
ip neigh show
showed correct ARP resolution for the router’s MAC.
A Wireshark capture on the GNS3 side revealed:
- Ubuntu’s TCP SYN packets arrived at the router.
- No SYN/ACK reply was sent back.
- Instead,
debug ip tcp transactions
on the Cisco router showed:
TCP: checksum failure <192.168.2.233,XXXXX> <192.168.2.136,22>
That was the smoking gun.
The Cause: TX Checksum Offload
The problem turned out to be TCP checksum offloading.
- Modern NIC drivers (including Proxmox’s virtio) sometimes leave the TCP checksum unset, expecting the physical NIC to fill it in before sending.
- In GNS3, the virtual router sees the raw packet before a real NIC ever touches it, so the checksum is wrong.
- Windows’ NIC/driver stack handled this differently, so it never showed the problem.
Ubuntu’s NIC (ens18
) was sending packets with invalid checksums to the router, so IOS dropped them instantly.
The Fix (Quick)
Disable TX checksum offload in Ubuntu:
sudo ethtool -K ens18 tx off
Test SSH again:
ssh admin@192.168.2.136
It should now connect without issue.
The Fix (Persistent)
Since Ubuntu now uses Netplan instead of /etc/network/interfaces
, you can’t just add post-up
lines.
The easiest persistent fix is a systemd service:
# /etc/systemd/system/disable-tx-offload.service
[Unit]
Description=Disable TX Checksum Offload on ens18
After=network.target
[Service]
Type=oneshot
ExecStart=/sbin/ethtool -K ens18 tx off
[Install]
WantedBy=multi-user.target
Enable it:
sudo systemctl daemon-reload
sudo systemctl enable disable-tx-offload.service
sudo systemctl start disable-tx-offload.service
Verify:
ethtool -k ens18 | grep tx-checksumming
It should read off
.
Takeaways
- If you can ping but not SSH from a Proxmox VM to a GNS3 router, check for TCP checksum failures in IOS debug.
- In GNS3 environments, checksum offload can break traffic to virtual devices.
- Disabling TX checksum offload on the VM NIC is a safe workaround in lab setups.
Have you run into similar odd networking issues between Proxmox and GNS3?
Drop a comment — this one took a while to nail down.