SCTP recv problems
От: ENP  
Дата: 06.02.14 05:32
Оценка:
Здравствуйте!

Есть некое ПО, использующее SCTP и работающее на одной машине, но не работающее на другой. Все ПО и сетевые настройки на машинах абсолютно идентичны — для исключения эффекта разной кривизны рук/глаз обе машины загружались с linux liveusb и далее запускался скрипт в духе:

rpm -Uvh software.rpm
echo ... > /etc/software.conf
ip a add ...
ip r add ...
service software start


В поисках источника проблемы докатились до того, что написали маленький SCTP-сервер, который точно так же работает только на одной из машин:

#!/usr/bin/perl

use strict;
use Socket;

my $proto = getprotobyname('sctp');

socket(server, PF_INET, SOCK_RAW, $proto) || die "socket error: $!";
bind(server, sockaddr_in(0, INADDR_ANY)) || die "bind error: $!";

my $buffer;

while (1) {
  print "recv wait ...\n";
  my $paddr = recv(server, $buffer, 65535, 0);
  my ($port, $iaddr) = sockaddr_in($paddr);
  print "recv from [".inet_ntoa($iaddr)."]\n";
}


На одной машине поведение такое:

# ./sctp.pl
recv wait ...
recv from [10.10.10.1]
recv wait ...
recv from [10.10.10.1]


и:

$ tshark -i eth0 -R 'sctp'
Capturing on eth0
  9.304980 10.10.10.1 -> 10.10.10.2 SCTP 86 INIT
  9.305173 10.10.10.2 -> 10.10.10.1 SCTP 50 ABORT
 39.426030 10.10.10.1 -> 10.10.10.2 SCTP 86 INIT
 39.426237 10.10.10.2 -> 10.10.10.1 SCTP 50 ABORT


На другой:

# ./sctp.pl
recv wait ...


и:

$ tshark -i eth0 -R 'sctp'
Capturing on eth0
  5.112609 10.10.10.1 -> 10.10.10.2 SCTP 86 INIT
  6.212575 10.10.10.1 -> 10.10.10.2 SCTP 86 INIT


Отчего INIT-пакеты не добираются до сервера? Да, iptables на обоих машинах отсутствует, модуль sctp не загружен, ipv6 выключен.
sctp
Re: SCTP recv problems
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 06.02.14 09:01
Оценка:
Здравствуйте, ENP, Вы писали:

ENP>Здравствуйте!


ENP>Есть некое ПО, использующее SCTP и работающее на одной машине, но не работающее на другой. Все ПО и сетевые настройки на машинах абсолютно идентичны — для исключения эффекта разной кривизны рук/глаз обе машины загружались с linux liveusb и далее запускался скрипт в духе:

Ваершарковский дамп сними и посмотри что с пакетами и куда они ходят.
Sic luceat lux!
Re[2]: SCTP recv problems
От: ENP  
Дата: 06.02.14 09:17
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Ваершарковский дамп сними и посмотри что с пакетами и куда они ходят.


Я показал дампы, не заметно?
Re: SCTP recv problems
От: smeeld  
Дата: 06.02.14 11:10
Оценка:
Здравствуйте, ENP, Вы писали:

А как там с selinux? Попробуйте сделать setenforce 0 на клиенте.
Re[2]: SCTP recv problems
От: ENP  
Дата: 06.02.14 11:28
Оценка:
Здравствуйте, smeeld, Вы писали:

S>А как там с selinux?


Отключен.
Re: SCTP recv problems
От: smeeld  
Дата: 06.02.14 12:31
Оценка:
Здравствуйте, ENP, Вы писали:

ENP>socket(server, PF_INET, SOCK_RAW, $proto) || die "socket error: $!";


Не понятно почему здесь SOCK_RAW вместо SOCK_STREAM, в этом случае
все заголовки sctp должны формироваться в программе, чего
в этом perl скрипте нет, может в исходной проге то же самое?
Re[3]: SCTP recv problems
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 06.02.14 13:12
Оценка:
Здравствуйте, ENP, Вы писали:

ENP>Здравствуйте, Kernan, Вы писали:


K>>Ваершарковский дамп сними и посмотри что с пакетами и куда они ходят.


ENP>Я показал дампы, не заметно?

Пакеты посмотреть нельзя. Что там в пакетах-то?
Sic luceat lux!
Re[4]: SCTP recv problems
От: ENP  
Дата: 06.02.14 16:15
Оценка:
Здравствуйте, Kernan, Вы писали:

K> Что там в пакетах-то?


Ну например:

Internet Protocol Version 4, Src: 10.10.10.1 (10.10.10.1), Dst: 10.10.10.2 (10.10.10.2)
    Version: 4
    Header length: 20 bytes
    Differentiated Services Field: 0x02 (DSCP 0x00: Default; ECN: 0x02: ECT(0) (ECN-Capable Transport))
        0000 00.. = Differentiated Services Codepoint: Default (0x00)
        .... ..10 = Explicit Congestion Notification: ECT(0) (ECN-Capable Transport) (0x02)
    Total Length: 72
    Identification: 0xae6e (44654)
    Flags: 0x00
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    Fragment offset: 0
    Time to live: 254
    Protocol: SCTP (132)
    Header checksum: 0xe277 [correct]
        [Good: True]
        [Bad: False]
    Source: 10.10.10.1 (10.10.10.1)
    Destination: 10.10.10.2 (10.10.10.2)
Stream Control Transmission Protocol, Src Port: 3034 (3034), Dst Port: 3034 (3034)
    Source port: 3034
    Destination port: 3034
    Verification tag: 0x00000000
    Checksum: 0xad4314e0 (not verified)
    INIT chunk (Outbound streams: 33, inbound streams: 33)
        Chunk type: INIT (1)
            0... .... = Bit: Stop processing of the packet
            .0.. .... = Bit: Do not report
        Chunk flags: 0x00
        Chunk length: 38
        Initiate tag: 0x00005b87
        Advertised receiver window credit (a_rwnd): 76500
        Number of outbound streams: 33
        Number of inbound streams: 33
        Initial TSN: 27117
        IPv4 address parameter (Address: 10.10.10.1)
            Parameter type: IPv4 address (0x0005)
                0... .... .... .... = Bit: Stop processing of chunk
                .0.. .... .... .... = Bit: Do not report
            Parameter length: 8
            IP Version 4 address: 10.10.10.1 (10.10.10.1)
        ECN parameter
            Parameter type: ECN (0x8000)
                1... .... .... .... = Bit: Skip parameter and continue processing of the chunk
                .0.. .... .... .... = Bit: Do not report
            Parameter length: 4
        Supported address types parameter (Supported types: IPv4)
            Parameter type: Supported address types (0x000c)
                0... .... .... .... = Bit: Stop processing of chunk
                .0.. .... .... .... = Bit: Do not report
            Parameter length: 6
            Supported address type: IPv4 address (5)
        Chunk padding: 0000
Re[2]: SCTP recv problems
От: ENP  
Дата: 06.02.14 16:20
Оценка:
Здравствуйте, smeeld, Вы писали:

ENP>>socket(server, PF_INET, SOCK_RAW, $proto) || die "socket error: $!";


S>Не понятно почему здесь SOCK_RAW вместо SOCK_STREAM, в этом случае

S>все заголовки sctp должны формироваться в программе, чего
S>в этом perl скрипте нет, может в исходной проге то же самое?

Ну да, ПО само разбирает и собирает пакеты. В тестовом скрипте сборки/разборки не предполагается, тут хотя бы просто сам пакет получить
Re[3]: SCTP recv problems
От: ENP  
Дата: 06.02.14 16:25
Оценка:
ENP>Ну да, ПО само разбирает и собирает пакеты. В тестовом скрипте сборки/разборки не предполагается, тут хотя бы просто сам пакет получить

В strace было видно, как ПО, которое требуется запустить, тоже зависает на recv — поэтому и написали на perl нечто максимально приближенное к оригиналу.
Re[3]: SCTP recv problems
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 07.02.14 08:33
Оценка:
Здравствуйте, ENP, Вы писали:

ENP>Здравствуйте, smeeld, Вы писали:


ENP>>>socket(server, PF_INET, SOCK_RAW, $proto) || die "socket error: $!";


S>>Не понятно почему здесь SOCK_RAW вместо SOCK_STREAM, в этом случае

S>>все заголовки sctp должны формироваться в программе, чего
S>>в этом perl скрипте нет, может в исходной проге то же самое?

ENP>Ну да, ПО само разбирает и собирает пакеты. В тестовом скрипте сборки/разборки не предполагается, тут хотя бы просто сам пакет получить

Он тебе дело сказал. Кусок кода нс С. Если ты сам собираешь SCTP пакеты, то видимо неправильно это делаешь. Надеюсь ты понимаешь что такое SOCK_RAW.

sd = socket (AF_INET, SOCK_STREAM, IPPROTO_SCTP);

Вот тут есть пример как это должно работать на С.
Sic luceat lux!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.