LINUX.ORG.RU

ненастоящий dhcp

 , , ,


0

4

Хочется сделать настройку сети бродкастами (255.255.255.255) udp пакетов, это реально?

Есть два компьютера соединены на прямую, у одного стоит сеть 10.0.1.1 у второго 192.168.0.3. С одного шлю пакет на другой wireshark его видит, а QUdpSocet нет.
Если оба компьютера поместить в оду сеть, это работает, если потом один переместить в другую тоже работает. А вот если оба загрузились в разных сетях изначально то нет.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QNetworkDatagram>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    bool ok = in.bind(QHostAddress::Any, 49001);
    ok &= out.bind(QHostAddress("10.0.1.1"));

    if (!ok) qDebug() << "BIND FAIL";

    connect(&in, &QUdpSocket::readyRead,
            this, &MainWindow::slotReadData);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slotReadData()
{
    QNetworkDatagram data;
    if (in.hasPendingDatagrams())
    {
        data = in.receiveDatagram();
        if (data.isValid())
        {
            qDebug() << data.data();
        }else{
            qCritical() << "invalid datagram";
        }
    }
}

void MainWindow::on_pushButton_clicked()
{
    if (out.writeDatagram(QByteArray("Test"), QHostAddress::Broadcast, 49002) != 4)
    {
        qDebug() << "WRITE ERROR";
    }
}

«10.0.1.1» ? мб во второй сети иначе настроена маршрутизация? н1: чекать ошибки- проверять каждую переменную на пригодность н2: иметь варианты исправления адресов даже 192.168.0.х не всегда приемлим. нужно узнавать свой локальный адрес.

dashiells1xssanlgk ()
Ответ на: комментарий от dashiells1xssanlgk

нужно узнавать свой локальный адрес

что это значит? Зачем? Я слушаю порт.

Я ничего не понял что ты написал.
задал другие ip :)

ПК1 ifconfig 10.0.0.1/24 enp0s8
ПК2 ifconfig 10.0.1.1/24 enp0s8

Тоже самое tcpdump пакет видит пакет, а сокет нет. Как это делает tcpdump?
Я пробовал через нативный (raw) сокет, таже лажа. Получаю бродкаст только когда я в одной сети...

LinuxDebian ★★★★ ()
Последнее исправление: LinuxDebian (всего исправлений: 5)
Ответ на: комментарий от LinuxDebian

Дык маршрута то нет? Мало ли чего там по сети ходит. Почитай как устроенны сети. Вангую в 802.11 ты его и в неразборчивом режиме можешь не увидеть. По крайней мере я сделал бы такую реализацию.

Скинь выхлоп id addr show и route на обоих хостах, а то как-то не очень внятно ты конфиг описываешь, то есть у тебя адрес, то нет.

onhydro ()
Ответ на: комментарий от onhydro

#1

ip -c a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:c2:f2:6a brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fec2:f26a/64 scope link
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:47:95:19 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.2/24 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe47:9519/64 scope link
       valid_lft forever preferred_lft forever
4: enp0s9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 08:00:27:af:97:e9 brd ff:ff:ff:ff:ff:ff

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG    0      0        0 enp0s3
10.0.1.0        0.0.0.0         255.255.255.0   U     0      0        0 enp0s8
10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 enp0s3

#2
ip -c a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 08:00:27:94:2b:cf brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe94:2bcf/64 scope link
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:d5:12:5c brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fed5:125c/64 scope link
       valid_lft forever preferred_lft forever
4: enp0s9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 08:00:27:9d:9f:df brd ff:ff:ff:ff:ff:ff

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG    0      0        0 enp0s3
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 enp0s8
10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 enp0s3

LinuxDebian ★★★★ ()
Последнее исправление: LinuxDebian (всего исправлений: 1)

Ну начнем с того, что DHCP клиент (dhclient) в момент получения настроек не имеет ни какого ipv4|ipv6 адреса.
wiki:
В начале клиент выполняет широковещательный запрос по всей физической сети с целью обнаружить доступные DHCP-серверы. Он отправляет сообщение типа DHCPDISCOVER, при этом в качестве IP-адреса источника указывается 0.0.0.0 (если компьютер ещё не имеет собственного IP-адреса), а в качестве адреса назначения —широковещательный адрес 255.255.255.255.

anonymous ()

+ wireshark/tcpdump и т.п. читает как то так:

int s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
это можно проверить запустив strace.
в dhcp это делается как то так:
ifaces->sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

anonymous ()
Ответ на: комментарий от LinuxDebian

Как это делает tcpdump

man неразборчивый режим

В двух словах - в рамках одной физической ethernet сети есть вероятность видеть все пакеты всех устройств. На практике, если установлен роутер а не свитч, то такого может и не быть.

onhydro ()
Ответ на: комментарий от anonymous

Хм, тоже верно по идее. Но у автора прямое подключение. А вот должен ли он получать широковещательный пакет из сети, в которой не находится, это вопрос. В моём представлении не должен. Т.е. пакет то получить оттуда можно, но только слушая ethernet, а не ip.

onhydro ()
Ответ на: комментарий от LinuxDebian

Насколько я могу наблюдать, компы в разных сетях, на уровне ip. Попробуй сделать сначала так на хосте номер 2:

ip address add 10.0.1.42/24 dev enp0s8

По идее маршрут на только принимающей стороне не нужен.

onhydro ()
Ответ на: комментарий от onhydro

Если это нормальная сеть разбитая на VLAN-ы, то получит только широковещательный трафик в рамках vlan-a в который входит сетевой интерфейс/порт.

А вообще не понятно чего хочет «клиент». IPv4 адрес у него на интерфейсах не из воздуха же берется (читай динамический). Значит нужно как минимум отрубить dhclient чтобы он не мешал настройке сетевых интерфейсов.
Во вторых зачем ему IPv4 адрес и L3 если по нормальному надо работать на L2 уровне.

anonymous ()
Ответ на: комментарий от LinuxDebian

Тут мулька в том, что на уровне ip - dst ip конечно 255.255.255.255. А вот src ip намекает на сеть из которой летит. Не вижу смысла передавать на уровне сетевого стека пакет не адресованный этой машине куда то выше на уровне ip. Соответственно и услышать его на этом уровне или выше не должно быть способа. На уровне 2 - пожалуйста.

По крайней мере в моей дырявой голове такая картина, если кто-то поправит, буду премного благодарен.

onhydro ()
Ответ на: комментарий от onhydro

Т.е. есть два уровня броадкаста: l2 по маку. Прилетит всем хостам физически подключенным. Будет услышан на уровне l2.

l3 по ip. Должен быть обёрнут в l2 броадкаст или не полетит по всем физическим подключениям. Прилетит всем хостам в одной ip сети с отправителем. Будет услышан на уровне ip и выше.

Слать ip броадкаст в твоём случае - всё равно что слать пакет в одну сетевуху и надеятся, что её услышат во всех остальных.

onhydro ()
Ответ на: комментарий от LinuxDebian

Тоже самое tcpdump пакет видит пакет, а сокет нет. Как это делает tcpdump?

Вот так:

sudo tcpdump -i enp5s1 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp5s1, link-type EN10MB (Ethernet), capture size 262144 bytes
...


$ dmesg|tail -n1
[ 9938.324146] device enp5s1 entered promiscuous mode
alx777 ()