Điều gì thay đổi khi bạn biến hộp Linux thành bộ định tuyến
What changes when you turn a Linux box into a router
Để biến một máy Linux thành hạ tầng mạng như router hay điểm phát WiFi, việc chính yếu là kích hoạt tính năng chuyển tiếp gói tin (packet forwarding) ở cấp độ kernel và thiết lập các dịch vụ mạng tương ứng. Điều này làm thay đổi vai trò của hệ thống, từ một máy chủ chỉ xử lý traffic cục bộ sang một thiết bị có khả năng định tuyến, lọc và dịch gói tin một cách thông minh giữa các mạng. Các developer cần nắm vững rằng để thực hiện được điều này, các bước bao gồm: bật IP forwarding, định nghĩa network bridges, cấu hình firewall rules (sử dụng nftables), thiết lập NAT (Network Address Translation), và cài đặt các dịch vụ như DHCP, DNS, cũng như cấu hình WiFi. Điều này minh chứng cho thấy Linux là một nền tảng mạng cực kỳ linh hoạt và mạnh mẽ khi được cấu hình đúng cách.
Bài viết này được viết vào ngày 1 tháng 3 năm 2026 Việc biến hệ thống Linux thành cơ sở hạ tầng mạng có ý nghĩa gì? Tôi nghĩ thật tuyệt vời khi chúng ta có thể biến hệ thống Linux thành một thiết bị mạng. Nhưng có...
Biến hệ thống Linux thành cơ sở hạ tầng mạng có ý nghĩa gì?
Tôi nghĩ thật tuyệt vời khi chúng ta có thể biến hệ thống Linux thành một thiết bị mạng. Nhưng bạn có bao giờ thắc mắc:
Chúng ta đang thay đổi điều gì khi biến hệ thống Linux thành bộ định tuyến hoặc bộ chuyển mạch? Chúng ta sẽ thay đổi điều gì nếu biến Raspberry Pi thành điểm truy cập WiFi? Sự thay đổi giám sát hiệu suất hệ thống có ý nghĩa như thế nào? Chúng ta phải thay đổi những cổng nào để cho phép chuyển tiếp và xử lý gói?
Tôi sẽ bắt đầu bằng phần giải thích tường thuật về những thay đổi làm biến đổi hệ thống Linux vào điểm truy cập WiFi và sau đó tôi sẽ hiển thị các lệnh để triển khai điểm truy cập đó.
Tôi có thành kiến về nhận thức: Tôi nghĩ các thiết bị mạng và máy tính là những thứ khác nhau. Điều này là do trải nghiệm dòng lệnh trên thiết bị mạng khác với những gì bạn trải nghiệm trên máy chủ/máy chủ. Trên máy chủ và máy trạm: bạn có xu hướng tập trung nhiều vào các đối tượng trên hệ thống file. Trên thiết bị kết nối mạng, bạn dành phần lớn thời gian để làm việc trực tiếp với các tiến trình đang chạy. Các lệnh và mục tiêu tương tác trên thiết bị kết nối mạng rất khác so với các lệnh trên máy chủ.
Tôi nghi ngờ rất nhiều người khác từng làm việc trong lĩnh vực mạng cũng có cảm nhận tương tự về thiết bị mạng so với hệ điều hành máy chủ. Điều này có thể cụ thể cho hành trình của tôi. Nhưng dù tốt hay xấu, tôi cảm thấy rằng mạng khác với điện toán nói chung. Không phải vậy. Nếu bạn biết kết nối mạng, bạn có thể khiến Linux thực hiện các công việc kết nối mạng nếu bạn thực hiện 7 thay đổi.
- Kích hoạt chuyển tiếp IP
- Xác định cây cầu
- Kích hoạt chính sách nftables
- Tường lửa trạng thái với conntrack
- Xác định NAT và Masquerade chính sách
- Cung cấp DHCP và DNS bằng dnsmasq
- Mạng WiFi bán hàng tự động bằng máy chủ lưu trữ
Để kích hoạt quá trình xử lý và chuyển tiếp gói trong Nhân Linux, bạn hãy bắt đầu bằng cách thay đổi cấu hình của Hạt nhân để kết nối mạng. Mọi thiết bị Android cung cấp điểm phát sóng WiFi cá nhân đều thực hiện những thay đổi chung giống nhau.
Hành trình của gói qua lõi
Giả sử chúng ta có một máy Linux có một giao diện mạng duy nhất. Một gói đến trên giao diện hướng ra bên ngoài. Thẻ giao diện mạng (NIC) báo hiệu ngắt và trình điều khiển kéo khung vào bộ đệm vòng trong bộ nhớ hạt nhân thông qua Truy cập bộ nhớ trực tiếp (DMA), trong đó phần cứng ghi dữ liệu vào RAM mà không có sự tham gia của Bộ xử lý trung tâm (CPU). Ngăn xếp mạng của hạt nhân chọn khung từ đó, loại bỏ tiêu đề Ethernet và kiểm tra địa chỉ đích của Giao thức Internet (IP).
Tại thời điểm đó, hạt nhân sẽ tham khảo bảng định tuyến của nó. Nếu địa chỉ đích khớp với một trong các giao diện của chính máy, gói sẽ di chuyển qua ngăn xếp mạng tới ổ cắm nghe, tới một quy trình đang chờ xử lý nó. Nếu địa chỉ đích không khớp với giao diện cục bộ và tính năng chuyển tiếp IP bị tắt thì hạt nhân sẽ loại bỏ gói và tăng bộ đếm trong /proc/net/snmp.
Hành vi mặc định của Linux là kết thúc dòng của gói: hạt nhân không thể chuyển tiếp gói đến máy chủ khác. Chúng tôi cần thực hiện các thay đổi đối với hệ thống nếu muốn kích hoạt định tuyến. Chúng tôi cũng cần một nic khác để gửi qua các giao diện mạng. Máy trạm là máy chủ chứ không phải bộ định tuyến.
Bây giờ hãy tưởng tượng cùng một hệ thống đó với hai NIC (còn gọi là homed kép)- làm cách nào để chúng ta tiến gần hơn đến việc định tuyến các gói?
Vai trò của bộ định tuyến là chuyển tiếp các gói mà máy chủ riêng của chúng tôi bỏ đi theo mặc định. Hãy cùng khám phá từng bước để di chuyển hạt nhân từ trạng thái bảo thủ của máy trạm với tư cách là máy chủ sang bộ định tuyến định tuyến các gói, sửa đổi tiêu đề gói và lọc lưu lượng giữa các giao diện.
Móc câu là gì?
Trong nhân Linux, hook là một điểm chặn được chỉ định trong đường dẫn mã nơi các hàm bên ngoài có thể tự đăng ký để thực thi. Hãy coi nó như một vị trí trong dây chuyền lắp ráp: quy trình chính tạm dừng tại các điểm được xác định trước và chạy mọi chức năng đã đăng ký tại vị trí đó, theo thứ tự ưu tiên. Mỗi chức năng đã đăng ký có thể kiểm tra, sửa đổi, chấp nhận hoặc loại bỏ mục đi qua. Móc cho phép hạt nhân tách logic xử lý gói cốt lõi của nó khỏi các quyết định chính sách như lọc và dịch địa chỉ. Hạt nhân xác định vị trí của các móc; quản trị viên và các công cụ như nftables quyết định mã nào sẽ chạy trên mỗi công cụ. Hạt nhân triển khai các hook dưới dạng mảng các con trỏ hàm được lưu trữ trong các cấu trúc như struct nf_hook_entries. Tại mỗi điểm nối, hạt nhân lặp lại mảng thông qua nf_hook_slow(), chuyển mỗi lệnh gọi lại đã đăng ký một con trỏ tới cấu trúc sk_buff của gói.
Trước đó, tôi đã đề cập đến “Ngăn xếp mạng của hạt nhân”. Điều đó có nghĩa là gì?
Một gói đến NIC. Trình điều khiển đặt nó vào bộ nhớ và ngăn xếp mạng của kernel xử lý nó qua một số giai đoạn được sắp xếp. Tại các điểm được xác định dọc theo đường dẫn này, hạt nhân sẽ chuyển gói qua netfilter, một khung dựa trên hook được tích hợp trực tiếp vào mã mạng của hạt nhân.
Móc Netfilter là mảng con trỏ hàm được đăng ký bên trong đường dẫn xử lý gói của kernel. Tại mỗi điểm hook, kernel lặp qua mọi hàm đã đăng ký theo thứ tự ưu tiên, chuyển một con trỏ tới bộ đệm socket của gói (sk_buff). Mỗi chức năng đã đăng ký có thể chấp nhận, loại bỏ, sửa đổi hoặc xếp hàng gói. Các công cụ trong không gian người dùng như nftables đăng ký các hàm gọi lại tại các hook này bằng cách gửi lệnh thông qua ổ cắm netlink, một kênh Giao tiếp giữa các quá trình (IPC] được thiết kế cho cấu hình mạng.
Bạn có thể quan sát hoạt động của netfilter trong thời gian chạy. bộ quy tắc danh sách nft hiển thị tất cả các bảng và chuỗi hiện được đăng ký. conntrack -L hiển thị bảng theo dõi kết nối trực tiếp. Để kiểm tra kỹ hơn, perf trace hoặc bpftrace có thể gắn đầu dò vào các hàm kernel như nf_hook_slow (chức năng mà kernel gọi khi nó lặp lại các lệnh gọi lại hook), cho phép bạn xem các quyết định gói riêng lẻ trong thời gian thực.
Năm điểm nối tiêu chuẩn là:
| Hook | Vị trí trong gói đường dẫn |
|---|---|
| PREROUTING | Ngay khi đến nơi, trước khi định tuyến quyết định |
| INPUT | Đối với các gói dành cho địa phương xử lý |
| FORWARD | Đối với các gói truyền qua máy này sang máy khác máy chủ |
| OUTPUT | Đối với các gói được tạo bởi máy chủ cục bộ xử lý |
| POSTROUTING | Ngay trước khi gói rời khỏi giao diện |
Sau khi PREROUTING, hạt nhân đưa ra quyết định định tuyến. Các gói được gửi đến chính máy sẽ di chuyển qua INPUT. Các gói được gửi đến các máy chủ khác, khi tính năng chuyển tiếp được bật, hãy chuyển sang Forward và sau đó chuyển ra ngoài thông qua POSTROUTING. Mỗi bước cấu hình đều đăng ký mã trên một trong các móc này hoặc thay đổi cách hoạt động của quyết định định tuyến.
Thay đổi 1: Kích hoạt chuyển tiếp IP
Chuyển tiếp IP là cổng đầu tiên cho phép truyền gói tin qua các giao diện. Không có nó, hook FORWARD có thể tồn tại nhưng kernel không bao giờ gửi gói tin tới nó. Các gói đến đích nước ngoài sẽ chết sau khi tra cứu định tuyến. Khi nó mở, hạt nhân sẽ chuyển các gói đó sang FORWARD và mọi phần khác của cấu hình bộ định tuyến sẽ có hiệu lực.
Bạn quản lý việc chuyển tiếp ip thông qua tệp /etc/sysctl.d/10-forward.conf:
/etc/sysctl.d/10-forward.conf
net.ipv4.ip_forward=1
/etc/sysctl.d/ là thư mục cấu hình thả xuống cho các tham số thời gian chạy kernel. Khi khởi động, systemd-sysctl.service đọc mọi tệp *.conf trong thư mục đó (cộng với /etc/sysctl.conf) và ghi từng tham số vào đường dẫn tương ứng của nó trong /proc/sys/.
Hạt nhân hiển thị hệ thống tệp ảo tại /proc/sys/ nơi mọi tham số có thể điều chỉnh xuất hiện dưới dạng tệp. Ký hiệu sysctl có dấu chấm chỉ là bản dịch đường dẫn: net.ipv4.ip_forward ánh xạ tới /proc/sys/net/ipv4/ip_forward. Việc ghi 1 vào tệp này sẽ yêu cầu ngăn xếp IPv4 gửi các gói có đích không cục bộ thông qua hook FORWARD thay vì loại bỏ chúng. Hạt nhân triển khai quyết định này trong ip_forward() trong net/ipv4/ip_forward.c.
Việc ghi 1 vào sysctl.d/10-forward.conf khiến những thao tác ghi đó được duy trì trong suốt các lần khởi động lại.
systemd-sysctl.service đọc tất cả các tệp trong /etc/sysctl.d/ khi khởi động và áp dụng chúng theo thứ tự từ điển. Việc khởi động lại dịch vụ sẽ áp dụng chúng ngay lập tức mà không cần khởi động lại hệ thống. Bạn có thể xác minh giá trị hiện hoạt bất kỳ lúc nào:
cat /proc/sys/net/ipv4/ip_forward
1 nghĩa là quá trình chuyển tiếp đang hoạt động. 0 nghĩa là cổng đã đóng và phần còn lại của cấu hình bộ định tuyến ở trạng thái trơ bất kể cấu hình nào khác.
Thay đổi đầu tiên của chúng tôi là đặt tham số ip_forward của hạt nhân thành 1.
Thay đổi 2: Xác định cầu nối: Thu gọn hai giao diện thành một phân đoạn
Mạng gia đình phục vụ cả máy khách có dây và không dây trên cùng một mạng con. Cấu hình sẽ tạo một cầu nối mạng, br0 và gắn eth0 và wlan0 vào đó làm cổng thành viên. Để biết chi tiết về giao diện cầu nối Linux, hãy xem tài liệu về cầu nối hạt nhân.
Thay đổi thứ hai của chúng tôi là xác định một cầu nối và thêm các giao diện vào đó để liên kết chúng để truyền gói tin.
Cầu nối hoạt động ở Lớp 2, lớp Ethernet. Mô-đun cầu nối của hạt nhân duy trì bảng chuyển tiếp địa chỉ Kiểm soát truy cập phương tiện (MAC). Khi một khung đến trên eth0, cầu nối sẽ tra cứu địa chỉ MAC đích trong bảng đó và chuyển tiếp khung đến cổng nơi địa chỉ đó được nhìn thấy lần cuối. Nếu địa chỉ không xác định, cầu sẽ tràn khung tới tất cả các cổng thành viên. Cây cầu hết hạn các liên kết đã học sau một thời gian lão hóa có thể định cấu hình. Đối với phần còn lại của mạng, br0 xuất hiện dưới dạng một công tắc hợp nhất duy nhất, một phân đoạn Lớp 2 được chia sẻ trên cả giao diện có dây và không dây. Hạt nhân triển khai logic chuyển tiếp cầu nối trong br_forward() trong net/bridge/br_forward.c.
Điều này quan trọng đối với việc định tuyến vì hạt nhân chỉ định địa chỉ IP cho các giao diện chứ không phải cho các cổng vật lý. Việc chỉ định 192.168.1.1 cho br0 có nghĩa là bộ định tuyến giữ một địa chỉ Mạng cục bộ (LAN) bất kể máy khách có dây hay không dây. Cả hai giao diện đều mang lưu lượng truy cập trên cùng một mạng con và giao tiếp ở Lớp 2 mà không cần bất kỳ quyết định định tuyến nào giữa chúng.
Một điểm khác biệt quan trọng: giao diện có dây như eth0 được chuyển trực tiếp sang cầu nối bằng một lệnh duy nhất (ip link set eth0 master br0) và mô-đun cầu nối của hạt nhân ngay lập tức bắt đầu học địa chỉ MAC từ các khung đến trên đó. Giao diện không dây (wlan0) không thể bị bắt làm nô lệ cho bridge theo cách này.
Giao thức 802.11 yêu cầu vòng đời liên kết và xác thực mà kết nối Ethernet tiêu chuẩn không đáp ứng được. Thay vào đó, Hostapd quản lý mối quan hệ này: bridge=br0 chỉ thị trong hostapd.conf hướng dẫn Hostapd đính kèm wlan0 vào cầu nối khi giao diện ở chế độ AP. Sau đó, các máy khách không dây liên kết với AP sẽ được hiển thị trên bridge như thể chúng đang ở trên một cổng có dây. Kết quả là có cùng một phân khúc L2 thống nhất, nhưng đường dẫn đến đó là khác nhau đối với các thành viên có dây và không dây.
Mỗi https://wireless.docs.kernel.org/en/latest/en/users/documentation/hostapd.html:
Hệ thống con mac80211 chuyển tất cả các khía cạnh của chế độ chính vào không gian người dùng. Nó phụ thuộc vào Hostapd để xử lý việc xác thực máy khách, cài đặt khóa mã hóa, thiết lập chính sách xoay vòng khóa và các khía cạnh khác của cơ sở hạ tầng không dây. Do đó, phương pháp phát hành cũ
iwconfig <wirelessinterface> mode masterkhông còn hoạt động
Trên cổng cầu Ethernet tiêu chuẩn, mọi thiết bị gửi khung đều được học MAC — không cần bắt tay trước ở L2. Trên AP 802.11, lớp MAC tự thực thi rằng máy khách phải hoàn thành xác thực và liên kết (Trạng thái 3) trước khi AP chấp nhận hoặc chuyển tiếp các khung dữ liệu của nó. MAC của AP (được quản lý bởi trình điều khiển thông qua mac80211) là người gác cổng và nó cần một daemon không gian người dùng (hostapd) để xử lý các trao đổi xác thực. Mô-đun cầu nối của hạt nhân không có kiến thức về trạng thái 802.11 — nó chỉ nhìn thấy các khung — nên nó không thể tự quản lý vòng đời này.
Gói bridge-utils cung cấp brctl để kiểm tra trạng thái cầu nối. Hạt nhân xử lý tất cả logic chuyển tiếp thông qua br_netfilter và mô-đun cầu nối.
Ngoài ra: cầu nối và chụp gói. Cổng cầu nối là nơi tuyệt vời để chèn chức năng chụp gói. Đính kèm giao diện thứ ba vào br0 và phản ánh lưu lượng truy cập tới thiết bị nhấn (để biết thêm về giao diện ảo nhấn/điều chỉnh, hãy xem tài liệu kernel tuntap) hoặc sử dụng một cầu nối độc lập có cổng được đặt ở chế độ hỗn tạp cung cấp daemon chụp như tcpdump hoặc Zeek. Bởi vì cầu nhìn thấy tất cả các khung trên phân đoạn trước bất kỳ quyết định định tuyến hoặc lọc nào nên việc chụp ở lớp này sẽ nhìn thấy bản dịch địa chỉ trước mạng hoàn chỉnh (NAT), hình ảnh lưu lượng trước tường lửa. Các công cụ như tcpdump -i br0 hoặc ổ cắm AF_PACKET được liên kết với giao diện cầu nối hoạt động ở tốc độ đường truyền cho hầu hết lưu lượng truy cập tại nhà và doanh nghiệp nhỏ. Những công cụ này đạt tốc độ tối đa trên nhân Linux mặc định ở khoảng 18 Gbps (ít nhất là khi tôi thử nghiệm chúng lần cuối, vào khoảng năm 2023). Tốc độ dòng cao hơn yêu cầu các công cụ có tính năng lọc dựa trên phần cứng như Bộ phát triển mặt phẳng dữ liệu (DPDK) hoặc Đường dẫn dữ liệu eXpress (XDP).
Thay đổi 3: Kích hoạt chính sách nftables: Cài đặt mã trên Móc
Bây giờ chúng ta đã có cầu nối, chúng ta cần xác định các quy tắc xử lý gói thông qua netfilter's nftables.
Netfilter là khung lọc gói cấp hạt nhân rộng hơn cung cấp các móc nối vào ngăn xếp mạng, trong khi nftables (thông qua nf_tables) là công cụ phân loại gói hiện đại hoạt động dựa trên các móc nối đó. Nó thay thế iptables làm giao diện ưa thích, nhưng cuối cùng cả hai đều dựa vào cùng một cơ sở hạ tầng netfilter hook trong kernel. Hạt nhân triển khai hệ thống con nf_tables trong nf_tables_api.c trong net/netfilter/.
Các quy tắc tường lửa và NAT trong /etc/nftables.conf là các đăng ký gọi lại. nftables gửi chúng đến kernel thông qua ổ cắm netlink và hệ thống con nf_tables sẽ cài đặt chúng tại các hook được chỉ định. Mỗi khai báo chuỗi đặt tên móc và mức độ ưu tiên một cách rõ ràng:
xích tiến {
loại móc lọc ưu tiên chuyển tiếp 0; giảm chính sách;
iifname "eth0" oifname "br0" ct state { đã thành lập, liên quan } chấp nhận phản đối
iifname "br0" oifname "eth0" ct state { mới, đã thành lập, có liên quan } chấp nhận truy cập
quầy tính tiền
Chuỗi này kiểm soát việc chuyển tiếp lưu lượng giữa các giao diện, lõi công việc của một bộ định tuyến. Sau đây là những gì đang diễn ra:
Định nghĩa chuỗi:
loại bộ lọc móc ưu tiên chuyển tiếp 0; bỏ chính sách;
Cái này gắn vào móc chuyển tiếp của netfilter, nghĩa là nó chỉ nhìn thấy các gói không dành cho chính bộ định tuyến mà cần phải đi qua bộ định tuyến đó. Chính sách mặc định là loại bỏ, vì vậy mọi thứ không được cho phép rõ ràng sẽ bị loại bỏ một cách âm thầm. Đây là chế độ từ chối theo mặc định.
Trong thiết lập WiFi AP này, eth0 là giao diện hướng tới mạng WAN — đường lên tới ISP hoặc bộ định tuyến ngược tuyến của bạn. br0 là cầu nối mạng LAN, tổng hợp lưu lượng truy cập từ các máy khách có dây (nếu có được gắn trực tiếp) và các máy khách không dây do Hostapd quản lý. Tất cả lưu lượng mạng LAN vào và ra thông qua br0, bất kể nó có nguồn gốc từ thiết bị có dây hay không dây. Với cấu trúc liên kết đó, hai quy tắc trong chuỗi FORWARD ánh xạ trực tiếp tới hai hướng của luồng lưu lượng truy cập trên bộ định tuyến.
Quy tắc 1: Mạng diện rộng (WAN) tới mạng LAN (chỉ lưu lượng truy cập trở lại):
iifname "eth0" oifname "br0" ct state { đã thành lập, liên quan } chấp nhận phản đối
Lưu lượng truy cập đến từ eth0 (phía WAN/internet) hướng tới br0 (cầu LAN) là chỉ được chấp nhận nếu conntrack (trạng thái ct) cho thấy kết nối đã được bắt đầu từ phía mạng LAN. Điều này có nghĩa là các kết nối đến không mong muốn từ internet sẽ bị chặn, chính xác là những gì bạn muốn từ bộ định tuyến/tường lửa NAT.
Quy tắc 2: LAN đến WAN (lưu lượng truy cập ra):
iifname "br0" oifname "eth0" ct state { new,thành lập,có liên quan } phản đối chấp nhận
Lưu lượng truy cập từ br0 hướng tới eth0 được chấp nhận cho các kết nối mới cũng như các kết nối hiện có. Điều này cho phép các máy khách LAN tự do bắt đầu kết nối với Internet.
Bộ đếm theo sau:
Đây là bộ đếm tổng hợp không có hành động; nó chỉ đếm các gói không khớp với quy tắc nào ở trên (và do đó sẽ bị chính sách loại bỏ). Điều này hữu ích trong việc theo dõi lượng lưu lượng truy cập bị từ chối.
Đây là mẫu tường lửa "trạng thái" cổ điển. Các thiết bị LAN có thể truy cập Internet một cách tự do, nhưng Internet không bao giờ có thể bắt đầu các kết nối bên trong. Trạng thái liên quan cũng cho phép những thứ như lỗi Giao thức thông báo điều khiển Internet (ICMP) và các kênh dữ liệu Giao thức truyền tệp (FTP) được liên kết với kết nối hiện có đi qua.
Khi nftables.service tải hoặc tải lại cấu hình, nó sẽ xóa bộ quy tắc hiện có và cài đặt bộ quy tắc mới một cách nguyên tử thông qua giao diện netlink. Không có gói nào nhìn thấy một phần quy tắc trong quá trình chuyển đổi. Tải lại bằng:
sudo systemctl tải lại nftables.service
Xác thực tệp cấu hình trước khi áp dụng:
sudo nft -c -f /etc/nftables.conf
Nếu bạn định tìm hiểu sâu về netfilter thì blog này thật nổi bật
Của chúng tôi thay đổi thứ ba là xác định quy tắc nf_tables để xử lý gói.
Thay đổi 4: Tường lửa trạng thái với conntrack
Các đoạn quy tắc ct state { đã thiết lập, liên quan và ct state { mới, đã thiết lập, liên quan tham chiếu conntrack, hệ thống con theo dõi kết nối của hạt nhân. Conntrack là thứ tạo nên hai quy tắc đơn giản đủ để xử lý tất cả lưu lượng truy cập hợp pháp. Hạt nhân triển khai lõi theo dõi kết nối trong nf_conntrack_core.c trong net/netfilter/.
Conntrack theo dõi lưu lượng truy cập khi nó đi qua netfilter và duy trì một bảng các luồng đang hoạt động. Mỗi mục lưu trữ địa chỉ nguồn và đích, cổng, giao thức và trạng thái kết nối hiện tại. Khi máy khách LAN mở kết nối Giao thức điều khiển truyền (TCP) tới máy chủ trên internet, conntrack sẽ tạo một mục nhập và đánh dấu luồng mới. Sau khi bắt tay ba chiều hoàn tất, conntrack sẽ đánh dấu nó được thiết lập. Trả lời các gói từ internet khớp với trạng thái ct được thiết lập trong chuỗi FORWARD và tự động chuyển qua.
Tường lửa cho phép các kết nối gửi đi từ br0 đến eth0 khi chúng mang trạng thái mới hoặc được thiết lập. Trả lại các gói đến trên eth0 khớp với đã thiết lập. Conntrack giữ sổ sách kế toán; các quy tắc tường lửa tham khảo bảng.
Trạng thái có liên quan bao gồm các luồng thứ cấp. Các giao thức như FTP mở kết nối điều khiển và sau đó đàm phán kết nối dữ liệu riêng trên một cổng khác. Thông báo lỗi ICMP liên kết với các luồng TCP hoặc Giao thức gói dữ liệu người dùng (UDP) hiện có. Conntrack hiểu các mối quan hệ này và đánh dấu các luồng thứ cấp tương ứng, do đó tường lửa chấp nhận chúng mà không có quy tắc rõ ràng cho mọi biến thể giao thức.
Thay đổi thứ tư của chúng tôi là mở rộng tính năng theo dõi kết nối mạng trong hệ thống con theo dõi kết nối của Kernel. Chúng tôi đã bắt đầu theo dõi các gói cho các hệ thống không chỉ máy chủ của chúng tôi.
Thay đổi 5: Xác định chính sách NAT và Masquerade: Viết lại địa chỉ ở biên giới
Mạng gia đình sử dụng Yêu cầu nhận xét (RFC) 1918 không gian địa chỉ riêng tư: 10.0.0.0/8, 172.16.0.0/12 và 192.168.0.0/16. Internet công cộng mang các tuyến đường đến không có phạm vi nào trong số này. Mọi gói rời khỏi mạng LAN cần thay thế địa chỉ nguồn bằng IP công cộng của bộ định tuyến trước khi thoát. Nếu không có sự thay thế đó, máy chủ ban đầu sẽ không bao giờ nhận được phản hồi từ Internet.
Chuỗi postrouting tại hook POSTROUTING thay thế địa chỉ nguồn riêng của mỗi gói gửi đi bằng địa chỉ công khai của bộ định tuyến:
định tuyến sau chuỗi {
gõ nat hook postrouting ưu tiên 100; chính sách chấp nhận;
bộ đếm oifname "eth0" lễ hóa trang
Thuật ngữ giả trang liên quan đến hành động cải trang bản thân. Bộ định tuyến giả vờ là người gửi ban đầu của một yêu cầu được kết nối với Internet, nhưng nó ghi nhớ nút nào trên mạng nội bộ đã thực hiện yêu cầu ban đầu. Tài nguyên trên internet phản hồi với bộ định tuyến như thể nó đang kết nối với người gửi ban đầu, nhưng bộ định tuyến sẽ sửa đổi gói và gửi nó đến người yêu cầu ban đầu. Bộ định tuyến hiển thị máy khách LAN với thế giới bên ngoài dưới một danh tính khác, IP WAN, che giấu địa chỉ riêng đằng sau địa chỉ công khai. Máy khách xuất hiện với máy chủ từ xa dưới dạng chính bộ định tuyến. Bộ định tuyến ẩn địa chỉ ban đầu của máy khách. Hạt nhân triển khai hành động giả trang trong nf_nat_masquerade.c trong net/netfilter/.
Conntrack lưu trữ bản dịch như một phần của mục nhập của mỗi luồng. Bộ dữ liệu (IP riêng, cổng riêng, IP công cộng, cổng công cộng, giao thức) tồn tại trong bảng conntrack trong suốt thời gian kết nối. Bạn có thể kiểm tra trực tiếp:
sudo conntrack -L
Mỗi dòng hiển thị các bộ dữ liệu gốc và bộ dữ liệu trả lời cho luồng trực tiếp, cùng với trạng thái kết nối và đếm ngược thời gian chờ. Các luồng không hoạt động đủ lâu sẽ bị lão hóa và conntrack sẽ xóa các mục nhập của chúng, một cơ chế chính để ngăn bảng NAT phát triển không giới hạn. Hết thời gian kết nối TCP sau khi phiên đóng hoặc sau một khoảng thời gian không hoạt động có thể định cấu hình. Các mục UDP sử dụng bộ tính giờ ngắn hơn vì UDP không mang tín hiệu đóng.
Hành động masquerade đọc địa chỉ IP hiện tại của eth0 tại thời điểm gói được xử lý, thay vì tại thời điểm định cấu hình. Điều này làm cho nó trở thành lựa chọn chính xác cho giao diện WAN lấy địa chỉ của nó thông qua Giao thức cấu hình máy chủ động (DHCP), trong đó IP công cộng có thể thay đổi mà không cần thông báo. Khi địa chỉ thay đổi, các kết nối mới sẽ tự động sử dụng địa chỉ mới. Conntrack giữ lại các mục nhập cho các kết nối đã thiết lập theo địa chỉ cũ cho đến khi chúng hết hạn.
Thay đổi thứ năm của chúng tôi là xác định các quy tắc sửa đổi địa chỉ người gửi và người nhận trong các gói được máy chủ xử lý.
Thay đổi 6: Bán DHCP và DNS bằng dnsmasq: Thông báo Bộ định tuyến cho khách hàng mới
Mỗi máy tính trên Internet cần biết ba điều hoạt động: địa chỉ IP, cổng truy cập Internet mặc định và máy chủ Hệ thống tên miền (DNS).
Bộ định tuyến phải tự giới thiệu với khách hàng trên mạng của họ. Máy khách mới đến mà không có địa chỉ IP, không có cổng mặc định và không có trình phân giải DNS. dnsmasq cung cấp các giá trị này cho khách hàng trên mạng của họ thông qua DHCP.
Khi một thiết bị tham gia mạng, thiết bị đó sẽ phát đi phát hiện DHCP. dnsmasq lắng nghe trên br0 và phản hồi bằng ưu đãi chứa địa chỉ IP, mặt nạ mạng con, thời hạn thuê và hai tùy chọn DHCP: tùy chọn 3 (cổng mặc định, 192.168.1.1) và tùy chọn 6 (máy chủ DNS, 192.168.1.1). Tùy chọn 3 cho khách hàng biết nơi gửi các gói đến các địa chỉ bên ngoài mạng con cục bộ. Tùy chọn 6 cho khách hàng biết trình phân giải nào cần truy vấn. dnsmasq lưu trữ cục bộ các phản hồi ngược dòng, giảm khối lượng truy vấn và tăng tốc độ tra cứu lặp lại.
dnsmasq liên kết với br0 nên nó chỉ phục vụ mạng LAN. Nó không bao giờ lắng nghe trên eth0.
NetworkManager thay thế: NetworkManager có thể xử lý cả chức năng máy chủ DHCP và DNS thông qua tích hợp dnsmasq tích hợp sẵn, được kích hoạt bằng cách cài đặt dns=dnsmasq trong /etc/NetworkManager/NetworkManager.conf. NetworkManager khởi chạy phiên bản dnsmasq của riêng nó và quản lý cấu hình của nó một cách linh hoạt khi các giao diện đến và đi.
Có sự cân bằng đáng kể cho mỗi phương pháp. Cách tiếp cận của NetworkManager giúp giảm cấu hình thủ công và tự động xử lý các sự kiện trong vòng đời giao diện. Điều này hữu ích trên máy tính xách tay hoặc máy có giao diện xuất hiện và biến mất. Trên một bộ định tuyến chuyên dụng, bạn thường muốn có quyền kiểm soát tốt hơn. Trình quản lý mạng có thể định cấu hình lại dnsmasq hoặc khởi động lại nó để phản hồi các sự kiện mạng, làm gián đoạn hợp đồng thuê DHCP theo những cách không thể đoán trước. Cấu hình dnsmasq tĩnh do systemd khởi chạy sẽ cung cấp cho bạn thứ tự khởi động xác định, liên kết rõ ràng và kiểm tra nhật ký đơn giản thông qua journalctl -eu dnsmasq.service. Bạn biết chính xác daemon được định cấu hình để làm gì vì bạn đã viết tệp cấu hình.
Từ góc độ hạt nhân, cả hai đường dẫn đều ở cùng một vị trí: quy trình không gian người dùng được liên kết với ổ cắm UDP trên cổng 67, phục vụ các yêu cầu DHCP đến trên giao diện cầu nối. Hạt nhân không phân biệt giữa hai cách sắp xếp. Sự khác biệt nằm ở cách khởi chạy, định cấu hình và giám sát daemon. Đây là sự cân bằng giữa quản lý dịch vụ và vận hành, không phải về mặt kiến trúc.
Thay đổi thứ sáu của chúng tôi là triển khai một daemon mới (dnsmasq) để cung cấp dịch vụ DHCP và DNS cho khách hàng trên (các) mạng của hệ thống.
Thay đổi 7: Mạng WiFi bán hàng tự động bằng máy chủ lưu trữ: Chuyển thẻ không dây sang Chế độ điểm truy cập (AP)
Giao diện không dây hoạt động ở một trong một số chế độ. Ở chế độ được quản lý, thẻ sẽ quét các điểm truy cập và liên kết với tư cách là khách hàng. Ở chế độ AP, thẻ phát tín hiệu, chấp nhận yêu cầu liên kết và quản lý toàn bộ vòng đời xác thực để kết nối các thiết bị.
Hệ thống con mac80211 của hạt nhân cung cấp giao diện lập trình thống nhất cho phần cứng 802.11 qua quá trình triển khai trình điều khiển khác nhau. hostapd giao tiếp với mac80211 thông qua nl80211 giao diện liên kết mạng, cùng một ổ cắm dựa trên giao diện kênh không gian người dùng kernel mà nftables sử dụng, được áp dụng ở đây cho hệ thống con không dây. Thông qua nl80211, hostapd ra lệnh cho trình điều khiển vào chế độ AP, đặt Mã nhận dạng bộ dịch vụ (SSID), kênh và Truy cập được bảo vệ Wi-Fi 2 (WPA2) tham số mã hóa và có quyền sở hữu các khung xác thực.
Chỉ thị bridge=br0 trong hostapd.conf gắn giao diện AP vào cầu làm cảng thành viên. Các máy khách không dây, sau khi được liên kết, sẽ nhập cùng phân khúc Lớp 2 với các máy khách có dây. Lưu lượng truy cập của chúng đến trên br0, nhân áp dụng cùng các quyết định về bộ lọc mạng và các gói di chuyển theo cùng một đường dẫn chuyển tiếp như mọi thứ khác trên mạng LAN.
Debian gửi hostapd được ẩn theo mặc định. Systemd đăng ký dịch vụ nhưng chặn nó khởi động. Việc chặn này ngăn một phiên bản chưa được định cấu hình khởi chạy và phát sóng một mạng mở. systemctl unmask Hostapd xóa khối đó, sau đó systemctl Enable --now Hostapd khởi động khối đó và đăng ký khối đó cho các lần khởi động sau này.
Thay đổi thứ bảy của chúng tôi là triển khai một daemon (hostapd) mới để bán mạng WiFi từ WiFi của thiết bị thẻ.
Kết quả: Bộ định tuyến WiFi!
Mỗi bước cấu hình sẽ kích hoạt một lớp khác nhau trong kiến trúc mạng của hạt nhân. Họ cùng nhau xây dựng một hệ thống chuyển tiếp hoàn chỉnh:
| Bước | Hạt nhân cơ chế | Lớp |
|---|---|---|
ip_forward=1 qua sysctl | bật ngăn xếp IPv4 Đường CHUYỂN TIẾP | L3 |
br0 cầu * | L2 | L2 * |
| nftables FORWARD chain | Móc bộ lọc mạng, gói chính sách | L3/L4 |
| conntrack | Kết nối có trạng thái bảng | L3/L4 |
| masquerade | Nguồn NAT tại POSTROUTING | L3 |
| dnsmasq DHCP | Cổng và DNS thông báo | Ứng dụng |
| hostapd qua nl80211 | Chế độ AP thông qua mac80211 | L2 không dây |
Lưu ý về hàng cầu: Thêm một Giao diện có dây tới br0 là hoạt động hạt nhân trực tiếp - mô-đun cầu nối ngay lập tức đảm nhận việc chuyển tiếp khung cho cổng đó. Việc thêm giao diện không dây là gián tiếp: chỉ thị bridge=br0 của Hostapd xử lý tệp đính kèm sau khi thẻ không dây chuyển sang chế độ AP và máy khách liên kết. Cả hai đều dẫn đến cùng một phân đoạn L2 logic, nhưng cơ chế khác nhau. Nếu bạn đang gỡ lỗi tư cách thành viên bridge, brctl show (hoặc ip link show masterbr0) sẽ hiển thị trực tiếp các thành viên có dây; máy khách không dây xuất hiện dưới dạng các mục MAC đã tìm hiểu trong bảng chuyển tiếp của cầu nối sau khi chúng liên kết. Bạn có thể kiểm tra bảng này bằng brctl showmacs br0.
Bắt đầu với máy Linux ở trạng thái mặc định: máy trạm nhận gói cho chính nó, không chuyển tiếp gì và giảm lưu lượng truy cập được gửi đến bất kỳ IP nào mà nó không sở hữu. Cổng chuyển tiếp IP của nó đã bị đóng. Chuỗi netfilter FORWARD của nó trống. Card không dây của nó lắng nghe các tín hiệu thay vì phát sóng chúng. Nó không có máy chủ DHCP, không có bảng NAT và không có cầu nối.
- Chuyển tiếp IP mở ra cánh cổng cho khả năng định tuyến.
- Cầu nối thu gọn giao diện có dây và không dây thành một miền có thể định địa chỉ duy nhất.
- Chính sách cài đặt chuỗi nftables ở hook FORWARD, quyết định cái gì được chuyển và cái nào bị loại bỏ.
- Conntrack cung cấp thông tin trạng thái vào các chính sách đó đưa ra quyết định, đưa ra các quy tắc đơn giản có hiệu quả đối với các kiểu giao thông phức tạp.
- Masquerade ẩn mạng LAN đằng sau danh tính công khai của bộ định tuyến và giữ một bảng dịch trong bộ nhớ.
- dnsmasq thông báo sự hiện diện của bộ định tuyến và cung cấp cho mọi khách hàng mới thông tin cần thiết để tiếp cận thế giới bên ngoài.
- hostapd chuyển đổi sóng vô tuyến ở chế độ máy khách thành quyền truy cập điểm.
Đây là những thay đổi biến hệ thống Linux thành bộ định tuyến WiFi. Bạn có thể đánh giá và kiểm tra chúng thông qua 6 lệnh:
cat /proc/sys/net/ipv4/ip_forwarddành cho trạng thái chuyển tiếp,- brctl hiển thị
dành cho tư cách thành viên bridge, - danh sách nft bộ quy tắc
dành cho chính sách tường lửa đang hoạt động, - conntrack -L cho các luồng trực tiếp và ánh xạ NAT,
- journalctl -eu dnsmasq.service dành cho hoạt động thuê DHCP,
iwdevcho giao diện không dây chế độ.
Tác giả: 0o_MrPatrick_o0