2

Я пытаюсь соединить интерфейс tap0 и en0 с natd. (Упрощенный) фон:

У меня есть одно приложение на смартфоне и простой UDP-сервер на моем ноутбуке. UDP-сервер прослушивает тап-интерфейс, и я хочу поговорить с сервером через приложение для смартфона. (Как я уже сказал, это немного упрощено, UDP-сервер должен прослушивать интерфейс Tap и не может прослушивать en0.)

Я попробовал следующее:

  • Откройте tap0:

    $ su
    $ exec 5<>/dev/tap0   (running in one terminal-tab)
    
  • Установите адрес tap0, маску сети и т.д.

    $ sudo ifconfig tap0 inet 10.1.1.100 netmask 255.255.255.0 broadcast 10.1.1.255
    
  • Включить переадресацию портов

    $ sudo sysctl -w net.inet.ip.forwarding=1
    
  • Запустите natd:

    $ sudo /usr/sbin/natd -alias_address MY_EN0_IP \
        -interface tap0 -use_sockets -same_ports -dynamic -clamp_mss \
        -enable_natportmap -natportmap_interface en0 \
        -redirect_port udp 10.1.1.100:50000 50000 -l
    
  • Запустите образец UDPServer, прослушивая 10.1.1.100:50000

Netstat показывает открытый порт:

$ netstat -n | grep 50000
udp4       0      0  10.1.1.100.50000       *.*

Когда я отправляю пакет со своего смартфона на ноутбук с целью:MY_EN0_IP:50000, я вижу, что пакет с Wireshark прибывает в en0, но ноутбук отвечает сообщением "Порт ICMP недоступен".

Я понятия не имею, что происходит не так, не должен ли natd открыть порт 50000 на en0, принять пакеты и передать их NAT на интерфейс tap0? Что мне не хватает?

1 ответ1

2

Кажется, я нашел решение сам, используя pf и pfctl. Это похоже на работу:

  • активировать переадресацию портов:

    $ sudo sysctl net.ipv4.ip_forward=1
    
  • Добавьте следующее правило в pf.conf (находится в /private /etc /)

    «rdr на en0 proto udp с любого на любой порт 50000 -> 10.1.1.100 порт 50000» (без кавычек и прямо под «rdr-anchor»

  • прочитайте правила

    $ sudo pfctl -f /private/etc/pf.conf
    
  • активировать pf:

    $ sudo pfctl -e
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .