Menjembatani wlan0 ke eth0

25

Di Arch Linux, saya ingin memiliki eth0 (terhubung ke router bridged) berbagi koneksi yang diterima dari wlan0, saya sudah membaca tutorial tapi saya tidak mengerti perintah seperti pengguna lain dan tidak sepenuhnya mengerti.

dbdii407
sumber
8
tolong jangan masukkan '[diselesaikan]' dalam pertanyaan atau judul, menerima jawaban adalah cara yang benar untuk menunjukkan bahwa masalah telah diselesaikan. Ini mengubah cara pertanyaan ditampilkan pada daftar utama serta menempatkan tanda centang hijau pada jawaban yang telah Anda tandai sebagai benar.
Zypher
1
Saya akan sangat menghargai jika tidak ada yang mengacaukan halaman ini. Jika Anda memiliki masalah, hubungi saya. Terima kasih.
dbdii407
13
serverfault.com/faq Khususnya tajuk "Orang lain dapat mengedit barang-barang saya"
Zypher
@Zypher URL yang Anda tautkan tidak ada lagi. Apakah paragraf yang relevan dipindahkan ke tempat lain?
kasperd
4
@kasperd serverfault.com/help/editing
Zypher

Jawaban:

24

MEMPERBARUI

Tidak mungkin untuk menjembatani antara nirkabel (klien alias stasiun mode) dan antarmuka kabel sesuai dengan utas ini di linux-ath5k-devel .

Setup NAT

Orang harus mengatur NAT sebagai gantinya:

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

Menetapkan IP

Maka Anda harus menetapkan alamat IP untuk diri sendiri:

ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up

Instal daemon dhcp

Instal server dhcp dan tambahkan teks berikut ke file config-nya (di /etc/dhcpd.conf atau yang serupa)

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;
}

Mulai dhcpd

Kemudian mulai /etc/init.d/dhcpd mulai

Dan itu dia!

Baca hanya di bawah ini jika Anda tertarik dengan pengaturan bridging yang tidak berfungsi


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0

Pertama-tama Anda membuat antarmuka jembatan. Saya memilih nama mybridge yang sewenang-wenang, lalu menambahkan antarmuka ke dalamnya.

Anda harus meminta alamat ip baru (Ini diperlukan hanya jika Anda ingin mendapatkan IP yang valid untuk perangkat bridging itu sendiri):

dhclient -d mybridge
cstamas
sumber
3
Anda sebenarnya tidak memerlukan alamat IP untuk antarmuka jembatan agar bridging berfungsi.
Massimo
7
tidak dapat menambahkan wlan0 ke jembatan mybridge: Operasi tidak didukung
dbdii407
1
@ Massimo: ya itu benar. IP yang valid diperlukan untuk mengakses bersih dari "perangkat penghubung".
cstamas
10
NAT adalah sesuatu yang sama sekali berbeda dari menjembatani. Menjembatani adalah lapisan dua, NAT adalah lapisan tiga, dan khusus IPv4. Saya tidak mengerti mengapa ini adalah jawaban yang diterima.
WhyNotHugo
3
@Hugo IP NAT adalah layer 3, tetapi MAC NAT adalah layer 2. Untuk penghubungan WiFi, Anda dapat menggunakan 4addr, WDS, MAC NAT atau Anda dapat melakukan sesuatu pada layer 3 (seperti IP NAT) sebagai gantinya.
David Schwartz
27

Untuk menjembatani antarmuka wifi Anda dapat menggunakan iwalat untuk mengaktifkan 4addr juga:

# iw dev <wifiInterface> set 4addr on

yaitu:

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

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

Sekarang ini seharusnya bekerja. Anda dapat menunjukkan jembatan menggunakan:

# brctl show
marah
sumber
2
Untuk apa pengaturan ini dan mengapa Anda secara khusus menyarankan untuk menggunakannya dalam skenario ini?
hakre
Ini adalah solusi untuk kesalahan "Operasi tidak diizinkan" ketika mencoba menambahkan antarmuka wlan0 ke antarmuka jembatan. Setelah itu Anda harus menentukan antarmuka jembatan di / etc / network / interfaces untuk ditampilkan setelah startup.
Str82DHeaD
1
@ hakre 4addrMode ini membuat WiFi berperilaku cukup seperti Ethernet berkabel sehingga bridging akan berfungsi. Tanpa itu, menjembatani tidak akan bekerja tanpa NAT.
David Schwartz
1
4addrmemang mengharuskan kedua sisi tautan nirkabel mendukungnya (dengan anggapan Anda mencoba menerapkan wifi extender)
nhed
5

Tergantung pada seberapa berarti AP bagi Anda:

1) Mungkin hanya ingin melihat paket yang berasal dari Anda, dengan alamat lapisan tautan Anda yang diketahui (dan karenanya bukan dari paket yang dijembatani) 2) Itu mungkin sebenarnya lebih pintar, dan tahu alamat IP mana yang seharusnya menjadi milik alamat lapisan tautan mana (sebab ia tahu DHCP dan memeriksanya)

Jika 1 + 2 keduanya benar, Anda memang perlu sesuatu seperti IP NAT, DHCP, ..

Tetapi jika hanya 1) yang menjadi masalah, Anda bisa memalsukan alamat layer-link, dan membalikkan peta ke yang benar di arah lain seperti yang dijelaskan di sini:

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

Arnout
sumber
Ini benar-benar berantakan. Dan itu membutuhkan pengaturan tambahan setiap kali Anda menambahkan komputer baru.
Michael Hampton
4

4add seperti yang dijelaskan dalam jawaban lain tentu saja merupakan cara terbaik ketika didukung oleh adaptor / driver, tetapi tidak semuanya melakukannya. NAT mungkin bekerja untuk beberapa hal, tetapi mendapatkan komunikasi yang tepat kedua cara pada lan akan menjadi masalah (mis. Menghubungkan printer atau mengakses perangkat IoT lain di sisi lain NAT). Apa pun yang mengandalkan siaran / multicast (mis. Penemuan otomatis, bonjour) akan gagal melalui NAT.

Alternatifnya menggunakan Proxy ARP (parprouted) seperti yang dijelaskan dalam https://wiki.debian.org/BridgeNetworkConnectionsProxyArp . Saya telah mengatur ini pada Raspberry Pi untuk printer dan itu bekerja seperti pesona (saya telah menambahkan 10 detik tidur dalam post-upperintah untuk membiarkannya mendapatkan alamat IP terlebih dahulu, mungkin ada hubungannya dengan lambatnya tua saya RPi ...)

Thomas Guyot-Sionnest
sumber
tautan ini ke solusi proxy-arp plus dhcp-helper adalah solusi yang paling kompatibel dan terbersih sejauh ini yang pernah saya lihat.
minghua
3

Bridge wlan dan 4addr:

Menjembatani wlan0 adalah rasa sakit. Anda biasanya tidak dapat menambahkannya ke antarmuka jembatan (brctl mengembalikan "Operasi tidak diizinkan"), dan menggunakan filter VirtualBox "dijembatani" menghasilkan kekacauan besar konflik ARP dan DHCP. Penyebabnya adalah bahwa frame 802.11 hanya berisi tiga alamat secara default: alamat MAC dari kedua perangkat nirkabel (laptop dan AP) dan penerima akhir (seperti dalam Ethernet). Selalu diasumsikan bahwa hanya ada satu kemungkinan penggagas.

802.11 dapat membawa yang keempat, alamat MAC pencetusnya, dan ini digunakan dalam mode WDS oleh repeater. Fitur ini juga dapat diaktifkan di Linux, menggunakan iw, dan mengaktifkan mode ini akan memungkinkan wlan0 untuk digunakan dalam antarmuka jembatan, serta dengan jaringan penghubung VirtualBox:

iw dev wlan0 set 4addr on

Namun, dengan 4addr diaktifkan, Anda kemungkinan besar akan sepenuhnya diabaikan oleh AP: asosiasi berhasil tetapi semua frame data menghilang ke eter. Ini bisa karena alasan keamanan (karena sangat sulit untuk menipu alamat MAC sumber. Ya.) Di router saya (menjalankan OpenRG), perlu untuk mengaktifkan mode "WDS" untuk antarmuka AP nirkabel, tambahkan perangkat WDS yang terbatas pada perangkat saya. alamat MAC laptop, dan tambahkan ke jembatan LAN. Paket 4addr sekarang berfungsi.

Namun, ada masalah lain dengan ini - router sekarang menolak paket tiga-alamat dari laptop, yang mungkin agak merepotkan (harus beralih 4addr setiap kali jaringan WLAN diubah). Solusinya adalah menambahkan, pada laptop, antarmuka nirkabel kedua yang terhubung ke perangkat yang sama, tetapi dengan alamat MAC yang berbeda. Pertama-tama batalkan konfigurasi sebelumnya:

iw dev wlan0 set 4addr off

Kemudian, tambahkan antarmuka kedua - nama itu dipilih secara sewenang-wenang - dengan alamat MAC yang berbeda:

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

Di sini harus cocok dengan alamat perangkat WDS yang dikonfigurasi di router; selain itu, itu bisa berupa alamat MAC yang valid. MAC asli dari wlan0 kemudian tetap untuk penggunaan "normal".

Dimungkinkan untuk menggunakan wlan0 dan wds.wlan0 pada saat yang sama - walaupun saya baru saja menguji asosiasi dengan AP yang sama dua kali, bukan pada AP yang berbeda. Saya kira mereka harus setidaknya berada di saluran yang sama.

Beberapa orang bertanya mengapa menggunakan ini ketika VirtualBox dapat menjembatani WiFi "baik-baik saja". Jawabannya adalah bahwa VirtualBox tidak mengirim alamat MAC mesin virtual; melainkan, ia melakukan NAT pada lapisan MAC juga. - 2014-08-22

Jembatan wlan langsung

Dalam keadaan tertentu, Anda juga bisa menggunakan wlan_kabel. Menggunakan soket paket untuk langsung menjembatani wlan * -perangkat dengan perangkat ethernet. Namun, Anda hanya dapat menjembatani satu MAC pada satu waktu dengan wlan_kabel. Itu tidak memiliki kelemahan dilarang oleh titik akses, karena hanya MAC asli dari perangkat wlan yang digunakan. Dalam kasus Anda ini berarti, bahwa wlan0 hanya dapat digunakan oleh satu VM dan bahkan oleh tuan rumah. Anda bisa mendapatkan wlan_kabel di sini . Ini mirip dengan solusi macvlan .

Menjembatani dengan ipvlan

IP Vlan tidak memiliki batasan jembatan yang dapat digunakan untuk menjembatani rincian jaringan tentang cara menggunakannya dapat ditemukan di sini

Masquerade alternatif

Perutean Linux dapat digunakan sebagai gantinya dengan iptables-masquerade dan ip_forward untuk mencapai jembatan, tetapi seperti yang disebutkan ini perlu mengaktifkan ip_forward dan akan membuat linux bertindak seperti router, ini perlu diatur dengan hati-hati karena dapat menimbulkan masalah keamanan.

# 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

Antarmuka br0 kemudian akan memiliki akses ke jaringan wlan0

Penting dan terkait

Juga, dan sangat penting, Anda tidak boleh menggunakan perintah usang, usang seperti ifconfig, brctl , dan sebagainya. Iproute2 suite berisi perintah untuk semua ini, termasuk mengatur antarmuka virtual (sesuatu yang dulu harus kita gunakan openvpn) dan membuat jembatan. Jika Anda tidak tahu cara mengatur jembatan dengan ip, ini dia

  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

Dengan serangkaian perintah ini, kami membuat antarmuka virtual yang disebut tap0, lalu jembatan yang disebut br0, lalu memperbudak eth0 dan tap0 ke jembatan, yang kami tetapkan alamat IP 10.173.10.1, lalu bawa semuanya. Tiga contoh terpisah untuk menaikkan antarmuka (untuk tap0, eth0, dan br0) diperlukan.

Trik untuk membuat pekerjaan ini adalah dengan menggunakan proxy.arp, yang memungkinkan pc Anda (bukan VM / Linux container / namespace jaringan Anda) untuk menjawab pertanyaan ARP sebagai gantinya.

Dengan kata lain, dengan menggunakan penerusan IPv4 antara antarmuka perangkat keras dan antarmuka virtual Anda, Anda pikir Anda dapat menghubungkan VM / LXC / NNS Anda ke LAN seolah-olah itu adalah antarmuka fisik, tetapi ini tidak benar: Anda lupa sepenuhnya lalu lintas ARP mendasar, yang sebenarnya memungkinkan LAN beroperasi. Jadi, masalahnya adalah: jika saya meneruskan lalu lintas IPv4 dengan benar, bagaimana saya juga bisa meneruskan lalu lintas ARP, sehingga VM / LXC / NNS saya berfungsi? Caranya adalah dengan menggunakan proxy-arp.

Jawaban lengkapnya ada di Blog Bohdi Zazen , dengan judul yang terbuka: Kartu nirkabel jembatan. Ia menggunakan paket usang, uml-utilities, untuk membuat antarmuka virtual dengan menggunakan perintah tunctl: ini adalah satu-satunya perintah yang ia gunakan uml-utilities, sehingga Anda dapat dengan aman mengabaikan mengunduh paket, dan menggunakan perintah I tulis di atas untuk membuat antarmuka tap atau tun, mana pun yang Anda suka, cukup modifikasi perintahnya. lalu buat pasangan veth untuk LXC Anda, dan sekarang buat jembatan antara tap0 dan veth0. Jembatan ini, yang disebut br0, adalah yang harus Anda gunakan untuk proxy-arp, bukan antarmuka tap0 sederhana yang dijelaskan oleh Bohdi Zazen.


Sumber: askubuntu.com , nullroute.eu.org , firejail.wordpress.com , superuser.com

intika
sumber
0

Saya menyukai pendekatan Proxy Arp , tetapi pertanyaan aslinya menentukan Arch Linux. Berikut ini adalah versi Arch Linux dari implementasi Raspbian . Saya berusaha sangat keras untuk mengadaptasi pendekatan asli dari Debian Wiki yang disebutkan di sini untuk menggunakan netctlExecUpPost dan ExecDownPretanpa hasil. Semuanya bekerja di baris perintah, tetapi tidak di dalam profil.

Langkah langkah:

  1. Menerapkan jaringan nirkabel dengan systemd-networkd . Dalam file .network, atur IPForward=yes. Saya menggunakan WPA Supplicant untuk mengelola antarmuka jaringan nirkabel.
  2. Aktifkan relai mDNS dengan menetapkan di enable-reflector=yesdalam /etc/avahi/avahi-daemon.conf; mulai dan aktifkan avahi-daemon.servicejika belum.
  3. Instal parprouted dari AUR, dan buat file layanan untuknya dengan mengadaptasi yang dari jawaban Raspbian . Saya tidak merasa perlu mengatur antarmuka agar tidak pilih-pilih. Secara alami, layanan ini harus dimulai dan diaktifkan.
[Unit]
Description=proxy arp routing service
Documentation=/raspberrypi//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]
[email protected]
  1. Untuk mendukung DHCP untuk perangkat yang terhubung ke port ethernet, buat layanan dhcrelay (dari paket DHCP). Menemukan alamat server DHCP dengan memeriksa log tampaknya tidak bagus, tetapi berhasil. Mulai dan aktifkan.
[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

Pendekatan ini berhasil bagi saya pada Raspberry Pi Model B + w / ArchLinuxArm yang memakai adaptor USB WiFi dengan chipset RT5370. Karena Pi akan menyediakan WiFi ke printer hanya dengan ethernet, saya ingin itu kuat untuk penanganan yang kasar, jadi langkah saya selanjutnya adalah mengkonfigurasi kartu SD sebagai hanya baca .

eponim
sumber