我有一个运行最新版本的raspbian的pi,它使用无线USB加密狗连接到Internet。我想做的是共享pi的wifi连接,以便使用LAN电缆连接到pi的任何计算机都可以接收Internet。我环顾了Internet,但似乎找不到任何相关的信息。我对Windows和Mac OS X上的这个过程很熟悉,但是在pi上执行此操作却让我感到困惑。通过wlan0在我的pi上访问Internet,但我想通过eth0共享该Internet连接。

评论

在Pi上桥接WiFi和以太网连接并将其插入路由器会更简单。这可能适合您的应用程序吗?

不幸的是,@ tlhIngan没有,您看到我无权访问任何以太网套接字,并且我需要从PXE引导笔记本电脑,这必须通过以太网来完成。另外,我想了解有关Linux的更多信息,并且我认为构建该项目会使我对Linux更有信心。我认为这将是一个更简单的解决方案,因为我的路由器一直在我家各处:/无论如何,谢谢您的答复。

我发现此教程视频正是您所需要的:youtu.be/IAa4tI4JrgI Raspberry PI共享从wifi到以太网端口的互联网。

@tlhIngan-您能详细说明吗?创建网桥是否也需要路由器?我希望网络音频接收器通过以太网共享我的Pis WiFi,并与主路由器位于同一子网和DHCP。

#1 楼

对于Raspbian Jessie

来自本文档:


我们将为此使用dnsmasq软件包,因为它是结合使用的
DHCP和DNS服务器,也很容易配置。

如果您想要更多“重量级”的东西,可以分别将isc-dhcp-serverbind9软件包分别用于DHCP和DNS,
但出于我们的目的,dnsmasq工作正常。

sudo apt-get install dnsmasq


我们需要配置接口。我们将为
eth0分配一个静态IP地址,该地址将用作网关。打开接口文件

sudo nano /etc/network/interfaces


编辑eth0部分,如下所示:

allow-hotplug eth0  
iface eth0 inet static  
    address 192.168.2.1
    netmask 255.255.255.0
    network 192.168.2.0
    broadcast 192.168.2.255


接下来,我们将进行配置dnsmasq。随附的dnsmasq配置文件
包含许多有关如何使用它的信息。因此,我建议您
移动它并创建一个新文件。
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig  
sudo nano /etc/dnsmasq.conf


编辑/etc/sysctl.conf文件以启用数据包转发

interface=eth0      # Use interface eth0  
listen-address=192.168.2.1 # listen on  
# Bind to the interface to make sure we aren't sending things 
# elsewhere  
bind-interfaces
server=8.8.8.8       # Forward DNS requests to Google DNS  
domain-needed        # Don't forward short names  
# Never forward addresses in the non-routed address spaces.
bogus-priv
# Assign IP addresses between 192.168.2.2 and 192.168.2.100 with a
# 12 hour lease time
dhcp-range=192.168.2.2,192.168.2.100,12h 


从包含
#的行的开头删除net.ipv4.ip_forward=1将在下次重新启动时启用数据包转发。但是,如果您想立即尝试而不重启,请执行


sudo nano /etc/sysctl.conf


我们还需要与通过Wi-Fi连接的设备共享RPi的Internet连接。我们将在eth0
wlan0之间配置NAT: ,因此请运行sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
将规则保存到文件/etc/iptables.ipv4.nat中。现在我们需要
在每次重新启动后运行此文件,因此使用
/etc/rc.local并在sudo nano /etc/rc.local行上方打开exit 0文件,然后在行以下添加


sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"


仅此而已!现在,只需重新启动RPi,您就可以
访问Internet

sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE  
sudo iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT  



针对Raspbian Stretch进行了更新

以上配置在Raspbian的较新版本中无效。因此,我为此创建了一个脚本,以减轻痛苦。

使用本指南连接到WiFi网络。

从此处下载脚本。将其放在/home/pi/

打开/home/pi/.config/lxsession/LXDE-pi/autostart文件

iptables-restore < /etc/iptables.ipv4.nat  


添加最后一行:

sudo reboot


请确保已提供文件的完整路径。这样就完成了。现在重新启动以查看更改

nano /home/pi/.config/lxsession/LXDE-pi/autostart


评论


非常感谢你。刚刚在我的pi上测试了一下,连接很好!再次感谢您的宝贵时间。我很感激。

–user47488
16年7月21日在17:34

这非常适合与无线设备共享Internet连接。但是,我想从网络中的另一台笔记本电脑访问该设备,但这不起作用。我猜是因为它们位于不同的子网中?有什么建议可以解决吗?

–BjörnAndersson
17年3月18日在13:40

它运行完美,尽管在Raspbian Stretch下,我不得不手动将WiFi配置包含到/ etc / network / interfaces中

–xfx
17年9月14日在9:49

@xfx,能否显示您为WiFi配置添加的代码?

–karl71
17年11月10日在21:26

我仔细地关注了您的帖子和链接。我的Pi(只是重新安装了操作系统),每当我添加“静态”一词时,它甚至都无法连接到wifi ...

–karl71
17年11月11日在9:45

#2 楼

作为您的目标是为您的LAN设备提供Internet访问,将假定双“ NAT”不会成为大问题。
使用此配置,您将为非WiFi设备提供无线访问,这将从Internet访问中受益。
前提条件
请确保您的Wi-Fi配置正确并且可以正常工作。如果出现问题,您将无法通过eth0访问设备。
设置
我们需要几个软件包才能开始:
apt-get update
apt-get install network-manager isc-dhcp-server

接口
编辑文件“ / etc / network / interfaces”以匹配以下内容,这将为您的eth0设置一个固定IP地址(10.10.10.1),然后将重新创建`resolv.conf`。
auto lo
iface lo inet loopback

iface default inet dhcp

allow-hotplug eth0
iface eth0 inet static
  address 10.10.10.1
  network 10.10.10.0
  netmask 255.255.255.0
  broadcast 10.10.10.255
  gateway 10.10.10.1

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
  wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
  up cat /etc/resolv.conf | sed 's/ver /ver 127.0.0.1,/g' > /etc/resolv_local.conf
  up cat /etc/resolv.conf | sed 's/ver /ver 127.0.0.1,/g' > /etc/resolv.conf

DHCP
修改默认的`dhcp'配置使其具有权威性并添加LAN网络(10.10.10。*),编辑文件`/ etc / dhcp / dhcpd.conf`,添加以下内容:
# configuration for the bridge internal subnet.
subnet 10.10.10.0 netmask 255.255.255.0 {
  range 10.10.10.101 10.10.10.119;
  option domain-name-servers 8.8.8.8;
  option domain-name "domain.local";
  option routers 10.10.10.1;
  default-lease-time 600;
  max-lease-time 7200;
}

IPTABLES
现在创建以下脚本来设置和启动每次重新启动时都连接网络。该脚本将动态创建一些“ IPTABLES”规则。将其命名为`/ root / bridge.sh`:
#!/bin/bash
LOCAL_IFACE=eth0
INET_IFACE=wlan0

# this is where the dhcp info comes in. We need the default gateway
# /var/lib/dhcp/dhclient.wlan0.leases
f=/var/lib/dhcp/dhclient.$INET_IFACE.leases
GATEWAY=$(cat $f| grep "option route" | tail -1 |awk '{print }'| sed 's/;//')

IPT=$(which iptables)
# get the wlan address
INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print }' |awk -F$

# Flush the tables
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -t nat -F

$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT

# Allow forwarding packets:
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

# Packet masquerading
$IPT -t nat -A POSTROUTING -o $INET_IFACE  -j SNAT --to-source $INET_ADDRESS
$IPT -t nat -A POSTROUTING -o $LOCAL_IFACE -j MASQUERADE

# save the created tables 
iptables-save > /etc/network/iptables

#cat /proc/sys/net/ipv4/ip_forward
# make sure we are forwarding packets
echo "1" > /proc/sys/net/ipv4/ip_forward
sysctl --system > /dev/nul

#remove the default route, usually on eth0 interface
route del default
#ifdown $INET_IFACE  && ifup $INET_IFACE
#ensure is $INET_IFACE now...
route add default gw $GATEWAY $INET_IFACE
gw=$(route -n -A inet | grep '^0.0.0.0' |awk '{ print  }')
echo "default route is now " $gw

最后
最后,您需要在每次重新启动时运行脚本,在脚本的“ exit 0”之前添加以下两行文件`/etc/rc.local'运行之前创建的脚本。
# will run the bridge on startup
sudo ./root/bridge.sh

现在,只需重新启动设备,网桥将为您工作。

pd:为简洁起见,省略了sudo。使用sudo -iE进行会话
root


评论


哇!非常感谢您提供如此详细的答案!我从来没有意识到它会那么复杂,但是我认为我可以解决它。再次感谢您,我将在几个小时内尝试一下,如果可以,我会将您标记为答案。非常感谢

–user47488
16年4月4日在7:59

@GrowlingSolid应该没有那么复杂。答案是您使用network-manager来管理网络,该网络与dhcpcd不兼容,而dhcpcd是Raspbian的默认设置。使用备用管理器没有任何问题,但是您应该禁用dhcpcd(答案是间接执行此操作,因为dhcp将导致dhcpcd停止)。它还将阻止GUI中的WiFi支持。

–地铁
16-6-26在4:27



我已通知自己,并来到了正确的行而不是您的行:INET_ADDRESS = $(ifconfig $ INET_IFACE | grep“ inet addr” | awk'{print $ 2}'| awk -F“:”'/ 1 / {print $ 2 }')您的“假”版本为:INET_ADDRESS = $(ifconfig $ INET_IFACE | grep“ inet addr” | awk'{print $ 2}'| awk -F $

–Luke_R
2017年12月6日18:26



dhcpd.conf选项路由器应该是10.10.1.1还是10.10.10.1?错别字?

–大卫
20年8月21日在23:57