that looks almost okay to me… what are those special characters on the “client side” I wonder?
Could there be bad MTU settings that are allowing some smaller things through but failing on larger ones? Could try testing MTU sizes using this shell function to “ping” the VIP from a client:
$ mtu_discover_using_ping() ( target=$1 ; i=0; good=1; bad=${2:-15000}; mtu=${3:-1400}; lmtu=$good; while (( $bad - $good > 1 )); do let i+=1; if ping -w1 -i 0.1 -c2 -M do -s $mtu $1 &>/dev/null; then good=$mtu; else bad=$mtu; fi; lmtu=$mtu; mtu=$(( (good + bad)/2 )); printf "i:%u,\t""mtu:%u,\t""bad:%6u,\t""good:%6u,\t""diff:%6d\n" $i $mtu $bad $good $(( bad-good )); done >&2 ; echo >&2 "found in $i iterations using: ping -w1 -i0.1 -c2 -M do -s \$mtu $target" ; echo MTU=$mtu )
$ mtu_discover_using_ping 10.0.15.15
i:1, mtu:8200, bad: 15000, good: 1400, diff: 13600
i:2, mtu:4800, bad: 8200, good: 1400, diff: 6800
i:3, mtu:3100, bad: 4800, good: 1400, diff: 3400
i:4, mtu:2250, bad: 3100, good: 1400, diff: 1700
i:5, mtu:1825, bad: 2250, good: 1400, diff: 850
i:6, mtu:1612, bad: 1825, good: 1400, diff: 425
i:7, mtu:1506, bad: 1612, good: 1400, diff: 212
i:8, mtu:1453, bad: 1506, good: 1400, diff: 106
i:9, mtu:1479, bad: 1506, good: 1453, diff: 53
i:10, mtu:1466, bad: 1479, good: 1453, diff: 26
i:11, mtu:1472, bad: 1479, good: 1466, diff: 13
i:12, mtu:1475, bad: 1479, good: 1472, diff: 7
i:13, mtu:1473, bad: 1475, good: 1472, diff: 3
i:14, mtu:1472, bad: 1473, good: 1472, diff: 1
found in 14 iterations using: ping -w1 -i0.1 -c2 -M do -s $mtu 10.0.15.15
MTU=1472
I also found some posts claiming that ARP can get in the way when you have multiple interfaces on the same subnet. If that’s the case you can try restricting ARP replies:
# cat << EOF >> /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
EOF
# sysctl -p /etc/sysctl.conf