Рядом с небольшими задачами следует провести черту:
if [ -z $batas ] | [ $batas -lt 0 ]; then
быть
if [ -z $batas ] || [ $batas -lt 0 ]; then
А вместо этого:
if [ `expr $i % 2` -eq 0 ]; then
вы можете использовать
if (( $i % 2 == 0 )); then
Проблема была связана с контрольной суммой udp. Пакеты генерируются netcat с неверной контрольной суммой UDP, и в ядре устанавливается флаг, чтобы игнорировать это. Это работает с мостом linux, потому что пакеты остаются в пространстве ядра, но когда они проходят через программный коммутатор, пакеты попадают в пространство пользователя и повторно вставляются в ядро без начальных флагов, которые игнорируют неверную контрольную сумму, поэтому они отбрасываются.
Исправлено разгрузкой контрольной суммы на интерфейсах:
/sbin/ethtool --offload $intf tx off
/sbin/ethtool --offload $intf rx off