Я пытаюсь направить трафик между разными сетями и следую руководству, которое нашел здесь: https://devconnected.com/how-to-add-route-on-linux/
Вот диаграмма, которая, я надеюсь, адекватно отображает схему, с которой я работаю:
Windows 10 Ubuntu Linux
172.31.0.X <----------> 172.31.0.33 (eno1)
10.0.40.1 (enp2s0f0) <----------> 10.0.40.10
У меня на ПК с Windows настроен постоянный маршрут для маршрутизации всего трафика для 10.0.40.0/24 через 172.31.0.33.
Машина Ubuntu настроена на маршрутизацию трафика, предназначенного для 10.0.40.0/24, через 10.0.40.1.
Пинг 10.0.40.10 с машины Ubuntu работает, как и ожидалось.
Если я пингую 10.0.40.10 с ПК с Windows, я вижу, что сообщения ICMP приходят на интерфейс 172.31.0.33 на машине Ubuntu с помощью tcpdump. Я не вижу никакого трафика на интерфейсе 10.0.40.1 на этой машине. Похоже, что машина Ubuntu не маршрутизирует трафик, как я ожидал. Может ли кто-нибудь пролить свет на то, что я упустил?
Добавление вывода:
iptables -S
для машины Ubuntu:
sudo iptables -S
# Warning: iptables-legacy tables present, use iptables-legacy to see them
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -i eno1 -j ACCEPT
-A FORWARD -i enp2s0f0 -j ACCEPT
adi@LabBuildServer:~$ sudo iptables-legacy -S
[sudo] password for adi:
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-e925d11be2da -m conntrack --ctstate RELATED,ESTABLISHED -j ACCE PT
-A FORWARD -o br-e925d11be2da -j DOCKER
-A FORWARD -i br-e925d11be2da ! -o br-e925d11be2da -j ACCEPT
-A FORWARD -i br-e925d11be2da -o br-e925d11be2da -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-e925d11be2da ! -o br-e925d11be2da -j DOCKER-IS OLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-e925d11be2da -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
Вывод:
ip route
на хосте Linux:
ip route
default via 10.0.40.1 dev br-POE proto static
10.0.40.0/24 dev br-POE proto kernel scope link src 10.0.40.10
Машина с Ubuntu:
adi@LabBuildServer:~$ sudo iptables -t nat -L
[sudo] password for adi:
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
MASQUERADE all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
решение1
Решение прямо здесь:
-P FORWARD DROP
В вашем iptables-legacy
наборе правил политика пересылки пакетов по умолчанию установлена на DROP, и в этом наборе правил нет правила, которое разрешало бы пересылку пакетов с eno1
на enp2s0f0
, а только пересылку с/на интерфейс моста...
Смешивать разные iptables — всегда плохая идея. Вам следует решить самостоятельно, хотите ли вы использовать один из них iptables
или нет iptables-legacy
— каждый сетевой пакет будет проходить через оба набора правил, что приведет к большой путанице.
обновлять:
Мой ответ не должен означать, что вам нужно установить политику по умолчанию как принять, я просто указал на причину. Конечно, вы можете добавить правила, чтобы разрешить пересылку трафика только на эти конкретные IP-адреса, например, так:
-A FORWARD -i eno1 -s 172.31.0.0/24 -o enp2s0f0 -d 10.0.40.0/24 -j ACCEPT
-A FORWARD -i enp2s0f0 -s 10.0.40.0/24 -o eno1 -d 172.31.0.0/24 -j ACCEPT