Сетевые драйверы

На данный момент для предоставления в гостевую систему виртуальных интерфейсов существует множество драйверов. Так на моей генточке, например представлены следующие:

core02 /home/owlbook # qemu-system-x86_64 -net nic,model=?
qemu: Supported NIC models: e1000,e1000-82544gc,e1000-82545em,e1000e,i82550,i82551,i82557a,i82557b,i82557c,i82558a,i82558b,i82559a,i82559b,i82559c,i82559er,i82562,i82801,ne2k_pci,pcnet,rocker,rtl8139,virtio-net-pci,vmxnet3

Траблы

Продебажил я полдня почему же у меня такая низкая скорость переданчи SSH между виртуалками через tinc. Забрался в tcpdump и увидел следующее

15:05:33.551877 IP (tos 0x0, ttl 64, id 48369, offset 0, flags [DF], proto TCP (6), length 1500)
    10.21.3.10.42442 > 10.20.34.132.5201: Flags [.], cksum 0xa8a7 (correct), seq 38:1486, ack 1, win 229, options [nop,nop,TS val 2376055 ecr 3869731940], length 1448
15:05:33.551894 IP (tos 0xc0, ttl 64, id 40991, offset 0, flags [none], proto ICMP (1), length 576)
    10.21.3.1 > 10.21.3.10: ICMP 10.20.34.132 unreachable - need to frag (mtu 1300), length 556
        IP (tos 0x0, ttl 64, id 48369, offset 0, flags [DF], proto TCP (6), length 1500)
    10.21.3.10.42442 > 10.20.34.132.5201: Flags [.], seq 38:1486, ack 1, win 229, options [nop,nop,TS val 2376055 ecr 3869731940], length 1448
15:05:33.551908 IP (tos 0x0, ttl 64, id 48370, offset 0, flags [DF], proto TCP (6), length 1500)
    10.21.3.10.42442 > 10.20.34.132.5201: Flags [.], cksum 0x878e (correct), seq 1486:2934, ack 1, win 229, options [nop,nop,TS val 2376055 ecr 3869731940], length 1448
15:05:33.551914 IP (tos 0xc0, ttl 64, id 40992, offset 0, flags [none], proto ICMP (1), length 576)
    10.21.3.1 > 10.21.3.10: ICMP 10.20.34.132 unreachable - need to frag (mtu 1300), length 556
        IP (tos 0x0, ttl 64, id 48370, offset 0, flags [DF], proto TCP (6), length 1500)
    10.21.3.10.42442 > 10.20.34.132.5201: Flags [.], seq 1486:2934, ack 1, win 229, options [nop,nop,TS val 2376055 ecr 3869731940], length 1448
15:05:33.551923 IP (tos 0x0, ttl 64, id 48371, offset 0, flags [DF], proto TCP (6), length 1500)
    10.21.3.10.42442 > 10.20.34.132.5201: Flags [.], cksum 0xfe30 (correct), seq 2934:4382, ack 1, win 229, options [nop,nop,TS val 2376055 ecr 3869731940], length 1448
15:05:33.551928 IP (tos 0xc0, ttl 64, id 40993, offset 0, flags [none], proto ICMP (1), length 576)
    10.21.3.1 > 10.21.3.10: ICMP 10.20.34.132 unreachable - need to frag (mtu 1300), length 556
        IP (tos 0x0, ttl 64, id 48371, offset 0, flags [DF], proto TCP (6), length 1500)
    10.21.3.10.42442 > 10.20.34.132.5201: Flags [.], seq 2934:4382, ack 1, win 229, options [nop,nop,TS val 2376055 ecr 3869731940], length 1448

Важно здесь в общем-то вот это сообщение

15:05:33.551894 IP (tos 0xc0, ttl 64, id 40991, offset 0, flags [none], proto ICMP (1), length 576)
    10.21.3.1 > 10.21.3.10: ICMP 10.20.34.132 unreachable - need to frag (mtu 1300), length 556
        IP (tos 0x0, ttl 64, id 48369, offset 0, flags [DF], proto TCP (6), length 1500)
    10.21.3.10.42442 > 10.20.34.132.5201: Flags [.], seq 38:1486, ack 1, win 229, options [nop,nop,TS val 2376055 ecr 3869731940], length 1448

Оно говорит нам, что бридж вернул целевому хосту ICMP со словами - хочу передать твой пакет в интерфейс с меньшим MTU, но не могу, поскольку стоит флаг DF (запрет фрагментирования)

И как я не игрался с MTU на разных интерфейсах - каменный цветок всё не выходил и не выходил, однако на одном из серверов всё прекрасно работало и я начал сравнивать конфиги. Полчаса вдумчивых вглядываний во всё что можно далт свои плоды и я, таки, нашёл что мешает пакетам нормально ходить через интерфейсы с разным MTU.

Драйвер rtl8139 является устаревшим и должен использоваться по хорошему только для обратной совместимости со всяким старьём (он стомегабитный, например). А ещё, похоже, он не воспринимает смену MTU ни внутри виртуалки, ни снаружи, потому что у меня всё равно в tcpdump светились пакеты длиной 1500.

Решилось всё простой сменой rtl8139 на e1000, но вполне можно использовать и virtio.