Назад | Перейти на главную страницу

Пересылка ответа ICMP на интерфейс TAP

Я пытаюсь провести тест, в котором я пересылаю ответы ICMP на интерфейс TAP. Я создал интерфейс TAP и назначил ему адрес 10.0.4.1/24.

Моя установка linux использует интерфейс enp0s3 как вариант по умолчанию. Чтобы переслать любой ответ ICMP на интерфейс TAP, я попробовал следующие правила:

# iptables -t nat -A PREROUTING -i enp0s3 -p icmp -j DNAT --to 10.0.4.1
# iptables -A FORWARD -p icmp -i enp0s3 -j ACCEPT
# iptables -t nat -A POSTROUTING -o 10.0.4.1 -j MASQUERADE

На данный момент интерфейс TAP находится в состоянии UP, и у меня есть программа который слушает интерфейс TAP.

Если я пингую внешний IP-адрес, например 8.8.8.8, ping программа все еще может получить ответ. Я хочу спросить, не следует ли ping программа не получает ответа, потому что ответ ICMP перенаправляется на интерфейс TAP? Кроме того, правильный ли мой подход к перенаправлению трафика на устройство TAP?

IP-адрес, назначенный интерфейсу TAP, принадлежит хосту, поэтому это локальный IP-адрес. Пример:

# ip -4 address show tap0
20: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    inet 10.0.4.1/24 scope global tap0
       valid_lft forever preferred_lft forever
# ip route get 10.0.4.1
local 10.0.4.1 dev lo src 10.0.4.1 uid 0 
    cache <local> 

Важен только маршрут к TAP-интерфейсу. То есть из-за неявного маршрута, добавленного при запуске интерфейса, любой IP-адрес в 10.0.4.0/24 Кроме 10.0.4.1.

# ip route get 10.0.4.2
10.0.4.2 dev tap0 src 10.0.4.1 uid 0 
    cache 

Поэтому, если вы хотите, чтобы ваша программа действительно видела какой-либо трафик, попробуйте заменить в своих правилах 10.0.4.1, например, 10.0.4.2. Реальный ответ с этого IP-адреса, если это цель, зависит от прилагаемой программы (и при использовании tap, а не tun, ответ также и на ARP).

Прочие примечания:

  • вы допустили опечатку в последнем правиле, это адрес назначения, поэтому -d скорее, чем -o. Вы можете вообще выбрать МАСКЕРАДИРОВАНИЕ источника, нет необходимости направлять пакет в программу и получать (правильный) ответ, отправленный обратно исходному источнику.
  • неясно, привлекаете ли вы на самом деле другого партнера для проведения теста. Выполнение теста с самого хоста не потребует nat / PREROUTING и filter / FORWARD, но nat / OUTPUT и filter / OUTPUT.
  • Если бы другой партнер действительно был задействован, как это было, ваш тест использовал бы filter / INPUT, а не filter / FORWARD, и не использовал бы nat / POSTROUTING, поскольку пункт назначения является локальным. В любом случае после исправления он будет использовать filter / FORWARD и nat / POSTROUTING.
  • если вы используете tap (уровень 2: ethernet), а не tun (layer3: ip), ищите этот icmp (с tcpdump или в прикрепленной программе) и не просматривая его, ищите также неотвеченные запросы ARP.

Дополнительная ссылка: https://backreference.org/2010/03/26/tuntap-interface-tutorial/