Соединение между подсетями на разных интерфейсах без IP-переадресации

Соединение между подсетями на разных интерфейсах без IP-переадресации

Это мой первый вопрос в категории «суперпользователь», поэтому прошу прощения, если он не по теме.

Я использую 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-адрес), поэтому правила пересылки не применяются.

Связанный контент