
Это мой первый вопрос в категории «суперпользователь», поэтому прошу прощения, если он не по теме.
Я использую pop!_OS 19.10 (на основе Ubuntu 19.10) и пытаюсь понять его сетевое поведение. Учитывая сетевой интерфейс eth0
, я добавил следующие подсети:
ip addr add dev eth0 192.168.2.18/24
ip addr add dev eth0 192.168.3.18/24
Интерфейс теперь выглядит следующим образом (MAC-адрес изменен)
1: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.18/24 scope global enp0s31f6
valid_lft forever preferred_lft forever
inet 192.168.3.18/24 scope global enp0s31f6
valid_lft forever preferred_lft forever
Используя nc
, я могу отправлять данные между IP-адресами 192.168.2.18
и 192.168.3.18
.
##################################################################################
# nc -v -l 192.168.2.18 8080
Listening on [pop-os] (family 2, port 8080)
Listening on pop-os 8080
Connection received on pop-os 55361
Hello World!
##################################################################################
# nc -v -s 192.168.3.18 192.168.2.18 8080
Connection to 192.168.2.18 8080 port [tcp/http-alt] succeeded!
Hello World!
##################################################################################
# ss -4 -n
tcp ESTAB 0 0 192.168.3.18:55361 192.168.2.18:8080
tcp ESTAB 0 0 192.168.2.18:8080 192.168.3.18:55361
Вопрос 1:Прав ли я, предполагая, что адреса в пределахотдельные подсетинатот же интерфейсвсегда могут общаться друг с другом (если только не заблокировано брандмауэром)? Это потому, что ядро просматривает таблицу маршрутизации и видит, что оно может просто локально соединить две сети? То есть:
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Теперь я проверил это, потому что я изучал Kernel IP-Forwarding и читалздесь:
Однако если пересылка отключена, ядро сначала проверит, с какого интерфейса пришел пакет. Если он не пришел с того же интерфейса, ядро отбросит его.
Однако я также могу подключиться 192.168.2.18
через свой другой интерфейс wlan0
, используя адрес 192.168.1.73
. У меня отключена переадресация IP.
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 192.168.2.18:8080 192.168.1.73:40405
tcp ESTAB 0 0 192.168.1.73:40405 192.168.2.18:8080
Вопрос 2:Почему IP-адреса в разных подсетях и интерфейсах могут взаимодействовать без включенной IP-пересылки? Это потому, что они принадлежат одному и тому же хосту? Где определено это поведение? То есть правила IP-пересылки вступят в силу только после того, как пакеты начнут покидать хост?
решение1
Вопрос №1: Прав ли я, предполагая, что адреса в отдельных подсетях на одном интерфейсе всегда могут взаимодействовать друг с другом (если только это не заблокировано брандмауэром)? Это потому, что ядро просматривает таблицу маршрутизации и видит, что оно может просто локально соединить две сети? То есть:
Да. Это вызвано не записями "subnet", которые вы нашли, а записями "local address", которые находятся в отдельной таблице маршрутизации (таблица "local"). Старый инструмент "route", скорее всего, намеренно скрывает эти записи, но он также устарел и не может полностью отображать информацию о маршрутизации, хранящуюся в современных ядрах Linux, поэтому используйте:
ip -4 route show table local
ip -6 ro ls tab local
(Примечание: это характерно для Linux. В BSD обычно есть только одна таблица маршрутизации, и netstat -rn
она показывает специальные маршруты с l
установленным флагом. В других операционных системах это может быть просто встроенное поведение, и оно не обязательно отображается как маршруты вообще.)
Кроме того, адреса даже не обязательно должны находиться на одном и том же интерфейсе, поскольку пакетыникогда не используйте физический интерфейс. Вместо этого ядро ведет себя так, как будто его собственные адреса просто маршрутизируются черезпетляинтерфейс «ло».
Вопрос №2: Почему IP-адреса в разных подсетях и интерфейсах могут взаимодействовать без включенной IP-пересылки? Это потому, что они принадлежат одному и тому же хосту? Где определено это поведение? То есть правила IP-пересылки вступят в силу только после того, как пакеты начнут покидать хост?
Да, это потому, что они принадлежат одному и тому же хосту. (В Linux они также должны находиться в одном и том же сетевом пространстве имен, например, в одном контейнере.)
Правила пересылки IP вступают в силу, когда пакетполученныйчерез интерфейс без обратной связи (например, он подключился по Ethernet к локальному MAC-адресу), но его IP-адрес назначения не распознается как принадлежащий хосту.
Локально сгенерированные пакеты по определению не «пересылаются» (они являются «выходными», поскольку имеют локальный исходный IP-адрес), поэтому правила пересылки не применяются.