在前两篇 post 中(iPad 与 Raspberry Pi 4 通过 Type-C 直连 —— SSH 篇 和 iPad 与 Raspberry Pi 4 通过 Type-C 直连 —— VNC 篇),虽然 SSH 和 VNC 都可以愉快的工作,Raspberry Pi 也可以正常的用 Wi-Fi 上网。然而!(゚o゚;;
iPad 在连接有线以太网之后就默认所有的通信都走以太网了;同时,在默认设置下,Raspberry Pi 也并不会帮 iPad 做网络转发,因此还需要再单独设置一下 Raspberry Pi 上的 NAT,做到 iPad ⇆ Type C ⇆ Pi (usb0) ⇆ Pi (wlan0)
哎,不就是 iptables 和 NAT 嘛,去 pick up 一下,现学现卖hhhhhhhh╮(╯▽╰)╭
首先需要打开 Raspberry Pi 上的转发
# 下面的命令均以 root 用户执行 sudo -i # 开启转发 echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sudo sysctl -p
然后需要把 usb0
的优先级改低一点,避免 Raspberry Pi 默认网络走 usb0
。在 /etc/dhcpcd.conf
中原来我们编辑的 usb0
的下面~设置一下优先级为 500
(需要用 root 身份编辑~)
interface usb0 static ip_address=10.42.0.1/24 static routers=10.42.0.1 metric 500
接下来就是我刚刚 pick up 的 iptables 规则(((o(*゚▽゚*)o)))
update: 经过大萝莉 @adolli 的提醒~下面的是差不多与 SSH 隧道等价的实现,而 NAT 方式的话,「经过 usb0 的 output 流量 masquerade 一下,input 不需要配置」
# 下面的命令均以 root 用户执行 sudo -i mkdir -p /etc/iptables cat <<EOF >/etc/iptables/usb0-wlan0-nat.v4 *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A POSTROUTING -o wlan0 -j MASQUERADE COMMIT *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -s 10.42.0.0/24 -i usb0 -p icmp -j ACCEPT -A INPUT -s 10.42.0.0/24 -i usb0 -p tcp -j ACCEPT -A INPUT -s 10.42.0.0/24 -i usb0 -p udp -j ACCEPT -A INPUT -s 10.42.0.0/24 -i usb0 -j REJECT --reject-with icmp-host-prohibited -A INPUT -j DROP -A FORWARD -d 10.42.0.0/24 -i usb0 -j DROP -A FORWARD -s 10.42.0.0/24 -i usb0 -j ACCEPT -A FORWARD -d 10.42.0.0/24 -i wlan0 -j ACCEPT -A FORWARD -i usb0 -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j DROP -A OUTPUT -j ACCEPT COMMIT EOF
update: 那么对应的 NAT 的方式的话,大概就是如下的?手动 @adolli 问问(((o(*゚▽゚*)o)))
# 下面的命令均以 root 用户执行 sudo -i mkdir -p /etc/iptables cat <<EOF >/etc/iptables/usb0-wlan0-nat.v4 *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A POSTROUTING -o wlan0 -j MASQUERADE COMMIT
最后创建一个 systemd service,让 Raspberry Pi 每次开机时都自动应用上面的 iptables 规则
# 下面的命令均以 root 用户执行 sudo -i cat <<EOF >/etc/systemd/system/usb0-nat-iptables.service [Unit] Description=NAT for usb0 After=network-online.target Wants=network-online.target [Service] User=root Type=oneshot ExecStart=/sbin/iptables-restore /etc/iptables/usb0-wlan0-nat.v4 [Install] WantedBy=multi-user.target EOF systemctl enable usb0-nat-iptables # 重启 Raspberry Pi sudo reboot
测试下来速度貌似还是可以的,肯定会有一点点 tradeoff 倒是╮( ̄▽ ̄"")╭
最后实际测试 100Mbps 的宽带,这样子可以跑到 90Mbps 上下,日常来说倒是问题不大~
![](/wp-content/uploads/2019/12/pi-typec-nat-scaled.png)
感谢大佬教程 按照大佬的前两篇文章的操作搞定了直连(其实就是copy and paste)然而按照这篇文章一顿操作(copy)之后 iPad还是上不去网 大佬觉得我可能哪里操作出错了