이더넷 포트를 통해 Pi의 WiFi 연결 공유


28

최신 라즈 비안 릴리스를 실행하는 파이가 있으며 무선 USB 동글을 사용하여 인터넷에 연결되어 있습니다. 내가하고 싶은 것은 LAN 케이블을 사용하여 pi에 연결된 모든 컴퓨터가 인터넷을 수신 할 수 있도록 pi의 wifi 연결을 공유하는 것입니다. 인터넷을 둘러 보았지만 관련성이없는 것 같습니다. Windows 및 Mac OS X 에서이 프로세스에 익숙하지만 pi 에서이 작업을 수행하면 막 혔습니다.

편집 : 이것이 누구에게 도움이되는지 모르겠지만 wlan0을 통해 내 pi의 인터넷에 연결되어 있지만 eth0을 통해 해당 인터넷 연결을 공유하고 싶습니다.


Pi의 WiFi 및 이더넷 연결을 브리징하고 라우터에 연결하는 것이 더 간단합니다. 응용 프로그램에 가능합니까?
tlhIngan

@tlhIngan 불행히도, 이더넷 소켓에 액세스 할 수 없으며 이더넷으로 수행 해야하는 PXE에서 랩톱을 부팅해야합니다. 또한 Linux에 대해 더 배우고 싶습니다.이 프로젝트를 빌드하면 Linux에 대한 자신감이 더 커질 것이라고 생각했습니다. 내 라우터가 집안 곳곳에 있기 때문에 이것이 더 쉬운 해결책이라고 생각했습니다.

이 튜토리얼 비디오는 정확히 당신이 필요로하는 것을 발견했습니다 : youtu.be/IAa4tI4JrgI Raspberry PI는 Wi-Fi에서 이더넷 포트로 가져 오는 인터넷을 공유합니다.
Mia19

@tlhIngan-정교하게 할 수 있습니까? 브리지를 만들려면 라우터가 필요합니까? 네트워크 오디오 수신기가 이더넷을 통해 Pis WiFi를 공유하고 기본 라우터와 동일한 서브넷 및 DHCP에 있어야합니다.
square_eyes

답변:


40

대한 Raspbian 제시

에서 이 문서 :

dnsmasqDHCP와 DNS 서버가 결합되어 있고 구성하기 쉬우므로이 용도로 패키지를 사용 합니다.

좀 더 '무거운'것을 원한다면 DHCP와 DNS에 각각 isc-dhcp-serverbind9패키지를 사용할 수 있지만, 우리의 목적 상 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

다음을 새 파일에 붙여 넣기

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 

/etc/sysctl.conf패킷 전달을 사용 하도록 파일을 편집하십시오.

sudo nano /etc/sysctl.conf

다음에 재부트 할 때 패킷 전달을 사용 가능하게 #하는 행의 시작 부분에서를 제거하십시오 net.ipv4.ip_forward=1. 그러나 재부팅하지 않고 지금 시도하려면이 작업을 수행하십시오.

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

또한 Wi-Fi를 통해 연결된 장치와 RPi의 인터넷 연결을 공유해야합니다. eth0와 사이에 NAT를 구성합니다 wlan0.

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  

그러나 Pi를 재부팅 할 때마다이 규칙을 적용해야하므로 sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" 규칙을 파일에 저장하십시오 /etc/iptables.ipv4.nat. 이제 다시 부팅 할 때마다이 작업을 실행해야합니다. 따라서 줄 바로 위와 /etc/rc.local파일을 열고 다음 줄을 추가하십시오.sudo nano /etc/rc.localexit 0

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

그리고 그게 다야! 이제 RPi를 재부팅하면 인터넷에 액세스 할 수 있습니다

sudo reboot

Raspbian Stretch를 위해 업데이트되었습니다

최신 버전의 Raspbian에서는 위 구성이 작동하지 않습니다. 그래서 나는 고통을 덜게하는 스크립트를 만들었습니다.

안내서를 사용하여 WiFi 네트워크에 연결하십시오 .

여기 에서 스크립트를 다운로드 하십시오 . 에 배치/home/pi/

/home/pi/.config/lxsession/LXDE-pi/autostart파일 열기

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

마지막 줄을 추가하십시오 :

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

파일의 전체 경로를 제공했는지 확인하십시오. 그리고 당신은 끝났습니다. 이제 재부팅하여 변경 사항을 확인하십시오.

sudo reboot

1
대단히 감사합니다. 방금 파이에서 이것을 테스트했으며 연결이 양호했습니다! 시간 내 주셔서 다시 한 번 감사드립니다. 감사합니다.

1
무선 장치와 인터넷 연결을 공유하기에 좋습니다. 그러나 네트워크의 다른 랩톱에서 장치에 액세스하려고하지만 작동하지 않습니다. 서로 다른 서브넷에 있기 때문일까요? 그 주위를 돌아볼 팁이 있습니까?
Björn Andersson

1
Raspbian Stretch에서는 WiFi 구성을 / etc / network / interfaces에 수동으로 포함시켜야했지만 완벽하게 작동했습니다.
xfx

1
@xfx, WiFi 설정에 추가 한 코드를 보여 주시겠습니까?
karl71

1
나는 당신의 게시물과 링크를 신중하게 따랐습니다. "정적"이라는 단어를 추가 할 때마다 Wi-Fi는 (새로운 OS 설치 만
했음)

6

사용자의 목적이 LAN 장치에 인터넷 액세스를 제공하므로 이중 'NAT'는 큰 문제가되지 않습니다.
이 구성을 사용하면 비 인터넷 장치에 무선으로 액세스하여 인터넷에 액세스 할 수 있습니다.
그림

전제 조건

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.1.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 $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

마지막으로

마지막으로, 재부팅 할 때마다 스크립트를 실행하고, exit 0`/etc/rc.local '파일 에서 다음 두 줄을 추가하여 이전 에 생성 된 스크립트를 실행하십시오.

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

이제 장치를 다시 시작하면 브리지가 작동합니다.

sudo간결성을 위해 pd : 는 생략되었다. sudo -iE세션을 다음과 같이하는 데 사용root


와우! 자세한 답변을 주셔서 대단히 감사합니다! 나는 그것이 그렇게 복잡하다는 것을 결코 깨닫지 못했지만, 나는 그것을 해결할 수 있다고 생각합니다. 다시 한 번 감사드립니다. 몇 시간 후에 시도해보고 작동하면 답변으로 표시하겠습니다. 정말 고마워

@GrowlingSolid 그렇게 복잡해서는 안됩니다. 대답은 Raspbian의 기본값 인와 network-manager호환되지 않는 네트워크를 관리하는 데 사용 합니다 dhcpcd. 대체 관리자를 사용하는 데 아무런 문제가 없지만 비활성화해야합니다 dhcpcd( 정지로 dhcp인해 답변이 간접적으로 수행 됩니다 dhcpcd). 또한 GUI의 WiFi 지원이 작동하지 않습니다.
Milliways 2016 년

1
나는 나 자신을 통보하고 대신 당신이 올바른 라인에 온 적이 : 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.