เชื่อมโยง wlan0 ถึง eth0


25

บน Arch Linux ฉันต้องการให้ eth0 (เชื่อมต่อกับเราเตอร์บริดจ์) แบ่งปันการเชื่อมต่อที่ได้รับจาก wlan0 ฉันอ่านบทช่วยสอน แต่ฉันไม่ได้สั่งการอย่างชาญฉลาดเหมือนผู้ใช้รายอื่นและไม่เข้าใจอย่างสมบูรณ์


8
โปรดอย่าใส่ '[แก้ไข]' ในคำถามหรือชื่อเรื่องการยอมรับคำตอบเป็นวิธีที่ถูกต้องในการแสดงว่าปัญหาได้รับการแก้ไขแล้ว มันเปลี่ยนวิธีการแสดงคำถามในรายชื่อหลักเช่นเดียวกับการใส่เครื่องหมายถูกสีเขียวในคำตอบที่คุณทำเครื่องหมายว่าถูกต้อง
Zypher

1
ฉันจะขอบคุณถ้าไม่มีใครยุ่งกับหน้านี้ หากคุณมีปัญหาใด ๆ โปรดติดต่อฉัน ขอขอบคุณ.
dbdii407

13
serverfault.com/faqโดยเฉพาะหัวข้อ "คนอื่นสามารถแก้ไขสิ่งของของฉัน"
Zypher

@Zypher URL ที่คุณลิงก์ไม่มีอยู่อีกต่อไป ย่อหน้าที่เกี่ยวข้องได้ย้ายไปที่อื่นหรือไม่
kasperd

คำตอบ:


24

UPDATE

มันเป็นไปไม่ได้ที่จะสร้างสะพานเชื่อมระหว่างสาย (ลูกค้า aka โหมดสถานี) และการเชื่อมต่อแบบใช้สายตามหัวข้อนี้บน linux-ath5k-devel

ตั้งค่า NAT

ควรตั้งค่า NAT แทน:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

การกำหนด IP

จากนั้นคุณต้องกำหนดที่อยู่ IP ให้กับตัวเอง:

ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up

ติดตั้ง dhcp daemon

ติดตั้งเซิร์ฟเวอร์ dhcp และเพิ่มข้อความต่อไปนี้ลงในไฟล์ปรับแต่ง (ใน /etc/dhcpd.conf หรือบางอย่างที่คล้ายกัน)

subnet 10.0.0.0 netmask 255.255.255.0 {
    range 10.0.0.100 10.0.0.120;
    option routers 10.0.0.1;
    option domain-name-servers the-ip-address-you-have-in-etc-resolv.conf;
}

เริ่ม dhcpd

จากนั้นเริ่ม / etc / init.d/dhcpd เริ่มต้น

และนั่นมัน!

โปรดอ่านด้านล่างหากคุณสนใจการตั้งค่าการเชื่อมต่อที่ไม่ทำงาน


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0

ก่อนอื่นคุณสร้างส่วนต่อประสานบริดจ์ฉันเลือกชื่อmybridge ตามอำเภอใจแล้วเพิ่มอินเทอร์เฟซ

คุณควรขอที่อยู่ IP ใหม่ (จำเป็นต้องใช้เฉพาะในกรณีที่คุณต้องการรับ IP ที่ถูกต้องสำหรับอุปกรณ์เชื่อมต่อตัวเอง):

dhclient -d mybridge

3
คุณไม่จำเป็นต้องมีที่อยู่ IP สำหรับอินเตอร์เฟสบริดจ์เพื่อให้บริดจ์ทำงานได้
Massimo

7
ไม่สามารถเพิ่ม wlan0 ไปยังบริดจ์ mybridge: ไม่รองรับการทำงาน
dbdii407

1
@ Massimo: ใช่นั่นเป็นเรื่องจริง ต้องใช้ IP ที่ถูกต้องในการเพิ่มเน็ตจาก "อุปกรณ์เชื่อมต่อ"
cstamas

10
NAT เป็นสิ่งที่แตกต่างอย่างสิ้นเชิงจากการเชื่อมโยง การเชื่อมโยงเป็นเลเยอร์สอง NAT คือเลเยอร์สามและเฉพาะ IPv4 ฉันไม่เข้าใจว่าทำไมคำตอบนี้จึงเป็นคำตอบที่ยอมรับได้
WhyNotHugo

3
@Hugo IP NAT เป็นเลเยอร์ 3 แต่ MAC NAT เป็นเลเยอร์ 2 สำหรับการเชื่อมต่อ WiFi คุณสามารถใช้ 4addr, WDS, MAC NAT หรือคุณสามารถทำอะไรที่เลเยอร์ 3 (เช่น IP NAT) แทน
David Schwartz

27

หากต้องการเชื่อมต่อสะพาน wifiคุณสามารถใช้iwเครื่องมือเพื่อเปิดใช้งาน 4addrเช่นเดียวกัน:

# iw dev <wifiInterface> set 4addr on

เช่น:

# brctl addif <bridgename> <wifiInterface>
can't add <wifiInterface> to bridge <bridgename>: Operation not supported

# iw dev <wifiInterface> set 4addr on
# brctl addif <bridgename> <wifiInterface>

ตอนนี้มันควรจะทำงาน คุณสามารถแสดงสะพานโดยใช้:

# brctl show

2
การตั้งค่านี้คืออะไรและทำไมคุณแนะนำให้ใช้ในสถานการณ์นี้โดยเฉพาะ?
hakre

นี่เป็นวิธีแก้ไขข้อผิดพลาด "ไม่อนุญาตการดำเนินการ" เมื่อพยายามเพิ่มส่วนต่อประสาน wlan0 ให้กับส่วนต่อประสานบริดจ์ หลังจากนั้นคุณจะต้องระบุส่วนต่อประสานบริดจ์ใน / etc / network / interfaces เพื่อที่จะสามารถนำขึ้นมาใช้หลังจากเริ่มทำงาน
Str82DHeaD

1
@hakre 4addrโหมดทำให้ WiFi ทำงานได้ดีพอ ๆ กับอีเธอร์เน็ตแบบใช้สายที่เชื่อมต่อได้ หากไม่มีมันการเชื่อมต่อจะไม่ทำงานหากไม่มี NAT
David Schwartz

1
4addrไม่จำเป็นต้องให้ทั้งสองด้านของการสนับสนุนการเชื่อมโยงไร้สายมัน (ทะนงคุณกำลังพยายามที่จะใช้ขยาย WiFi)
nhed

5

ขึ้นอยู่กับว่า AP หมายถึงคุณอย่างไร:

1) อาจต้องการเห็นแพ็คเก็ตที่มาจากคุณพร้อมที่อยู่เลเยอร์ลิงก์ที่รู้จักของคุณ (และไม่ใช่แพ็กเก็ตบริดจ์) 2) มันอาจฉลาดกว่าและรู้ว่า IP แอดเดรสใดควรเป็นของที่อยู่เลเยอร์ลิงก์ (สาเหตุ รู้ DHCP และตรวจสอบ)

ถ้า 1 + 2 เป็นจริงคุณต้องมี IP NAT, DHCP, ..

แต่ถ้าเป็นเพียง 1) คุณสามารถปลอมที่อยู่ลิงก์เลเยอร์และย้อนกลับแมปไปทางขวาในทิศทางอื่นตามที่อธิบายไว้ที่นี่:

https://wiki.debian.org/BridgeNetworkConnections#Bridging_with_a_wireless_NIC


นี่มันยุ่งจริงๆ และต้องมีการตั้งค่าพิเศษทุกครั้งที่คุณเพิ่มคอมพิวเตอร์ใหม่
Michael Hampton

4

4addr ดังที่อธิบายไว้ในคำตอบอื่น ๆ เป็นวิธีที่ดีที่สุดเมื่อใช้งานอะแดปเตอร์ / ไดรเวอร์ แต่ไม่สามารถทำได้ทั้งหมด NAT อาจทำงานได้ในบางสิ่ง แต่การได้รับการสื่อสารที่เหมาะสมทั้งสองวิธีบน LAN จะกลายเป็นปัญหาได้ (เช่นการเชื่อมต่อเครื่องพิมพ์หรือการเข้าถึงอุปกรณ์ IoT อื่น ๆ ที่อยู่อีกด้านหนึ่งของ NAT) สิ่งใดก็ตามที่พึ่งพาการออกอากาศ / มัลติแคสต์ (เช่นการค้นพบอัตโนมัติ, bonjour) จะล้มเหลวผ่าน NAT

ทางเลือกที่จะใช้พร็อกซี ARP (parprouted) ตามที่อธิบายในhttps://wiki.debian.org/BridgeNetworkConnectionsProxyArp ฉันได้ตั้งค่านี้ใน Raspberry Pi สำหรับเครื่องพิมพ์และทำงานเหมือนมีเสน่ห์ (ฉันได้เพิ่มการนอนหลับ 10 วินาทีในpost-upคำสั่งเพื่อให้ได้รับที่อยู่ IP ก่อนมันอาจต้องทำอย่างไรกับความช้าของเครื่องเก่า RPI ... )


ลิงก์นี้ไปยังโซลูชัน proxy-arp plus dhcp-helper เป็นวิธีแก้ปัญหาที่เข้ากันได้และสะอาดที่สุดเท่าที่ฉันเคยเห็นมา
มิงหัว

3

Bridge wlan และ 4addr:

Bridging wlan0 เป็นความเจ็บปวด ตามปกติคุณไม่สามารถเพิ่มลงในอินเตอร์เฟสบริดจ์ (brctl ส่งคืน "การดำเนินการที่ไม่อนุญาต") และการใช้ตัวกรอง "Bridged" VirtualBox ผลลัพธ์ในระเบียบขนาดใหญ่ของ ARP และ DHCP ขัดแย้งกัน สาเหตุของเรื่องนี้คือเฟรม 802.11 มีเพียงสามที่อยู่ตามค่าเริ่มต้น: ที่อยู่ MAC ของทั้งอุปกรณ์ไร้สาย (แล็ปท็อปและ AP) และผู้รับสุดท้าย (เช่นเดียวกับอีเธอร์เน็ต) สันนิษฐานว่ามีผู้สร้างที่เป็นไปได้เพียงคนเดียวเสมอ

802.11 สามารถพกพาที่อยู่ MAC ที่สี่ของผู้เริ่มต้นและใช้ในโหมด WDS โดยผู้เรียกซ้ำ คุณลักษณะนี้สามารถเปิดใช้งานบน Linux ได้เช่นกันโดยใช้ iw และการเปิดใช้งานโหมดนี้จะช่วยให้ wlan0 สามารถใช้งานได้ในส่วนต่อประสานบริดจ์รวมถึงเครือข่ายเสมือนของ VirtualBox:

iw dev wlan0 set 4addr on

อย่างไรก็ตามด้วยการเปิดใช้งาน 4addr คุณอาจถูกละเว้นโดย AP: การเชื่อมโยงสำเร็จ แต่เฟรมข้อมูลทั้งหมดหายไปในอีเธอร์ นี่อาจเป็นเพราะเหตุผลด้านความปลอดภัย (เพราะมันยากที่จะหลอกที่อยู่ MAC ของแหล่งที่มาใช่) ในเราเตอร์ของฉัน (ใช้ OpenRG) จำเป็นต้องเปิดใช้งานโหมด "WDS" สำหรับอินเตอร์เฟส AP แบบไร้สายเพิ่มอุปกรณ์ WDS ที่ จำกัด ของฉัน ที่อยู่ MAC ของแล็ปท็อปและเพิ่มไปยังบริดจ์ LAN แพ็คเก็ต 4addr ตอนนี้ทำงาน

ยังมีปัญหาอื่นอีกด้วย - เราเตอร์ปฏิเสธแพ็กเก็ตสามแอดเดรสจากแล็ปท็อปซึ่งอาจไม่สะดวก (ต้องสลับ 4addr ทุกครั้งที่มีการเปลี่ยนเครือข่าย WLAN) วิธีแก้ปัญหาคือการเพิ่มอินเทอร์เฟซไร้สายตัวที่สองที่เชื่อมโยงกับอุปกรณ์เดียวกัน แต่ด้วยที่อยู่ MAC ที่แตกต่างกัน ก่อนเลิกทำการตั้งค่าก่อนหน้านี้:

iw dev wlan0 set 4addr off

จากนั้นเพิ่มอินเทอร์เฟซที่สอง - ชื่อถูกเลือกโดยพล - ด้วยที่อยู่ MAC อื่น:

iw dev wlan0 interface add wds.wlan0 type managed 4addr on
ip link set dev wds.wlan0 addr <addr>
ip link set dev wds.wlan0 up

ที่นี่จะต้องตรงกับที่อยู่อุปกรณ์ WDS ที่กำหนดค่าในเราเตอร์ นอกจากนั้นมันอาจเป็นที่อยู่ MAC ใด ๆ ที่ถูกต้อง MAC ดั้งเดิมของ wlan0 จะยังคงใช้งานได้ตามปกติ

เป็นไปได้ที่จะใช้ทั้ง wlan0 และ wds.wlan0 ในเวลาเดียวกัน - แม้ว่าฉันจะทดสอบการเชื่อมโยงกับ AP เดียวกันสองครั้งเท่านั้นไม่ใช่กับ AP ที่แตกต่างกัน ฉันเดาว่าพวกเขาจะต้องอยู่ในช่องเดียวกันอย่างน้อย

บางคนถามว่าทำไมใช้สิ่งนี้เมื่อ VirtualBox สามารถเชื่อมต่อ WiFi "ใช้ได้" คำตอบก็คือว่า VirtualBox จะไม่ส่งที่อยู่ MAC ของเครื่องเสมือน ค่อนข้างจะทำ NAT ที่เลเยอร์ MAC ด้วย - 2014-08-22

สะพาน wlan โดยตรง

ในบางกรณีคุณสามารถใช้ wlan_kabel ได้ มันใช้ซ็อกเก็ตแพ็คเก็ตเพื่อเชื่อมสะพาน wlan * -devices โดยตรงกับอุปกรณ์อีเธอร์เน็ต อย่างไรก็ตามคุณสามารถเชื่อมต่อ MAC ได้ครั้งละหนึ่งเครื่องด้วย wlan_kabel มันไม่มีข้อด้อยของการถูกห้ามโดยจุดเชื่อมต่อเนื่องจากมีการใช้เฉพาะ MAC ดั้งเดิมของอุปกรณ์ wlan ในกรณีของคุณนี่หมายความว่า wlan0 นั้นสามารถใช้งานได้โดย VM เพียงเครื่องเดียวเท่านั้นและไม่สามารถใช้กับโฮสต์ได้ คุณจะได้รับwlan_kabel ที่นี่ สิ่งนี้คล้ายกับโซลูชันmacvlans

การเชื่อมต่อกับ ipvlan

IP Vlan ไม่มีข้อ จำกัด ของบริดจ์ที่สามารถใช้เพื่อเชื่อมโยงรายละเอียดเครือข่ายว่าจะใช้งานได้อย่างไรที่นี่

ทางเลือก Masquerade

การกำหนดเส้นทาง Linux สามารถใช้แทน iptables-masquerade และ ip_forward เพื่อให้ได้บริดจ์ แต่ตามที่กล่าวมานี้ต้องเปิดใช้ ip_forward และจะทำให้ linux ทำหน้าที่เหมือนเราเตอร์ที่ต้องติดตั้งอย่างระมัดระวังเพราะอาจทำให้เกิดข้อกังวลด้านความปลอดภัย

# bridge setup
brctl addbr br0
ifconfig br0 10.10.20.1/24 up

# enable ipv4 forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward

# netfilter cleanup
iptables --flush
iptables -t nat -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# netfilter network address translation
iptables -t nat -A POSTROUTING -o wlan0 -s 10.10.20.0/24  -j MASQUERADE

อินเตอร์เฟส br0 จะสามารถเข้าถึงเครือข่าย wlan0

สำคัญและเกี่ยวข้อง

นอกจากนี้และที่สำคัญมากคุณไม่ควรใช้คำสั่งล้าสมัยและเลิกใช้แล้วเช่นifconfig, brctlและอื่น ๆ ชุด iproute2 มีคำสั่งทั้งหมดนี้รวมถึงการตั้งค่าอินเทอร์เฟซเสมือน (สิ่งที่เราเคยต้องใช้ openvpn) และการสร้างสะพาน หากคุณไม่ทราบวิธีตั้งค่าบริดจ์ด้วย ip เราไปเลย

  ip tuntap add tap0 mode tap user root 
  ip link set tap0 up
  ip link add br0 type bridge
  ip link set tap0 master br0
  ip link set eth0 master br0
  ip addr add 10.173.10.1/24  dev br0
  ip link set br0 up

ด้วยชุดคำสั่งนี้เราสร้างอินเตอร์เฟสเสมือนที่เรียกว่า tap0 จากนั้นบริดจ์ที่เรียกว่า br0 จากนั้นกด eth0 และ tap0 ให้กับบริดจ์ซึ่งเรากำหนดที่อยู่ IP เป็น 10.173.10.1 จากนั้นนำมารวมทั้งหมด ต้องการอินสแตนซ์ที่แยกจากกันสามอินเทอร์เฟซ (สำหรับ tap0, eth0 และ br0)

เคล็ดลับในการทำงานนี้คือการใช้ proxy.arp ซึ่งอนุญาตให้พีซีของคุณ (ไม่ใช่เนมสเปซ VM / Linux container / network names) ของคุณเพื่อตอบแบบสอบถาม ARP แทน

กล่าวอีกนัยหนึ่งโดยการใช้การส่งต่อ IPv4 ระหว่างส่วนต่อประสานฮาร์ดแวร์และส่วนต่อประสานเสมือนของคุณคุณคิดว่าคุณสามารถเชื่อมต่อ VM / LXC / NNS ของคุณเข้ากับ LAN ของคุณราวกับว่าเป็นส่วนต่อประสานทางกายภาพ แต่ไม่เป็นความจริง การรับส่งข้อมูล ARP พื้นฐานซึ่งเป็นสิ่งที่ช่วยให้ LAN สามารถทำงานได้อย่างแท้จริง ดังนั้นปัญหาคือถ้าฉันส่งต่อการรับส่งข้อมูล IPv4 อย่างถูกต้องฉันจะส่งต่อการรับส่งข้อมูล ARP ได้อย่างไรเพื่อให้ VM / LXC / NNS ของฉันทำงานอย่างไร เคล็ดลับคือการใช้ proxy-arp

คำตอบทั้งหมดนั้นอยู่ในบล็อกของ Bohdi Zazenพร้อมชื่อเรื่องที่เปิดเผย: การ์ดไร้สายแบบบริดจ์ เขาใช้แพคเกจล้าสมัย uml-Utilities เพื่อสร้างอินเตอร์เฟสเสมือนโดยใช้คำสั่ง tunctl: นี่เป็นคำสั่งเดียวที่เขาใช้ uml-Utilities เพื่อให้คุณสามารถละเลยการดาวน์โหลดแพคเกจได้อย่างปลอดภัยและใช้คำสั่ง I เขียนไว้ด้านบนเพื่อสร้างการแตะหรือการปรับอินเตอร์เฟสใดก็ตามที่คุณต้องการเพียงแค่ปรับเปลี่ยนคำสั่งตามนั้น จากนั้นสร้างคู่หูสัตวแพทย์สำหรับ LXC ของคุณและตอนนี้สร้างสะพานเชื่อมระหว่าง tap0 และ veth0 บริดจ์นี้เรียกว่า br0 คือสิ่งที่คุณต้องใช้ proxy-arp แทนอินเตอร์เฟส tap0 ที่อธิบายโดย Bohdi Zazen


แหล่งที่มา: askubuntu.com , nullroute.eu.org , firejail.wordpress.com , superuser.com


0

ฉันชอบวิธีProxy Arpแต่คำถามเดิมระบุ Arch Linux นี่คือรุ่น Arch Linux ของการดำเนินงานที่ Raspbian ฉันพยายามอย่างหนักเพื่อปรับวิธีดั้งเดิมจาก Debian Wiki ที่กล่าวถึงที่นี่เพื่อnetctlโดยใช้ExecUpPostและExecDownPreไม่ประสบความสำเร็จ ทุกอย่างทำงานที่บรรทัดคำสั่ง แต่ไม่อยู่ในโปรไฟล์

ขั้นตอน:

  1. ใช้เครือข่ายไร้สายที่มีsystemd-networkd ภายในแฟ้ม .network IPForward=yesชุด ฉันใช้WPA Supplicantเพื่อจัดการอินเทอร์เฟซเครือข่ายไร้สาย
  2. เปิดใช้งานการถ่ายทอด mDNS โดยการตั้งค่าenable-reflector=yesภายใน/etc/avahi/avahi-daemon.conf; เริ่มและเปิดใช้งานavahi-daemon.serviceหากยังไม่ได้ดำเนินการ
  3. ติดตั้งparproutedจาก AUR และสร้างแฟ้มบริการสำหรับมันโดยการปรับตัวหนึ่งจากคำตอบ Raspbian ฉันไม่พบว่าจำเป็นต้องตั้งค่าอินเทอร์เฟซให้สำส่อน โดยปกติบริการนี้จะต้องเริ่มต้นและเปิดใช้งาน
[Unit]
Description=proxy arp routing service
Documentation=https://raspberrypi.stackexchange.com/q/88954/79866

[Service]
Type=forking
# Restart until wlan0 gained carrier
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
ExecStartPre=/lib/systemd/systemd-networkd-wait-online --interface=wlan0 --timeout=6 --quiet
ExecStartPre=/usr/bin/echo 'systemd-networkd-wait-online: wlan0 is online'
# clone the dhcp-allocated IP to eth0 so dhcrelay will relay for the correct subnet
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip addr add $(/usr/bin/ip -4 -br addr show wlan0 | /usr/bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'
ExecStartPre=/usr/bin/ip link set dev eth0 up

#         v minus sign
ExecStart=-/usr/bin/parprouted eth0 wlan0

ExecStopPost=/usr/bin/ip link set dev eth0 down
ExecStopPost=/usr/bin/bash -c '/usr/bin/ip addr del $(/usr/bin/ip -4 -br addr show eth0 | /usr/bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'

[Install]
WantedBy=wpa_supplicant@wlan0.service
  1. หากต้องการสนับสนุน DHCP สำหรับอุปกรณ์ที่เชื่อมต่อกับพอร์ตอีเธอร์เน็ตให้สร้างบริการ dhcrelay (จากแพ็คเกจ DHCP) การค้นหาที่อยู่ของเซิร์ฟเวอร์ DHCP โดยการ grep'ing ผ่านบันทึกดูเหมือนไม่เหมาะสม แต่ใช้งานได้ เริ่มและเปิดใช้งาน
[Unit]
Description=DHCRelay Service
After=network-online.target parprouted_bridge.service
Type=simple

[Service]
ExecStart=/usr/bin/bash -c '/usr/bin/dhcrelay -d -4 -iu wlan0 -id eth0 $(/usr/bin/journalctl -b -u systemd-networkd.service | /usr/bin/grep -Po "via\s+\K\\d+\\.\\d+\\.\\d+\\.\\d+")'

[Install]
WantedBy=multi-user.target

วิธีนี้ใช้ได้กับฉันใน Raspberry Pi รุ่น B + w / ArchLinuxArm ที่มีอแด็ปเตอร์ USB WiFi พร้อมชิปเซ็ต RT5370 ในฐานะที่เป็นพี่จะให้อินเตอร์เน็ตไร้สายไปยังเครื่องพิมพ์ที่มีเพียงอีเธอร์เน็ตที่ฉันต้องการมันจะมีประสิทธิภาพในการจัดการหยาบดังนั้นขั้นตอนต่อไปของฉันจะได้รับการกำหนดค่าการ์ด SD เป็นอ่านแล้วเท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.