บน Arch Linux ฉันต้องการให้ eth0 (เชื่อมต่อกับเราเตอร์บริดจ์) แบ่งปันการเชื่อมต่อที่ได้รับจาก wlan0 ฉันอ่านบทช่วยสอน แต่ฉันไม่ได้สั่งการอย่างชาญฉลาดเหมือนผู้ใช้รายอื่นและไม่เข้าใจอย่างสมบูรณ์
บน Arch Linux ฉันต้องการให้ eth0 (เชื่อมต่อกับเราเตอร์บริดจ์) แบ่งปันการเชื่อมต่อที่ได้รับจาก wlan0 ฉันอ่านบทช่วยสอน แต่ฉันไม่ได้สั่งการอย่างชาญฉลาดเหมือนผู้ใช้รายอื่นและไม่เข้าใจอย่างสมบูรณ์
คำตอบ:
UPDATE
มันเป็นไปไม่ได้ที่จะสร้างสะพานเชื่อมระหว่างสาย (ลูกค้า aka โหมดสถานี) และการเชื่อมต่อแบบใช้สายตามหัวข้อนี้บน linux-ath5k-devel
ควรตั้งค่า NAT แทน:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
จากนั้นคุณต้องกำหนดที่อยู่ IP ให้กับตัวเอง:
ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up
ติดตั้งเซิร์ฟเวอร์ 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;
}
จากนั้นเริ่ม / etc / init.d/dhcpd เริ่มต้น
และนั่นมัน!
brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0
ก่อนอื่นคุณสร้างส่วนต่อประสานบริดจ์ฉันเลือกชื่อmybridge ตามอำเภอใจแล้วเพิ่มอินเทอร์เฟซ
คุณควรขอที่อยู่ IP ใหม่ (จำเป็นต้องใช้เฉพาะในกรณีที่คุณต้องการรับ IP ที่ถูกต้องสำหรับอุปกรณ์เชื่อมต่อตัวเอง):
dhclient -d mybridge
หากต้องการเชื่อมต่อสะพาน 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
4addr
โหมดทำให้ WiFi ทำงานได้ดีพอ ๆ กับอีเธอร์เน็ตแบบใช้สายที่เชื่อมต่อได้ หากไม่มีมันการเชื่อมต่อจะไม่ทำงานหากไม่มี NAT
4addr
ไม่จำเป็นต้องให้ทั้งสองด้านของการสนับสนุนการเชื่อมโยงไร้สายมัน (ทะนงคุณกำลังพยายามที่จะใช้ขยาย WiFi)
ขึ้นอยู่กับว่า AP หมายถึงคุณอย่างไร:
1) อาจต้องการเห็นแพ็คเก็ตที่มาจากคุณพร้อมที่อยู่เลเยอร์ลิงก์ที่รู้จักของคุณ (และไม่ใช่แพ็กเก็ตบริดจ์) 2) มันอาจฉลาดกว่าและรู้ว่า IP แอดเดรสใดควรเป็นของที่อยู่เลเยอร์ลิงก์ (สาเหตุ รู้ DHCP และตรวจสอบ)
ถ้า 1 + 2 เป็นจริงคุณต้องมี IP NAT, DHCP, ..
แต่ถ้าเป็นเพียง 1) คุณสามารถปลอมที่อยู่ลิงก์เลเยอร์และย้อนกลับแมปไปทางขวาในทิศทางอื่นตามที่อธิบายไว้ที่นี่:
https://wiki.debian.org/BridgeNetworkConnections#Bridging_with_a_wireless_NIC
4addr ดังที่อธิบายไว้ในคำตอบอื่น ๆ เป็นวิธีที่ดีที่สุดเมื่อใช้งานอะแดปเตอร์ / ไดรเวอร์ แต่ไม่สามารถทำได้ทั้งหมด NAT อาจทำงานได้ในบางสิ่ง แต่การได้รับการสื่อสารที่เหมาะสมทั้งสองวิธีบน LAN จะกลายเป็นปัญหาได้ (เช่นการเชื่อมต่อเครื่องพิมพ์หรือการเข้าถึงอุปกรณ์ IoT อื่น ๆ ที่อยู่อีกด้านหนึ่งของ NAT) สิ่งใดก็ตามที่พึ่งพาการออกอากาศ / มัลติแคสต์ (เช่นการค้นพบอัตโนมัติ, bonjour) จะล้มเหลวผ่าน NAT
ทางเลือกที่จะใช้พร็อกซี ARP (parprouted) ตามที่อธิบายในhttps://wiki.debian.org/BridgeNetworkConnectionsProxyArp ฉันได้ตั้งค่านี้ใน Raspberry Pi สำหรับเครื่องพิมพ์และทำงานเหมือนมีเสน่ห์ (ฉันได้เพิ่มการนอนหลับ 10 วินาทีในpost-up
คำสั่งเพื่อให้ได้รับที่อยู่ IP ก่อนมันอาจต้องทำอย่างไรกับความช้าของเครื่องเก่า RPI ... )
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
ฉันชอบวิธีProxy Arpแต่คำถามเดิมระบุ Arch Linux นี่คือรุ่น Arch Linux ของการดำเนินงานที่ Raspbian ฉันพยายามอย่างหนักเพื่อปรับวิธีดั้งเดิมจาก Debian Wiki ที่กล่าวถึงที่นี่เพื่อnetctlโดยใช้ExecUpPost
และExecDownPre
ไม่ประสบความสำเร็จ ทุกอย่างทำงานที่บรรทัดคำสั่ง แต่ไม่อยู่ในโปรไฟล์
ขั้นตอน:
IPForward=yes
ชุด ฉันใช้WPA Supplicantเพื่อจัดการอินเทอร์เฟซเครือข่ายไร้สายenable-reflector=yes
ภายใน/etc/avahi/avahi-daemon.conf
; เริ่มและเปิดใช้งานavahi-daemon.service
หากยังไม่ได้ดำเนินการ[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
[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 เป็นอ่านแล้วเท่านั้น