iPad 与 Raspberry Pi 4 通过 Type-C 直连 —— NAT 篇

在前两篇 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 上下,日常来说倒是问题不大~

声明: 本文为 Cocoa 原创, 转载注明出处喵~

One thought on “iPad 与 Raspberry Pi 4 通过 Type-C 直连 —— NAT 篇”

  1. 感谢大佬教程 按照大佬的前两篇文章的操作搞定了直连(其实就是copy and paste)然而按照这篇文章一顿操作(copy)之后 iPad还是上不去网 大佬觉得我可能哪里操作出错了

Leave a Reply

Your email address will not be published. Required fields are marked *