Open SerafimKuzmin opened 8 months ago
@SerafimKuzmin Просто случайный адрес в той же подсети для возможности направления трафика через интерфейс, иначе ругалось бы на отсутствие пути. Что конкретно не работает? Логи ядра, таблицы путей, список интерфейсов?
@SerafimKuzmin Просто случайный адрес в той же подсети для возможности направления трафика через интерфейс, иначе ругалось бы на отсутствие пути. Что конкретно не работает? Логи ядра, таблицы путей, список интерфейсов?
Начнем с того, что код в репозитория не компилируется по нескольким причинам:
/home/user/university/os_course/src/cvirt.c: In function ‘print_ip’: /home/user/university/os_course/src/cvirt.c:465:12: error: ‘return’ with a value, in function returning void [-Werror=return-type] 465 | return 0;
/home/user/university/os_course/src/cvirt.c: In function ‘setup’: /home/user/university/os_course/src/cvirt.c:597:26: error: assignment of read-only location ‘*(dev->dev_addr + (sizetype)j)’ 597 | dev->dev_addr[j] = (char)j;
/home/user/university/os_course/src/cvirt.c: In function ‘get_ip’: /home/user/university/os_course/src/cvirt.c:492:1: error: control reaches end of non-void function [-Werror=return-type] 492 | }
Компилировал под x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0 с помощью gcc-12
Исправления кода, чтобы он компилировался:
print_ip
return 0;
заменен на return;
get_ip
после всех условных операторов добавлен return -1
setup
заполнение MAC-адреса переписано следующим образом: memcpy(dev->dev_addr, parent_dev->dev_addr, ETH_ALEN);
user@user-RedmiBook-13:~/university/os_course/src$ sudo insmod cvirt.ko
user@user-RedmiBook-13:~/university/os_course/src$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: wlp0s20f3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 5c:80:b6:1b:34:47 brd ff:ff:ff:ff:ff:ff
inet 192.168.62.40/24 brd 192.168.62.255 scope global dynamic noprefixroute wlp0s20f3
valid_lft 2314sec preferred_lft 2314sec
inet6 fe80::dff6:ced0:b186:491a/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:e7:ae:7d:fd brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
4: br-8db0000384cf: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ea:90:38:21 brd ff:ff:ff:ff:ff:ff
inet 172.25.0.1/16 brd 172.25.255.255 scope global br-8db0000384cf
valid_lft forever preferred_lft forever
inet6 fe80::42:eaff:fe90:3821/64 scope link
valid_lft forever preferred_lft forever
9: veth48b2a06@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-8db0000384cf state UP group default
link/ether a6:5e:a0:0c:a2:f1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::a45e:a0ff:fe0c:a2f1/64 scope link
valid_lft forever preferred_lft forever
11: virt0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
link/ether 5c:80:b6:1b:34:47 brd ff:ff:ff:ff:ff:ff
inet6 fe80::e189:4da9:2a68:e487/64 scope link noprefixroute
valid_lft forever preferred_lft forever
В коде модуля wlp0s20f3
указан как родительский интерфейс.
user@user-RedmiBook-13:~/university/os_course/src$ sudo ip addr add 192.168.62.41/24 dev virt0
user@user-RedmiBook-13:~/university/os_course/src$ ip a | grep virt0
11: virt0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
inet 192.168.62.41/24 scope global virt0
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.62.99 0.0.0.0 UG 600 0 0 wlp0s20f3
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlp0s20f3
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.25.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-8db0000384cf
192.168.62.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp0s20f3
user@user-RedmiBook-13:~/university/os_course/src$ sudo ip route add 0.0.0.0/0 via 192.168.62.22 dev virt0
user@user-RedmiBook-13:~/university/os_course/src$ route -n
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.62.22 0.0.0.0 UG 0 0 0 virt0
0.0.0.0 192.168.62.99 0.0.0.0 UG 600 0 0 wlp0s20f3
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlp0s20f3
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.25.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-8db0000384cf
192.168.42.0 0.0.0.0 255.255.255.0 U 0 0 0 virt0
192.168.62.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp0s20f3
ping: Warning: source address might be selected on device other than: virt0
PING 192.168.62.1 (192.168.62.1) from 192.168.62.40 virt0: 56(84) bytes of data.
^C
--- 192.168.62.1 ping statistics ---
56 packets transmitted, 0 received, 100% packet loss, time 56301ms
user@user-RedmiBook-13:~/university/os_course/src$ arp -n
Адрес HW-тип HW-адрес Флаги Маска Интерфейс
192.168.62.99 ether d2:44:f6:87:44:c6 C wlp0s20f3
192.168.62.1 (не заверше virt0
Логи ядра:
https://github.com/DeaLoic/bmstu-OS-course/issues/1#issuecomment-1972917547
Хм. У тебя пинг не выставляет адрес virt0
.
Из того что я вижу по логам, пакеты нормально прокидываются с интерфейса и уходят, но считают, что ушли с wlp0s20f3
. Соответственно приходящие пакеты приходят с daddr
wlp0s20f3
.
Так же в таблице маршрутизации второй virt0
destination 192.168.42.0
, а не 192.168.62.0
, что странно (возможно проблема тут)
Проходит ли пинг на внешний адрес, 1.1.1.1
? А curl? А на какой-нибудь другой внутренний адрес?
Пытаюсь воспроизвести программу у себя и ничего не работает. Возник вопрос: откуда берется ip адрес, который добавляется в таблицу путей?
sudo ip route add 0.0.0.0/0 via 192.168.43.71 dev virt0
Какой смысл имеет адрес192.168.43.71
?