我正在尝试将 tap0 和 en0 接口与 natd 连接起来。(简化的)背景如下:
我在智能手机上运行一个应用程序,在笔记本电脑上运行一个简单的 UDP 服务器。UDP 服务器正在监听 tap 接口,我想用我的智能手机应用程序与服务器对话。(正如我所说,这有点简化,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 不应该在 en0 上打开端口 50000、接受数据包并将它们 NAT 到 tap0 接口吗?我遗漏了什么?
答案1
似乎我已经通过使用 pf 和 pfctl 找到了解决方案。这似乎有效:
激活端口转发:
$ sudo sysctl net.ipv4.ip_forward=1
将以下规则添加到 pf.conf(位于 /private/etc/)
“rdr on en0 proto udp 从任意到任意端口 50000 -> 10.1.1.100 端口 50000”(不带引号,位于“rdr-anchor”正下方)
阅读 pf 规则:
$ sudo pfctl -f /private/etc/pf.conf
激活 pf:
$ sudo pfctl -e