Kết nối wlan0 với eth0


25

Trên Arch Linux, tôi muốn có eth0 (được kết nối với bộ định tuyến cầu nối) chia sẻ kết nối nhận được từ wlan0, tôi đã đọc hướng dẫn nhưng tôi không hiểu biết như những người dùng khác và không hoàn toàn hiểu.


8
vui lòng không đặt '[đã giải quyết]' trong câu hỏi hoặc tiêu đề, chấp nhận câu trả lời là cách chính xác để cho thấy rằng một vấn đề đã được giải quyết. Nó thay đổi cách hiển thị câu hỏi trên danh sách chính cũng như đặt dấu kiểm màu xanh lục vào câu trả lời bạn đã đánh dấu là chính xác.
Zypher

1
Tôi sẽ đánh giá cao nếu không ai nhắn tin với trang này. Nếu bạn có bất kỳ vấn đề, liên hệ với tôi. Cảm ơn bạn.
dbdii407

13
serverfault.com/faq Cụ thể tiêu đề "Người khác có thể chỉnh sửa nội dung của tôi"
Zypher

@Zypher URL bạn liên kết đến không còn tồn tại. Đoạn có liên quan đã chuyển đi nơi khác?
kasperd

Câu trả lời:


24

CẬP NHẬT

Không thể kết nối giữa không dây (máy khách hay chế độ trạm) và giao diện có dây theo luồng này trên linux-ath5k-devel .

Cài đặt NAT

Thay vào đó, người ta nên thiết lập NAT:

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

Chỉ định IP

Sau đó, bạn phải gán địa chỉ IP cho chính mình:

ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up

Cài đặt trình nền dhcp

Cài đặt máy chủ dhcp và thêm văn bản sau vào tệp cấu hình của nó (trong /etc/dhcpd.conf hoặc một cái gì đó tương tự)

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

Bắt đầu dhcpd

Sau đó bắt đầu /etc/init.d/dhcpd bắt đầu

Và đó là nó!

Chỉ đọc bên dưới nếu bạn quan tâm đến thiết lập bắc cầu không hoạt động


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0

Đầu tiên bạn tạo một giao diện cầu nối Tôi chọn một tên tùy ý mybridge sau đó thêm không gian vào đó.

Bạn nên yêu cầu một địa chỉ IP mới (Điều này chỉ cần thiết nếu bạn muốn có được một IP hợp lệ cho chính thiết bị bắc cầu):

dhclient -d mybridge

3
Bạn thực sự không cần một địa chỉ IP cho giao diện cầu nối để cầu nối hoạt động.
Massimo

7
không thể thêm wlan0 vào cầu mybridge: Thao tác không được hỗ trợ
dbdii407

1
@Massimo: đúng vậy. IP hợp lệ là cần thiết để tích lũy mạng từ "thiết bị bắc cầu".
cstamas

10
NAT là một cái gì đó hoàn toàn khác với cầu nối. Cầu nối là lớp hai, NAT là lớp ba và cụ thể là IPv4. Tôi không hiểu tại sao đây là một câu trả lời được chấp nhận.
WhyNotHugo

3
@Hugo IP NAT là lớp 3, nhưng MAC NAT là lớp 2. Để bắc cầu WiFi, bạn có thể sử dụng 4addr, WDS, MAC NAT hoặc thay vào đó bạn có thể làm gì đó ở lớp 3 (chẳng hạn như IP NAT).
David Schwartz

27

Để kết nối giao diện wifi, bạn có thể sử dụng iwcông cụ để kích hoạt 4addr tương tự:

# iw dev <wifiInterface> set 4addr on

I E:

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

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

Bây giờ nó sẽ làm việc. Bạn có thể hiển thị các cầu bằng cách sử dụng:

# brctl show

2
Cài đặt này để làm gì và tại sao bạn đề nghị cụ thể sử dụng nó trong kịch bản này?
hakre

Đây là một giải pháp cho lỗi "Thao tác không được phép" khi cố gắng thêm giao diện wlan0 vào giao diện cầu nối. Sau đó, bạn phải chỉ định giao diện cầu nối trong / etc / mạng / giao diện để được đưa lên sau khi khởi động.
Str82DHeaD

1
@hakre 4addrChế độ làm cho WiFi hoạt động đủ như Ethernet có dây mà cầu nối sẽ hoạt động. Không có nó, bắc cầu sẽ không hoạt động nếu không có NAT.
David Schwartz

1
4addrkhông yêu cầu cả hai mặt của một liên kết không dây hỗ trợ nó (giả sử bạn đang cố gắng thực hiện một bộ mở rộng wifi)
nhed

5

Phụ thuộc vào ý nghĩa của AP đối với bạn:

1) Nó chỉ có thể muốn xem các gói đến từ bạn, với địa chỉ lớp liên kết đã biết của bạn (và do đó không phải là các gói được bắc cầu) 2) Nó thực sự có thể thông minh hơn và biết địa chỉ IP nào sẽ thuộc về địa chỉ lớp liên kết nào (nguyên nhân nó biết DHCP và kiểm tra nó)

Nếu 1 + 2 đều đúng, bạn thực sự cần một cái gì đó như IP NAT, DHCP, ..

Nhưng nếu chỉ có 1) là trường hợp, bạn có thể giả mạo địa chỉ lớp liên kết và ánh xạ ngược lại sang bên phải theo hướng khác như được mô tả ở đây:

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


Điều này thực sự lộn xộn. Và nó yêu cầu thiết lập thêm mỗi khi bạn thêm một máy tính mới.
Michael Hampton

4

4addr như được mô tả trong các câu trả lời khác chắc chắn là cách tốt nhất khi được hỗ trợ bởi bộ điều hợp / trình điều khiển, nhưng không phải tất cả chúng đều được. NAT có thể hoạt động đối với một số thứ, nhưng việc giao tiếp đúng cách cả hai chiều trên lan sẽ trở thành vấn đề (ví dụ: kết nối máy in hoặc truy cập các thiết bị IoT khác ở phía bên kia của NAT). Bất cứ điều gì dựa vào quảng bá / phát đa hướng (ví dụ: tự động phát hiện, bonjour) sẽ thất bại thông qua NAT.

Giải pháp thay thế đang sử dụng Proxy ARP (parprouted) như được mô tả trong https://wiki.debian.org/BridgeNetworkConnectionsProxyArp . Tôi đã thiết lập điều này trên Raspberry Pi cho một máy in và nó hoạt động như một bùa mê (Tôi đã thêm một giấc ngủ 10 giây trong các post-uplệnh để cho nó nhận địa chỉ IP trước, nó có thể phải làm với sự chậm chạp của tôi RPi ...)


liên kết này đến giải pháp proxy-arp plus dhcp-helper là giải pháp tương thích và sạch nhất cho đến nay tôi từng thấy.
minghua

3

Cầu wlan và 4addr:

Cầu nối wlan0 là một nỗi đau. Bạn thường không thể thêm nó vào giao diện cầu nối (brctl trả về "Thao tác không được phép") và sử dụng bộ lọc "cầu nối" VirtualBox dẫn đến một mớ hỗn độn lớn về xung đột ARP và DHCP. Nguyên nhân của điều này là do các khung 802.11 chỉ chứa ba địa chỉ theo mặc định: địa chỉ MAC của cả thiết bị không dây (máy tính xách tay và AP) và của người nhận cuối cùng (như trong Ethernet). Người ta luôn cho rằng chỉ có một người khởi tạo có thể.

802.11 có thể mang địa chỉ MAC thứ tư, của người khởi tạo và điều này được sử dụng trong chế độ WDS bởi các bộ lặp. Tính năng này cũng có thể được kích hoạt trên Linux, sử dụng iw và bật chế độ này sẽ cho phép wlan0 được sử dụng trong các giao diện cầu nối, cũng như với kết nối mạng cầu nối VirtualBox:

iw dev wlan0 set 4addr on

Tuy nhiên, với 4addr được bật, bạn có thể bị AP bỏ qua hoàn toàn: hiệp hội thành công nhưng tất cả các khung dữ liệu biến mất trong ether. Điều này có thể là vì lý do bảo mật (vì thật khó để giả mạo địa chỉ MAC nguồn. Vâng.) Trong bộ định tuyến của tôi (chạy OpenRG), cần phải bật chế độ "WDS" cho giao diện AP không dây, thêm thiết bị WDS bị hạn chế vào địa chỉ MAC của máy tính xách tay và thêm nó vào cầu nối LAN. Các gói 4addr hiện đang hoạt động.

Tuy nhiên, có một vấn đề khác - bộ định tuyến từ chối các gói ba địa chỉ từ máy tính xách tay, điều này có thể khá bất tiện (phải chuyển 4addr mỗi khi thay đổi mạng WLAN). Cách giải quyết là thêm, trên máy tính xách tay, giao diện không dây thứ hai được liên kết với cùng một thiết bị, nhưng có địa chỉ MAC khác. Đầu tiên hoàn tác cấu hình trước đó:

iw dev wlan0 set 4addr off

Sau đó, thêm giao diện thứ hai - tên được chọn tùy ý - với một địa chỉ MAC khác:

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

Ở đây phải khớp với địa chỉ thiết bị WDS được cấu hình trong bộ định tuyến; ngoài ra, nó có thể là bất kỳ địa chỉ MAC hợp lệ nào. MAC gốc của wlan0 sau đó vẫn được sử dụng cho "bình thường".

Có thể sử dụng cả wlan0 và wds.wlan0 cùng một lúc - mặc dù tôi chỉ thử nghiệm liên kết với cùng một AP hai lần, không phải với các AP khác nhau. Tôi đoán họ sẽ cần ít nhất là trên cùng một kênh.

Một số người đã hỏi tại sao sử dụng điều này khi VirtualBox có thể kết nối WiFi "tốt". Câu trả lời là VirtualBox không gửi địa chỉ MAC của máy ảo; thay vào đó, nó cũng thực hiện NAT ở lớp MAC. - 2014-08-22

Cầu wlan trực tiếp

Trong một số trường hợp nhất định, bạn cũng có thể sử dụng wlan_kabel. Nó sử dụng ổ cắm gói để kết nối trực tiếp wlan * với các thiết bị ethernet. Tuy nhiên, bạn chỉ có thể kết nối một MAC duy nhất tại một thời điểm với wlan_kabel. Nó không có nhược điểm là bị chặn bởi các điểm truy cập, bởi vì chỉ MAC gốc của thiết bị wlan được sử dụng. Trong trường hợp của bạn, điều này có nghĩa là, wlan0 chỉ có thể được sử dụng bởi một VM và thậm chí không phải bởi máy chủ. Bạn có thể lấy wlan_kabel tại đây . Điều này tương tự như giải pháp macvlans .

Cầu nối với ipvlan

IP Vlan không có giới hạn của một cây cầu, nó có thể được sử dụng để cầu một chi tiết mạng về cách sử dụng nó có thể được tìm thấy ở đây

Giả trang thay thế

Định tuyến Linux có thể được sử dụng thay thế với iptables-giả trang và ip_forward để đạt được một cầu nối nhưng như đã đề cập, điều này đòi hỏi phải kích hoạt ip_forward và sẽ khiến linux hoạt động như một bộ định tuyến, điều này cần được thiết lập cẩn thận vì nó có thể gây ra một số vấn đề bảo mật.

# 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

Giao diện br0 sau đó sẽ có quyền truy cập vào mạng wlan0

Quan trọng và liên quan

Ngoài ra, và rất quan trọng, bạn không nên sử dụng các lệnh lỗi thời, không dùng nữa như ifconfig, brctl , v.v. Bộ iproute2 chứa các lệnh cho tất cả điều này, bao gồm thiết lập giao diện ảo (thứ mà trước đây chúng ta phải sử dụng openvpn) và tạo cầu nối. Nếu bạn không biết cách thiết lập một cây cầu với ip, thì ở đây chúng tôi đi

  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

Với bộ lệnh này, chúng ta tạo một giao diện ảo có tên là tap0, sau đó là một cây cầu có tên là br0, sau đó làm nô lệ eth0 và tap0 cho cây cầu, sau đó chúng ta gán một địa chỉ IP là 10.173.10.1, sau đó đưa tất cả lên. Ba trường hợp riêng biệt để đưa các giao diện lên (cho tap0, eth0 và br0) là bắt buộc.

Mẹo để thực hiện công việc này là sử dụng proxy.arp, cho phép máy tính của bạn (không phải không gian tên / vùng chứa VM / Linux của bạn) trả lời các truy vấn ARP thay cho chúng.

Nói cách khác, bằng cách sử dụng chuyển tiếp IPv4 giữa giao diện phần cứng và giao diện ảo của bạn, bạn nghĩ rằng bạn có thể kết nối VM / LXC / NNS với mạng LAN của mình như thể đó là giao diện vật lý, nhưng điều này không đúng: bạn hoàn toàn quên mất lưu lượng ARP cơ bản, đó là những gì thực sự cho phép LAN hoạt động. Vì vậy, vấn đề là: nếu tôi chuyển tiếp chính xác lưu lượng truy cập IPv4, làm cách nào tôi cũng có thể chuyển tiếp lưu lượng ARP, để VM / LXC / NNS của tôi hoạt động? Bí quyết là sử dụng proxy-arp.

Câu trả lời đầy đủ cho điều đó là trong Blog của Bohdi Zazen , với tiêu đề được tiết lộ: Thẻ không dây Bridge. Anh ta sử dụng gói lỗi thời, tiện ích uml, để tạo giao diện ảo bằng lệnh tuncl: đây là lệnh duy nhất anh ta sử dụng tiện ích uml, để bạn có thể bỏ qua việc tải xuống gói một cách an toàn và sử dụng lệnh I đã viết ở trên để tạo giao diện tap hoặc tun, tùy theo bạn thích, chỉ cần sửa đổi lệnh cho phù hợp. sau đó tạo một cặp veth cho LXC của bạn và bây giờ tạo cầu nối giữa tap0 và veth0. Cây cầu này, được gọi là br0, là thứ bạn phải ủy quyền, thay vì giao diện tap0 đơn giản được mô tả bởi Bohdi Zazen.


Nguồn: Askubfox.com , nullroute.eu.org , firejail.wordpress.com , superuser.com


0

Tôi thích cách tiếp cận Proxy Arp , nhưng câu hỏi ban đầu chỉ định Arch Linux. Đây là phiên bản Arch Linux của một triển khai Raspbian . Tôi đã rất cố gắng để điều chỉnh cách tiếp cận ban đầu từ Debian Wiki được đề cập ở đây với netctl bằng cách sử dụng ExecUpPostExecDownPrekhông thành công. Tất cả mọi thứ làm việc tại dòng lệnh, nhưng không phải trong hồ sơ.

Các bước:

  1. Thực hiện kết nối mạng không dây với systemd-networkd . Trong tệp .network, đặt IPForward=yes. Tôi đã sử dụng WPA SUPicant để quản lý giao diện mạng không dây.
  2. Cho phép chuyển tiếp mDNS bằng cách đặt enable-reflector=yestrong /etc/avahi/avahi-daemon.conf; bắt đầu và kích hoạt avahi-daemon.servicenếu nó chưa có
  3. Cài đặt parprouted từ AUR và tạo tệp dịch vụ cho nó bằng cách điều chỉnh tệp từ câu trả lời của Raspbian . Tôi không thấy cần phải thiết lập giao diện là lăng nhăng. Đương nhiên, dịch vụ này sẽ cần được bắt đầu và kích hoạt.
[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]
WantedBy=wpa_supplicant@wlan0.service
  1. Để hỗ trợ DHCP cho thiết bị được kết nối với cổng ethernet, hãy tạo dịch vụ dhcrelay (từ gói DHCP). Tìm địa chỉ của máy chủ DHCP bằng cách truy cập thông qua nhật ký có vẻ không phù hợp, nhưng nó hoạt động. Bắt đầu và kích hoạt.
[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

Cách tiếp cận này hiệu quả với tôi trên Raspberry Pi Model B + w / ArchLinuxArm trang bị bộ chuyển đổi USB WiFi với chipset RT5370. Vì Pi sẽ cung cấp WiFi cho máy in chỉ có ethernet, tôi muốn nó mạnh mẽ để xử lý thô, vì vậy bước tiếp theo của tôi sẽ là định cấu hình thẻ SD là chỉ đọc .

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.