Я пытаюсь соединить интерфейс 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? Что мне не хватает?