Chia sẻ kết nối WiFi của Pi thông qua cổng Ethernet


28

Tôi có một pi chạy bản phát hành mới nhất của raspbian và nó được kết nối với Internet bằng khóa USB không dây. Những gì tôi muốn làm là chia sẻ kết nối wifi của pi để bất kỳ máy tính nào được kết nối với pi sử dụng cáp LAN đều có thể nhận được Internet. Tôi đã có một cái nhìn trên Internet nhưng dường như tôi không thể tìm thấy bất cứ điều gì liên quan. Tôi quen thuộc với quy trình này trên Windows và Mac OS X, nhưng thực hiện điều này trên pi đã khiến tôi bối rối.

EDIT: Tôi không biết liệu điều này có giúp được ai không nhưng tôi được kết nối với Internet trên pi của mình thông qua wlan0, nhưng tôi muốn chia sẻ kết nối Internet đó qua eth0.


Kết nối WiFi và kết nối Ethernet của bạn trên Pi và cắm nó vào bộ định tuyến sẽ đơn giản hơn. Điều này có thể cho ứng dụng của bạn?
tlhIngan

@tlhIngan thật không may, bạn thấy tôi không có quyền truy cập vào bất kỳ ổ cắm Ethernet nào và tôi cần khởi động máy tính xách tay của mình từ PXE, điều này phải được thực hiện bởi Ethernet. Ngoài ra tôi muốn tìm hiểu thêm về Linux và tôi nghĩ rằng việc xây dựng dự án này sẽ giúp tôi tự tin hơn một chút với Linux. Tôi nghĩ rằng đây sẽ là một giải pháp dễ dàng hơn vì bộ định tuyến của tôi ở khắp nhà tôi: / Dù sao, cảm ơn bạn đã trả lời.

Tôi tìm thấy video hướng dẫn này chính xác những gì bạn cần: youtu.be/IAa4tI4JrgI Raspberry PI chia sẻ internet nó nhận được từ wifi đến cổng Ethernet.
Mia19

@tlhIngan - Bạn có thể giải thích? Tạo một cây cầu cũng cần một bộ định tuyến? Tôi muốn bộ thu âm thanh mạng của tôi chia sẻ WiFi Pis của tôi qua Ethernet và trên cùng một mạng con và DHCP làm bộ định tuyến chính của tôi.
vuông_eyes

Câu trả lời:


40

Dành cho Raspbian Jessie

Từ tài liệu này :

Chúng tôi sẽ sử dụng dnsmasqgói cho mục đích này vì nó được kết hợp máy chủ DHCP và DNS và cũng dễ dàng cấu hình.

Nếu bạn muốn một cái gì đó nhiều hơn một chút 'nặng', bạn có thể sử dụng isc-dhcp-serverbind9gói cho DHCP và DNS tương ứng, nhưng đối với mục đích của chúng tôi, dnsmasqhoạt động tốt.

sudo apt-get install dnsmasq

Chúng ta cần cấu hình các giao diện. Chúng tôi sẽ chỉ định một địa chỉ IP tĩnh eth0sẽ được sử dụng làm cổng. Mở tệp giao diện

sudo nano /etc/network/interfaces

Chỉnh sửa eth0phần như thế này:

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

Tiếp theo, chúng tôi sẽ cấu hình dnsmasq. Các dnsmasqtập tin cấu hình vận chuyển chứa rất nhiều thông tin về cách sử dụng nó. Vì vậy, tôi sẽ khuyên bạn nên di chuyển nó và tạo một cái mới.

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig  
sudo nano /etc/dnsmasq.conf

Dán đoạn sau vào tập tin mới

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 

Chỉnh sửa /etc/sysctl.conftập tin để cho phép chuyển tiếp gói

sudo nano /etc/sysctl.conf

Loại bỏ #từ đầu dòng chứa net.ipv4.ip_forward=1Điều này sẽ cho phép chuyển tiếp gói trong lần khởi động lại tiếp theo. Nhưng nếu bạn muốn thử ngay bây giờ mà không cần khởi động lại thì hãy làm điều này.

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

Chúng tôi cũng cần chia sẻ kết nối internet của RPi với các thiết bị được kết nối qua Wi-Fi. Chúng tôi sẽ cấu hình NAT giữa eth0wlan0:

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  

Tuy nhiên, chúng tôi cần các quy tắc này được áp dụng mỗi khi chúng tôi khởi động lại Pi, vì vậy hãy chạy sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" để lưu quy tắc vào tệp /etc/iptables.ipv4.nat. Bây giờ chúng ta cần chạy nó sau mỗi lần khởi động lại, vì vậy hãy mở /etc/rc.localtệp với sudo nano /etc/rc.localvà ngay phía trên dòng exit 0, thêm dòng sau:

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

Và đó là tất cả! Bây giờ chỉ cần Khởi động lại RPi của bạn và bạn sẽ có thể truy cập Internet

sudo reboot

Cập nhật cho Raspbian Stretch

Cấu hình trên sẽ không hoạt động trong phiên bản mới hơn của Raspbian. Vì vậy, tôi đã tạo ra một kịch bản cho điều này để có thể giảm bớt đau đớn.

Kết nối với mạng WiFi bằng hướng dẫn này .

Tải tập lệnh từ đây . Đặt nó tại/home/pi/

Mở /home/pi/.config/lxsession/LXDE-pi/autostarttập tin

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

Thêm dòng cuối cùng:

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@point-rpi
sudo bash /home/pi/wifi-to-eth-route.sh

Hãy chắc chắn rằng bạn đã đưa ra đường dẫn đầy đủ đến tập tin. Và bạn đã hoàn thành. Bây giờ khởi động lại để xem những thay đổi

sudo reboot

1
Cảm ơn nhiều. Chỉ cần thử nghiệm điều này trên pi của tôi và kết nối vẫn ổn! Một lần nữa, cảm ơn đã dành thời gian cho tôi. Tôi đánh giá cao nó.

1
Điều này là tuyệt vời để chia sẻ kết nối internet với một thiết bị không dây. Tuy nhiên, tôi muốn truy cập thiết bị từ một máy tính xách tay khác trong mạng của mình và điều đó không hoạt động. Tôi đoán đó là vì họ ở các mạng con khác nhau? Bất kỳ lời khuyên để có được xung quanh nó?
Bjorn Andersson

1
Nó hoạt động hoàn hảo, mặc dù trong Raspbian Stretch, tôi phải đưa cấu hình WiFi theo cách thủ công vào / etc / mạng / giao diện
xfx

1
@xfx, bạn có thể vui lòng hiển thị mã bạn đã thêm cho cấu hình WiFi không?
karl71

1
Tôi theo dõi bài viết của bạn và các liên kết cẩn thận. My Pi (vừa cài đặt hệ điều hành mới), bất cứ khi nào tôi thêm từ "tĩnh", nó thậm chí không thể kết nối với wifi ...
karl71

6

Mục đích của bạn là cung cấp quyền truy cập internet vào các thiết bị LAN của bạn, sẽ cho rằng gấp đôi 'NAT' sẽ không phải là vấn đề lớn.
Với cấu hình này, bạn sẽ cung cấp quyền truy cập không dây vào các thiết bị không WiFi sẽ được hưởng lợi từ truy cập internet.
vẽ

Điều kiện tiên quyết

Đảm bảo Wi-Fi của bạn được cấu hình và hoạt động đúng. nếu có vấn đề gì đó, quyền truy cập của bạn vào thiết bị eth0sẽ bị hạn chế hoặc không có.

Thiết lập

Chúng tôi cần một vài gói để bắt đầu:

apt-get update
apt-get install network-manager isc-dhcp-server

Giao diện

chỉnh sửa tệp /etc/network/interfacesđể khớp với các mục sau, điều này sẽ đặt eth0 của bạn một địa chỉ IP sửa lỗi (10.10.10.1) và sẽ tạo lại 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

Sửa đổi dhcpcấu hình mặc định để làm cho nó có thẩm quyền và thêm mạng LAN (10.10.10. *), Chỉnh sửa tệp /etc/dhcp/dhcpd.conf, thêm nội dung sau:

# 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.1.1;
  default-lease-time 600;
  max-lease-time 7200;
}

IPTABLES

Bây giờ tạo tập lệnh sau để thiết lập và khởi động mạng trên mỗi lần khởi động lại. Tập lệnh sẽ tự động tạo một vài quy tắc 'IPTABLES'. Đặt tên cho nó /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 $3}'| sed 's/;//')

IPT=$(which iptables)
# get the wlan address
INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |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 $2 }')
echo "default route is now " $gw

Cuối cùng

Cuối cùng, bạn cần chạy tập lệnh trên mỗi lần khởi động lại, thêm hai dòng sau exit 0vào tập tin `/etc/rc.local 'để chạy tập lệnh được tạo trước đó.

# will run the bridge on startup
sudo ./root/bridge.sh

Bây giờ, chỉ cần khởi động lại thiết bị của bạn và cây cầu sẽ hoạt động cho bạn.

pd: sudođã được bỏ qua cho ngắn gọn. Sử dụng sudo -iEđể có một phiên nhưroot


Ồ Cảm ơn bạn rất nhiều vì một câu trả lời chi tiết như vậy! Tôi chưa bao giờ nhận ra nó sẽ phức tạp đến thế, nhưng tôi nghĩ tôi có thể giải quyết nó. Một lần nữa cảm ơn, tôi sẽ dùng thử sau vài giờ và nếu nó hoạt động tôi sẽ đánh dấu bạn là câu trả lời. Cảm ơn rất nhiều

@GrowlingSolid Nó không quá phức tạp. Câu trả lời bạn đã sử dụng network-managerđể quản lý các mạng không tương thích với mạng dhcpcdnày là mặc định cho Raspbian. Không có gì sai khi sử dụng trình quản lý thay thế, nhưng bạn nên vô hiệu hóa dhcpcd(câu trả lời thực hiện điều này một cách gián tiếp vì dhcpsẽ khiến dhcpcddừng lại). Nó cũng sẽ ngăn hỗ trợ WiFi trong GUI hoạt động.
Milliways

1
Tôi đã tự thông báo và đến đúng dòng này thay vì của bạn: INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' | awk -F ":" '/1/ {print $2}')Phiên bản "sai" của bạn là:INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$
Luke_R
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.