A transfer rate capped around 90 Mbps on a Gigabit network card isn’t necessarily due to the server, Samba, or the firewall. The Ethernet link may simply have negotiated a 100 Mbps connection. A faulty cable, a limited switch port, or an inconsistent duplex configuration is enough to bottleneck the entire connection.
ethtool It reads the parameters exposed by the network driver: speed, duplex, auto-negotiation, link presence, and hardware counters. I start with this information before modifying the IP configuration or running a speed test. Most of the controls below are read-only.

Identify the Ethernet interface actually in use
Do not assume that the interface is called eth0A modern machine often uses a name like enp1s0, eno1 Or ens18Start by displaying the interfaces and the route used to exit:
ip -brief link
ip route get 1.1.1.1
The second command indicates in particular dev And srcIn this example, dev enp1s0 designates the interface to be controlled with ethtoolThe tutorial on ip addr under Linux details the states UP, LOWER_UP and the associated addresses.
Rule out loopback interfaces, Docker bridges, VPN tunnels, and virtual interfaces if your failure involves a physical cable. In a virtual machine, ethtool Sometimes it only describes the virtual card. The actual negotiation then takes place on the host or on the switch.
Install ethtool without touching the network
The package usually has the same name as the command. Its installation does not change the card settings.
sudo apt update
sudo apt install ethtool
sudo dnf install ethtool
sudo pacman -S ethtool
Next, check the version and help available on your distribution:
ethtool --version
ethtool --help
ethtool depends on the driver and hardware. An option present in the help may remain unavailable on a virtual card, a USB adapter, or a driver that does not expose the function.
Read speed, duplex, auto-negotiation and link status
Run the command on the identified interface. Elevated privileges allow you to obtain all the information provided by the driver:
sudo ethtool enp1s0
For an initial diagnosis, focus on four lines:
- Speed : speed currently negotiated, for example
1000Mb/s. - Duplex :
Fullis the expected value on a modern Ethernet link. - Self-negotiation : indicates whether the card is negotiating capabilities with the remote port.
- Link detected : confirms the presence of the physical carrier.
You can extract these lines for quick reading:
sudo ethtool enp1s0 | grep -E 'Speed|Duplex|Auto-negotiation|Link detected'
Also watch Supported link modes, Advertised link modes And Link partner advertised link modesThe network card, its configuration, and the remote port must share at least one mode. If the card advertises Gigabit speeds but the partner only offers 100 Mbps, the negotiated speed will remain at 100 Mbps.
What should you check when Link detected displays no?
Link detected: no Prioritize the problem over IP address, DNS, and TCP ports. First, check the state as seen by the kernel and the carrier:
ip link show dev enp1s0
cat /sys/class/net/enp1s0/operstate
cat /sys/class/net/enp1s0/carrier
A value zero In carrier This means the kernel doesn’t see a physical connection. Test another cable known to be working, then another switch port. Also, verify that the port isn’t administratively disabled and that the USB adapter or network card is receiving power.
On a machine with several identical ports, the identification option can cause the port’s LED to blink for ten seconds if the driver supports it:
sudo ethtool -p enp1s0 10
Finally, check the kernel messages related to the interface. They may indicate a repeated link loss, missing firmware, or a driver reset:
sudo dmesg -T | grep -Ei 'enp1s0|link|firmware|timeout'
sudo journalctl -k -b | grep -Ei 'enp1s0|link|firmware|timeout'
The guide to dmesg and kernel messages helps to put these errors back in the order of startup.
Understanding a connection blocked at 100 Mbps or in half-duplex
A Gigabit card negotiated at 100Mb/s It deserves a physical check before any software optimization. Gigabit Ethernet uses all four pairs of the cable. A damaged or poorly crimped pair might allow the link to function, but only at 100 Mbps. A Fast Ethernet switch port produces the same result.
A duplex Half This is also suspicious on a modern network. Compare the configuration of the two ends. One end forced and the other left in auto-negotiation can cause errors, retransmissions, and inconsistent throughput.
Identify the driver, then cross-reference the interface counters with the hardware statistics:
sudo ethtool -i enp1s0
ip -s link show dev enp1s0
sudo ethtool -S enp1s0 | grep -Ei 'err|drop|crc|miss|fault|timeout'
The names returned by ethtool -S These errors vary depending on the driver. A continuous increase in CRC errors during a transfer points to the cable, connector, module, or port. A single counter that stops moving does not prove an actual fault: take a reading, generate some traffic, and then compare again.
Do not force the speed during an SSH session
The shape ethtool -s modifies the link settings. Renegotiation can immediately disconnect your SSH session. Only use it remotely if you have a KVM console, IPMI, or other backup access.
If you have confirmed that auto-negotiation was disabled in error, this command re-enables it on the interface:
sudo ethtool -s enp1s0 autoneg on
The following command requires a new negotiation and may also break the link:
sudo ethtool -r enp1s0
Don’t force it blindly speed 1000, full duplex And autoneg offThe remote port must be configured compatiblely, and some standards require auto-negotiation. Note the initial output, modify a single parameter, and then verify the connection from the console.
A setting applied with ethtool -s The change may disappear after a reboot or interface reset. Persistence depends on NetworkManager, systemd-networkd, or the distribution configuration. Only make the change permanent after identifying the cause and validating the test. On Ubuntu, see the article dedicated to… Netplan explains how to prepare a rollback before touching the network.
Test the speed only when the connection is clean.
ethtool It displays the link speed, not the usable bandwidth of an application. A 1 Gbps full-duplex negotiation does not guarantee that Samba, NFS, or a download will reach that speed. It simply allows you to overcome an obvious physical limitation.
After correction, verify that the error counters remain stable and that the route still uses the correct interface:
sudo ethtool enp1s0
ip -s link show dev enp1s0
ip route get 1.1.1.1
You can then measure the local network with iperf3 between two machines that you control. Start the server on one machine, then the client on the other:
iperf3 -s
iperf3 -c 192.0.2.50
If the connection is stable, negotiated at the expected speed, and without an increase in errors, then proceed to the route, firewall, storage, and application service. To verify what is actually listening on the machine, use the guide on ss and open ports under Linux.
There ethtool man page details all the options. The official project website It should be noted, however, that their handling always depends on the pilot and the equipment.