多树莓派搭建网络转发后内网设备无法访问电脑的解决求助(不修改路由器配置)
看起来你已经把两个树莓派的转发链路搭得有模有样了,电脑能访问内网和外网就说明基本的转发逻辑是通的!现在的核心问题是内网其他设备找不到你的电脑——毕竟你的电脑在192.168.2.0/24这个子网,而路由器那边的设备都在192.168.1.0/24,它们根本不知道有这么个子网存在,更别说怎么找过去了。而且你还不想动路由器配置,那咱们就得在树莓派上做文章了。
先梳理下你的当前配置(顺便纠正个小笔误)
树莓派1(靠近路由器的一端)
# 你原命令里写的ppp0应该是笔误,改成eth0才对 ip addr add 192.168.1.100/24 dev eth0 # 设置ppp0静态IP ip addr add 192.168.0.1/24 dev ppp0 # 开启IP转发 echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf echo 'net.ipv6.conf.all.forwarding=1' >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf # 添加到Pi2子网的路由 ip route add 192.168.2.0/24 via 192.168.0.2 dev ppp0 # 配置NAT转发到外网 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
树莓派2(靠近电脑的一端)
# 设置eth0静态IP ip addr add 192.168.2.1/24 dev eth0 # 设置ppp0静态IP ip addr add 192.168.0.2/24 dev ppp0 # 开启IP转发 echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf echo 'net.ipv6.conf.all.forwarding=1' >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf # 添加默认路由到Pi1 ip route add default via 192.168.0.1 # 添加到路由器子网的路由 ip route add 192.168.1.0/24 via 192.168.0.1 dev ppp0 # 这条NAT规则其实没必要,后面会说怎么删 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
你的电脑
# 设置静态IP ip addr add 192.168.2.100/24 dev eth0 # 默认路由指向Pi2 ip route add default via 192.168.2.1 # 添加DNS echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf
问题根源
路由器子网(192.168.1.0/24)里的设备没有到192.168.2.0/24子网的路由条目,所以它们收到电脑的回复包后,根本不知道该往哪发,只能直接丢包。既然不能改路由器配置,咱们有两个实用方案可选:
方案一:反向NAT映射(最简单,适合大多数场景)
这个思路是把电脑的IP“挂靠”到Pi1的eth0 IP上,内网设备访问Pi1的IP就相当于访问你的电脑。如果只是需要ping通或者访问电脑的所有服务,直接做全端口映射就行:
在树莓派1上执行以下命令:
# 把所有发往Pi1 eth0 IP(192.168.1.100)的流量转发到电脑 iptables -t nat -A PREROUTING -d 192.168.1.100 -j DNAT --to-destination 192.168.2.100 # 确保电脑的回复流量能正确回到内网设备 iptables -t nat -A POSTROUTING -s 192.168.2.100 -j SNAT --to-source 192.168.1.100
完成后,内网设备直接ping 192.168.1.100就能通你的电脑,访问这个IP的端口也会转发到电脑对应端口。缺点是没法直接用192.168.2.100访问,但胜在简单稳定,不会触发防火墙告警。
方案二:ARP欺骗+路由注入(支持直接用电脑IP访问)
如果必须让内网设备直接用192.168.2.100访问电脑,那可以让Pi1通过ARP欺骗,告诉内网设备“要去192.168.2.0/24的流量都发给我”:
步骤1:确认Pi1的路由配置(已经做过,检查下)
确保Pi1有到电脑子网的路由:
ip route add 192.168.2.0/24 via 192.168.0.2 dev ppp0
步骤2:安装ARP工具
在Pi1上安装arping:
sudo apt-get update && sudo apt-get install arping
步骤3:发送ARP公告
一次性发送公告,告诉内网设备192.168.2.0/24的网关是Pi1:
sudo arping -U -c 5 -I eth0 192.168.1.100 -s 192.168.2.0
如果需要持续生效,可以安装dsniff用arpspoof:
sudo apt-get install dsniff # 持续欺骗整个内网子网 sudo arpspoof -i eth0 -t 192.168.1.0/24 192.168.2.0
这个方案的优点是内网设备能直接用电脑IP访问,但ARP欺骗可能会被某些企业级防火墙拦截,而且重启后需要重新执行。
额外优化:删掉Pi2上多余的NAT规则
你在Pi2上配置的iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE完全没必要,反而会把电脑的源IP改成Pi2的eth0 IP,导致Pi1没法正确转发回复流量。赶紧删掉:
# 在Pi2上执行 iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
备注:内容来源于stack exchange,提问作者Manitoba

