前天树莓派 netctl-auto 突然出了奇怪的问题,导致启动后不能连接热点,没法 SSH。没有 TTL 线,只有一根网线却没有路由器怎么办呢? Google 一下,只用一根网线而不经路由器连接树莓派是可以实现的:ubuntu unity 里有通过有线网卡“分享连接”的功能,windows 也有类似的实现,可是我的 gnome 却没有…… 思考下,想起这个,非 ubuntu linux 实现起来也是没有难度的。

0. 内核开启转发

运行 sysctl net.ipv4.ip_forward=1

1. 查看有线网卡接口名

ifconfig 查看,一般是 eth0

2. 解除 NetworkManager 对接口的管理

因为我用 networkmanager 管理连接,它似乎不支持路由功能。解除它对有线接口的管理以防干扰,编辑 /etc/NetworkManager/NetworkManager.conf[keyfile] 下加入 unmanaged-device=mac:...,后接 eth0 MAC 地址。

3. 指定有线接口的 ip 地址

ip addr add 10.0.1.100/32 dev eth0 指定 eth0 在内网要用的 ip

4. 添加 DHCP 配置和 DHCP 服务器

/etc/dhcpd.conf 添加一块

option routers 10.0.1.100;
option subnet-mask 255.255.255.0;
subnet 10.0.1.0 netmask 255.255.255.0 {
    range 10.0.1.150 10.0.1.250;
}

然后新增接口上的 DHCP 服务器。保存 /etc/systemd/system/dhcpd4-eth0.service

[Unit]
Description=IPv4 DHCP server on eth0
Wants=network.target
After=network-pre.target
Before=network.target

[Service]
Type=forking
PIDFile=/run/dhcpd4-eth0.pid
ExecStartPre=/usr/bin/ifconfig eth0 up
ExecStart=/usr/bin/dhcpd -4 -q -pf /run/dhcpd4-eth0.pid
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

运行 systemctl daemon-reload 使之生效

5. iptables 配置

如果希望插上网线后树莓派还能通过电脑联网,运行下面添加 iptables 规则。否则就可以省略这一步了。

iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED
iptables -A FORWARD -i eth0 -j ACCEPT

启动 DHCP systemctl start dhcpd4-eth0,网线两头插上电脑和树莓派,稍后 systemctl status dhcpd4-eth0 可看到给树莓派分配的 ip,这样就能顺利 SSH 连接上了!