Chúng ta đang nói về một điểm truy cập cùng với kết nối máy khách wlan0 với một mạng wifi khác (bộ lặp wlan) hoặc bộ định tuyến internet.
Nếu bạn muốn một điểm truy cập cùng với cổng ethernet eth0 làm đường dẫn đến bộ chuyển mạch hoặc bộ định tuyến internet thì hãy xem Thiết lập Raspberry Pi như một điểm truy cập - một cách dễ dàng .
Đã thử nghiệm trên Raspberry Pi 4B với
Raspbian Buster Lite 2020/02/13 được cập nhật vào ngày 2020/03/03.
Cập nhật được thực hiện với sudo apt update && sudo apt full-upgrade && sudo reboot
.
Ở đây bạn sẽ tìm thấy bản sửa đổi được thử nghiệm cuối cùng cho Raspbian Stretch Lite .
Raspberry Pi có thể hoạt động như một điểm phát sóng không dây và đồng thời kết nối với một điểm nóng khác với tư cách là khách hàng. Nhưng thiết bị wifi trên RasPi có một hạn chế chung. Kết nối máy khách không thể được bắc cầu vì thiếu WDS (hệ thống phân phối không dây) cần thiết để bắc cầu trên mạng không dây. Để biết thêm thông tin, hãy xem Raspberry Pi WiFi to Ethernet Bridge cho máy chủ? . Vì vậy, chúng tôi chỉ có thể sử dụng định tuyến cho kết nối máy khách wifi đến bộ định tuyến internet. Nhưng điểm phát sóng wifi và cổng ethernet có dây có thể được bắc cầu để tất cả các thiết bị trên wifi và cổng có dây có thể có cùng một miền phát trên mạng con chung của nó.
Tôi giả sử rằng bạn đã có kết nối với internet. Tất cả các lệnh chỉ có thể được sao chép và dán vào dòng lệnh của RasPi. Các khối với EOF bạn có thể chọn cat
bao gồm. cuối cùng EOF
và dán nó vào dòng lệnh RasPis. Với Enter, nó sẽ được sao chép vào một tệp mà không có dấu phân cách EOF.
Trước tiên chúng tôi sẽ thiết lập một bộ lặp wifi để nếu bất cứ ai chỉ cần điều này, anh ta có thể dừng thiết lập tại thời điểm này và sử dụng nó. Đối với những người cần một cổng ethernet có cầu nối với điểm truy cập wifi có thể tiếp tục với việc thiết lập nó.
Tôi sử dụng systemd-networkd vì lý do. Đối với những người thiếu kiên nhẫn trước tiên chỉ có Cài đặt.
♦ Thiết lập bộ lặp wifi
Ví dụ cho thiết lập này:
wifi wifi wan
mobile-phone <~.~.~.~.~> (ap0)RPi(wlan0) <.~.~.~.~.> router <───> INTERNET
╲ ╱ ╲
(dhcp 192.168.4.1 (dhcp
from RPi) from router)
Bước 1: thiết lập systemd-networkd
Chỉ cần làm theo để
sử dụng systemd-networkd cho mạng chung . Bạn có thể sử dụng phần
"♦ Bước nhanh" . Sau đó quay lại đây.
Bước 2: cài đặt hostapd cho điểm truy cập
rpi ~$ sudo -Es # if not already done
rpi ~# apt install hostapd
rpi ~# systemctl unmask hostapd.service
rpi ~# systemctl enable hostapd.service
Tạo tập tin này với các cài đặt của bạn cho ssid=
, country_code=
và wpa_passphrase=
. Khi channel=
chọn cùng một kênh, wpa_supplicant với wlan0 sẽ kết nối với bộ định tuyến internet của bạn.
CHÚ Ý! Đây là một hạn chế từ phần cứng. hostapd
sẽ luôn đặt kênh có cùng giá trị so với kết nối máy khách, bất kể bạn đặt gì ở đây. Nếu bạn cần các kênh khác nhau thì bạn phải sử dụng một khóa USB / WiFi bổ sung.
rpi ~# cat > /etc/hostapd/hostapd.conf <<EOF
interface=ap0
driver=nl80211
ssid=RPiNet
country_code=DE
hw_mode=g
channel=1
auth_algs=1
wpa=2
wpa_passphrase=verySecretPassword
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF
rpi ~# chmod 600 /etc/hostapd/hostapd.conf
Chỉnh sửa hostapd.service :
rpi ~# systemctl --full edit hostapd.service
và nhận xét dòng After=network.target
với #
nó để trông giống như:
#After=network.target
Lưu nó và thoát khỏi trình soạn thảo. Tiếp theo thêm giao diện ap0 vào hostapd.service với:
rpi ~# systemctl edit hostapd.service
Trong trình soạn thảo trống chèn các câu lệnh này. Hãy chú ý đến dấu trừ sau khi bằng nhau =-
trên một số báo cáo. Lưu nó và thoát khỏi trình soạn thảo:
[Unit]
Wants=wpa_supplicant@wlan0.service
[Service]
Restart=
Restart=no
ExecStartPre=/sbin/iw dev wlan0 interface add ap0 type __ap
ExecStopPost=-/sbin/iw dev ap0 del
Bước 3: thiết lập wpa_supplicant cho kết nối máy khách
Tạo tập tin này với các thiết lập của bạn cho country=
, ssid=
và psk=
và kích hoạt nó:
rpi ~# cat >/etc/wpa_supplicant/wpa_supplicant-wlan0.conf <<EOF
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="TestNet"
psk="realyNotMyPassword"
key_mgmt=WPA-PSK # see ref (4)
}
EOF
rpi ~# chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
rpi ~# systemctl disable wpa_supplicant.service
rpi ~# systemctl enable wpa_supplicant@wlan0.service
rpi ~# rfkill unblock 0
Mở rộng wpa_supplicant với:
rpi ~# systemctl edit wpa_supplicant@wlan0.service
Trong trình soạn thảo trống chèn các câu lệnh này. Lưu nó và thoát khỏi trình soạn thảo:
[Unit]
BindsTo=hostapd.service
After=hostapd.service
Bước 4: thiết lập giao diện tĩnh
Tạo các tệp này:
rpi ~# cat > /etc/systemd/network/08-wlan0.network <<EOF
[Match]
Name=wlan0
[Network]
DNSSEC=no
# If you need a static ip address, then toggle commenting next four lines (example)
DHCP=yes
#Address=192.168.50.60/24
#Gateway=192.168.50.1
#DNS=84.200.69.80 1.1.1.1
EOF
Đối với những người muốn có một cây cầu, không cần tệp tiếp theo và phải tiếp tục với Cầu thiết lập .
rpi ~# cat > /etc/systemd/network/12-ap0.network <<EOF
[Match]
Name=ap0
[Network]
DNSSEC=no
IPMasquerade=yes
Address=192.168.4.1/24
DHCPServer=yes
[DHCPServer]
DNS=84.200.69.80 1.1.1.1
EOF
Thiết lập một bộ lặp wifi mà không cần cầu là xong. Bạn phải khởi
động lại.
♦ Cầu cài đặt
Thiết lập bộ lặp wifi như mô tả ở trên.
Ví dụ cho thiết lập này:
(dhcp
from RPi) bridge
╱ wifi ┌──────┐
mobile-phone <~.~.~.~.> │(ap0) │ wifi wan
│ br0│RPi(wlan0) <.~.~.~.~> router <───> INTERNET
laptop <────────> |(eth0)│╲ ╲
╲ wired └──────┘╱ (dhcp
(dhcp 192.168.4.1 from router)
from RPi)
Bước 5: cấu hình hostapd cho một cây cầu
Thêm một dòng bridge=br0
vào /etc/hostapd/hostapd.conf với:
rpi ~# echo 'bridge=br0' >> /etc/hostapd/hostapd.conf
Bước 6: thiết lập wpa_supplicant cho một cây cầu
Mở rộng wpa_supplicant với:
rpi ~# systemctl edit wpa_supplicant@wlan0.service
Trong trình soạn thảo nối các dòng để nó trông giống như sau. Hãy chú ý đến dấu trừ sau khi bằng nhau =-
trên một số báo cáo. Lưu nó và thoát khỏi trình soạn thảo:
[Unit]
BindsTo=hostapd.service
After=hostapd.service
Wants=ap-bring-up.service
Before=ap-bring-up.service
[Service]
ExecStopPost=-/bin/ip link set ap0 up
Xin lưu ý rằng đó ExecStopPost=-/bin/ip link set ap0 up
không phải là một lỗi đánh máy. Khi dừng wpa_supplicant, giao diện ap phải được thiết lập lại như được mô tả trong phần Chi tiết - wpa_supplicant cho cầu nối (Bước 6) .
Bước 7: hiển thị điểm truy cập với giao diện wifi ảo
Tạo một đơn vị với:
rpi ~# systemctl --force --full edit ap-bring-up.service
Trong trình soạn thảo trống, chèn các câu lệnh này, lưu nó và thoát khỏi trình soạn thảo:
[Unit]
Description=Bring up wifi interface ap0
Requisite=hostapd.service
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-networkd-wait-online --interface=wlan0 --timeout=60 --quiet
ExecStartPost=/bin/ip link set ap0 up
ExecStartPost=/usr/bin/resolvectl dnssec ap0 no
Bước 8: thiết lập giao diện tĩnh
Đối với một cây cầu ap0 được tạo động. Vì vậy, tạo các tệp này:
rpi ~# cat > /etc/systemd/network/02-br0.netdev <<EOF
[NetDev]
Name=br0
Kind=bridge
EOF
rpi ~# cat > /etc/systemd/network/04-eth0.network <<EOF
[Match]
Name=eth0
[Network]
DNSSEC=no
Bridge=br0
EOF
rpi ~# cat > /etc/systemd/network/16-br0_up.network <<EOF
[Match]
Name=br0
[Network]
DNSSEC=no
IPMasquerade=yes
Address=192.168.4.1/24
DHCPServer=yes
[DHCPServer]
DNS=84.200.69.80 1.1.1.1
EOF
Khởi động lại.
Đó là nó.
♦ Chi tiết
Chung
Một vấn đề là chúng tôi muốn sử dụng cùng một thiết bị cho máy khách wifi và cho một điểm truy cập. Điều này phải được hỗ trợ bởi phần cứng wifi. Chúng ta có thể kiểm tra điều này với
rpi ~$ sudo iw list | grep -A4 "valid interface combinations:"
valid interface combinations:
* #{ managed } <= 1, #{ P2P-device } <= 1, #{ P2P-client, P2P-GO } <= 1,
total <= 3, #channels <= 2
* #{ managed } <= 1, #{ AP } <= 1, #{ P2P-client } <= 1, #{ P2P-device } <= 1,
total <= 4, #channels <= 1
Phần quan trọng là #{ managed } <= 1, #{ AP } <= 1,
nhưng bạn cũng có thể thấy rằng điều này chỉ có thể có trên một kênh .
Tôi thấy rằng chúng tôi phải thiết lập trình tự này, nếu không, nó sẽ không hoạt động. Nếu các ứng dụng khác liên kết với cổng wifi thì không thể cài đặt được.
- tạo giao diện ảo
ap0
cho điểm truy cập
- bắt đầu truy cập daemon
hostapd
bằng giao diệnap0
- bắt đầu
wpa_supplicant
cho khách hàng sử dụng wifiwlan0
Lệnh này hạn chế toàn bộ thiết lập. Không thể bắt đầu hostapd khi wpa_supplicant đang chạy. Trước tiên, bạn phải dừng wpa_supplicant và sau đó bắt đầu hostapd và wpa_supplicant theo thứ tự này. Điều này là do trình điều khiển WiFi brcmfmac
.
Một cách giải quyết khác là wpa_supplicant vô hiệu hóa giao diện ap0 khi nó được quản lý, bất kể nó bắt đầu hay dừng. Vì vậy, ngay cả sau khi bắt đầu từ wpa_supplicant , chúng ta phải kích hoạt lại ap0 .
Ở đây chủ yếu có năm thành phần liên quan: giao diện ảo ap0 , hostapd , wpa_supplicant , cầu thiết lập và đưa lên điểm truy cập.
hostapd (Bước 2)
Đây là thiết lập bình thường bạn sẽ tìm thấy trên tất cả các trang web. Vui lòng đặt kênh thành cùng một giá trị sau đó wlan0 được kết nối với wifi từ bộ định tuyến của bạn. Đó là hạn chế từ phần cứng và có thể tránh nhầm lẫn với cài đặt kênh. hostapd sẽ luôn đặt kênh có cùng giá trị so với kết nối máy khách, bất kể bạn đặt gì ở đây.
Vui lòng sử dụng cụm mật khẩu đủ dài, tôi sẽ nói ít nhất là với 8 ký tự. Người ta nói rằng 4 ký tự quá nhỏ và hostapd sẽ từ chối chấp nhận kết nối. Bạn sẽ không tìm thấy điểm truy cập RPiNet trên điện thoại di động của mình (nhờ @Leo ).
Đối với các phụ thuộc, chúng tôi mở rộng đơn vị từ hostapd bằng tệp thả xuống (lớp phủ) (2) . Nó luôn bắt đầu wpa_supplicant (Muốn nó). Trong tập tin đơn vị chính có một Restart=always
bộ. Điều này là rất ấn tượng nếu việc tạo giao diện ap0 không thành công vì một số lý do. Khi khởi động, RasPi sẽ luôn cố gắng khởi động hostapd trong một vòng lặp vô tận và sẽ không bao giờ hoàn thành việc khởi động. Bạn phải ngắt nguồn và sửa chữa Thẻ SD trong một máy tính khác. Đó là một cấu hình rất xấu. Bạn thực sự nên vô hiệu hóa Khởi động lại. Sau đó giao diện ap0 được tạo trước khi bắt đầu hostapd . Điều này được tôn trọng để đặt hàng bắt đầu. Bởi vì ap0 bị ràng buộc với wlan0Nó có cùng địa chỉ mac. Bạn có thể xem xét để cung cấp cho nó một địa chỉ mac duy nhất nhưng đó không phải là một ý tưởng tốt. Trên mạng chỉ thấy địa chỉ mac từ wlan0 . Nếu bạn cung cấp cho ap0 địa chỉ mac của chính nó thì nó không được tìm thấy trên mạng cho các yêu cầu arp và địa chỉ IP cho các kết nối đến ap0 không được tìm thấy và bị kẹt. Bạn phải đặt ap0 thành chế độ lăng nhăng để làm cho nó hoạt động.
Sau khi thiết lập các phụ thuộc thì hostapd.service theo mặc định sẽ bắt đầu After=network.target
. Wpa_supplicant@wlan0.service phải bắt đầu After=hostapd.service
và bắt đầu theo mặc định Before=network.target
. Bạn có thấy xung đột với network.target
? Systemd phàn nàn với thông báo lỗi " Đã tìm thấy chu trình đặt hàng trên wpa_supplicant@wlan0.service/start " và ngăn chặn hostapd.service bắt đầu. Đó là lý do tại sao chúng tôi phải bình luận After=network.target
trong tệp đơn vị của hostapd.service.
Sau khi dừng hostapd thì ap0 cũng bị xóa để nó có thể được tạo lại vào lần bắt đầu tiếp theo của hostapd .
wpa_supplicant (Bước 3)
Thiết lập wpa_supplicant cho wlan0 chúng ta làm như bình thường. Đơn vị mở rộng của nó là liên kết chặt chẽ wpa_supplicant với hostapd để nó sẽ bắt đầu và dừng với nó theo đúng thứ tự. Chúng tôi làm điều đó bởi vì chạy wpa_supplicant mà không có hostapd là rất phức tạp và có thể dẫn đến sự cố hoàn toàn của trình điều khiển wifi brcmfmac , tôi đã thấy điều đó trong các thử nghiệm của mình.
Thiết lập giao diện tĩnh (Bước 4)
Ở đây chúng tôi xác định giao diện wlan0 và giao diện ảo ap0 chúng tôi cần cho một bộ lặp wifi. Đối với wlan0, chúng tôi nhận được địa chỉ IP bằng DHCP từ bộ định tuyến internet. Tùy chọn bạn có thể đặt địa chỉ IP tĩnh, nhưng sau đó bạn cũng phải xác định tất cả các cài đặt khác như cổng và máy chủ DNS vì bạn không nhận được chúng nữa từ máy chủ DHCP.
Giao diện ap0 cần một địa chỉ IP tĩnh vì đó là điểm truy cập và nguồn của máy chủ DHCP cho mạng wifi. Không có nhu cầu rằng các máy khách, được kết nối với bộ định tuyến internet, cũng phải kết nối với các máy khách trên điểm truy cập. Vì vậy, chúng ta có thể sử dụng NAT (IPMasazed = yes) giúp đơn giản hóa việc thiết lập rất nhiều. Sau đó, chúng tôi không phải định cấu hình các tuyến tĩnh và không cần thiết định cấu hình wlan0 với các giá trị tĩnh (địa chỉ IP, cổng, máy chủ DNS, v.v.).
hostapd cho cầu (Bước 5)
Chúng tôi đã thiết lập hostapd trong Bước 2. Bây giờ chúng tôi chỉ cần nối thêm bridge=br0
vào cấu hình của nó để nó sẽ tự động quản lý để thêm ap0 vào cầu.
wpa_supplicant cho cầu (Bước 6)
Khi wpa_supplicant được khởi động, nó cũng hiển thị giao diện wlan0 . Mỗi khi nó được quản lý, bất kể nó bắt đầu hay dừng, nó sẽ dừng ap0 vì nó không phải là giao diện thực và phụ thuộc trực tiếp vào wlan0 . Đó cũng là lý do tại sao nó chỉ có thể xuất hiện khi wlan0 có Gained Carrier. Nhưng chúng ta không thể đợi vài giây và sau đó đưa lên ap0 . wpa_supplicant.service phải bắt đầu hoàn toàn vì vậy chúng tôi chỉ có thể sử dụng một dịch vụ bổ sung ap-bring-up.service để thực hiện việc này. Các phụ thuộc đảm bảo điều này.
Sau khi dừng wpa_supplicant (đưa wlan0 xuống) ap0 phải được đưa lên một lần nữa để nó có thể tiếp tục chạy cho điểm truy cập.
đưa lên điểm truy cập (Bước 7)
Không thể chỉ thiết lập ap0 khi cần. Nó chỉ có thể bắt đầu khi wlan0 "Gained Carrier" và liên kết đã sẵn sàng (3) . Điều này sẽ xảy ra một vài giây hoặc nhiều hơn sau khi wpa_supplicant bắt đầu. Vì vậy, chúng tôi cần ap-bring-up.service mà wpa_supplicant Muốn và điều đó sẽ kiểm tra xem wlan0 có "Carrier Carrier" và đang trực tuyến. Có một chương trình trợ giúp systemd-networkd-Wait-online có thể thực hiện việc này đồng bộ. Chúng tôi sử dụng nó với thời gian chờ là 60 giây. Nếu kết nối mạng của bạn mất hơn 60 giây để thức dậy, thì bạn nên tăng thời gian chờ tương ứng. Với journalctl -b -e
bạn có thể kiểm tra nếu Starting Bring up wifi interface ap0...
vàStarted Bring up wifi interface ap0.
bao gồm wlan0: Gained carrier
. Điều này rất quan trọng vì nếu không, cây cầu sẽ không hoạt động chính xác với hành vi không xác định. Và tất nhiên, đơn vị này chỉ nên bắt đầu khi hostapd đang chạy (Requisite).
xác định giao diện tĩnh cho cầu (Bước 8)
Những tập tin xác định cầu. ap0 sẽ tự động được thêm bởi hostapd . eth0 và ap0 là nô lệ của cây cầu và không cần địa chỉ IP. Bản thân cầu br0 cũng không cần địa chỉ IP nhưng ở đây nó có địa chỉ IP tĩnh vì chúng ta cần nó cho máy chủ DHCP bị ràng buộc với br0 nên máy chủ DHCP có sẵn trên mạng con trên cầu (giao diện eth0, ap0).
Bởi vì tôi đã thấy một số rắc rối với độ phân giải tên khi DNSSEC được bật, nó bị vô hiệu hóa ở mọi nơi. Nếu nó được sử dụng, chúng ta có thể kích hoạt nó khi cần thiết.
Phần kết luận
Bây giờ bạn có thể bắt đầu, dừng và khởi động lại hostapd và wpa_supplicant .
Bạn sẽ thấy điểm truy cập, ở đây là RPiNet , trong điện thoại di động của bạn và sẽ nhận được địa chỉ IP để kết nối với điểm truy cập. Bạn cũng sẽ nhận được một địa chỉ IP từ cùng một mạng con nếu bạn kết nối máy tính xách tay bằng cáp với cổng ethernet và bạn có thể ping điện thoại di động.
Với thiết lập này, bạn có các phụ thuộc sau với bắt đầu và dừng:
hostapd │ wpa_supplicant wpa_supplicant │ hostapd
───────────┼────────────────────────────────────┼──────────
starting │ starts starting │ starts
stopping │ stops stopping │ ----
restarting │ restarts restarting │ starts
Điều này là do thứ tự bắt đầu nghiêm ngặt (xem phần Chung ). Bạn không thể chạy wpa_supplicant mà không có hostapd nhưng bạn có thể chạy hostapd mà không có wpa_supplicant bằng cách bắt đầu hostapd và sau đó dừng wpa_supplicant .
Nếu giao tiếp dừng lại vì một lý do nào đó (ví dụ như trì hoãn nhỏ hoặc một cái gì đó khác) thì hầu như đủ để đá ap0 với /bin/ip link set ap0 up
.
tài liệu tham khảo:
[1] Cách di chuyển từ mạng sang systemd-networkd với chuyển đổi dự phòng động
[2] man systemd.unit
[3] bắc cầu không dây systemd-networkd - cần chờ nhà mạng
[4] Thiết lập WiFi trên Pi 3 B +