29 điểm bởi GN⁺ 22 ngày trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Tóm tắt quy trình từng bước để dựng một router hoàn chỉnh bằng máy tính thông thường hoặc mini PC
  • Cấu hình mạng có dây và không dây chỉ với các gói tối thiểu như hostapd, dnsmasq, bridge-utils trên môi trường Debian hoặc Alpine Linux
  • Chỉ cần 2 giao diện Ethernet là có thể biến desktop, laptop, SBC hay gần như bất kỳ thiết bị nào thành router
  • Triển khai các chức năng ngang tầm router thương mại thông qua cấu hình tường lửa (nftables), dịch vụ DHCP/DNSIP forwarding
  • Có thể xây dựng hạ tầng mạng ổn định và linh hoạt chỉ bằng phần cứng bỏ đi và phần mềm mã nguồn mở

Cách biến bất kỳ thiết bị nào thành router

  • Sau lệnh cấm nhập khẩu router tiêu dùng của chính phủ Mỹ, bài viết giới thiệu cách tự dựng router bằng phần cứng sẵn có
  • Dựa trên kinh nghiệm vận hành router ổn định suốt nhiều năm bằng mini PC chạy Linux, tác giả trình bày từng bước về cấu hình cần thiết và quy trình thiết lập
  • Về bản chất, router có cấu trúc giống hệt một máy tính thông thường, nên có thể triển khai bằng desktop, laptop, SBC và nhiều loại thiết bị khác
  • Thiết lập trên Debian hoặc Alpine Linux với số gói tối thiểu như hostapd, dnsmasq, bridge-utils
  • Mục tiêu không phải là phản ứng chính sách, mà là tái sử dụng phần cứng hiện có và nâng cao hiểu biết về mạng

Lựa chọn phần cứng

  • Mini PC làm mát thụ động là lý tưởng, nhưng chỉ cần 2 giao diện Ethernet thì gần như thiết bị nào cũng dùng được
    • Có thể bổ sung bằng USB-Ethernet dongle; độ tin cậy có thấp hơn đôi chút nhưng vẫn hoạt động tốt
  • Ví dụ, thiết bị Celeron 3205U dual-core (1.5GHz) có thể xử lý khoảng 820~850Mbps có dây và khoảng 300Mbps không dây
  • Trước đây tác giả từng ghép từ các linh kiện bỏ đi như ThinkPad T60, cầu nối ExpressCard-PCIe, switch Cisco 2960, router D-Link (chỉ dùng làm AP)
    • Hình thức có thể thô sơ nhưng vẫn hoạt động như một router hoàn chỉnh

Cấu hình mạng

  • Cấu hình giao diện
    • eth0: WAN
    • eth1: LAN (có dây)
    • wlan0: LAN (không dây)
  • LAN có dây và không dây được gộp bằng bridge để hoạt động như cùng một mạng
  • Nếu cần thêm cổng LAN, có thể gắn thêm USB-Ethernet dongle rồi nối vào bridge
  • Hệ điều hành là Debian Linux, các thành phần bắt buộc gồm
    • hostapd: tạo mạng Wi-Fi
    • dnsmasq: dịch vụ DNS và DHCP
    • bridge-utils: bridge các cổng

Cài đặt và cấu hình ban đầu

  • Thiết lập BIOS/UEFI
    • Tắt PXE network boot
    • Tắt quản lý điện năng cho USB/PCI
    • Bật tùy chọn “tự khởi động lại khi có nguồn AC”
    • Dùng HDMI dummy dongle để xử lý lỗi không khởi động khi không gắn màn hình
  • Một số phần cứng cần bật kho lưu trữ non-free-firmware
  • Cài firmware theo từng chipset không dây
    • Intel: firmware-iwlwifi
    • Realtek: firmware-ath9k-htc
    • Atheros đời cũ: firmware-atheros

Cài các gói cần thiết

  • Cài các tiện ích chính bằng lệnh sau
    sudo apt install bridge-utils hostapd dnsmasq
    
  • Toàn bộ gói của hệ thống vào khoảng 250 gói

Cố định tên giao diện mạng

  • Linux hiện đại dùng các tên kiểu enp0s31f6, nhưng có thể cố định về định dạng ethX truyền thống
  • Tạo file /etc/systemd/network/10-persistent-ethX.link
    [Match]
    MACAddress=AA:BB:CC:DD:00:11
    [Link]
    Name=ethX
    

Tạo mạng không dây

  • Cấu hình USB Wi-Fi dongle thành access point (AP)
  • Ví dụ /etc/hostapd/hostapd.conf
    interface=wlan0
    bridge=br0
    hw_mode=g
    channel=11
    ssid=My Cool and Creative Wi-Fi Name
    wpa_passphrase=mysecurepassword
    
  • Kích hoạt dịch vụ hostapd
    sudo systemctl unmask hostapd
    sudo systemctl enable --now hostapd
    

Cấu hình giao diện

  • Cấu hình /etc/network/interfaces
    allow-hotplug eth0
    allow-hotplug eth1
    auto wlan0
    auto br0
    iface eth0 inet dhcp
    iface br0 inet static
    bridge_ports eth1 wlan0
    address 192.168.1.1/24
    
  • Sau khi khởi động lại, kiểm tra trạng thái bridge bằng lệnh brctl show br0

Bật IP forwarding

  • Thêm vào file /etc/sysctl.d/10-forward.conf
    net.ipv4.ip_forward=1
    
  • Áp dụng
    sudo systemctl restart systemd-sysctl.service
    

Cấu hình tường lửa và NAT

  • Thiết lập dựa trên nftables (/etc/nftables.conf)
    • Chặn lưu lượng từ bên ngoài
    • Cho phép DNS, DHCP, SSH nội bộ
    • Thực hiện NAT
  • Kích hoạt dịch vụ
    sudo systemctl enable nftables.service
    

Cấu hình DHCP và DNS

  • Dùng dnsmasq (/etc/dnsmasq.conf)
    interface=br0
    dhcp-range=192.168.1.50,192.168.1.250,255.255.255.0,6h
    dhcp-option=option:router,192.168.1.1
    dhcp-option=option:dns-server,192.168.1.1
    cache-size=10000
    
  • Kích hoạt dịch vụ
    sudo systemctl enable dnsmasq
    

Quản lý cổng serial

  • Nếu thiết bị có cổng console serial, có thể quản lý mà không cần màn hình
  • Sửa /etc/default/grub
    GRUB_CMDLINE_LINUX='console=tty0 console=ttyS0,115200n8'
    GRUB_TERMINAL=serial
    GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
    
  • Chạy systemctl enable [email protected] rồi sudo update-grub

Kiểm tra hoạt động

  • Sau khi khởi động lại, dùng sudo nft list ruleset để kiểm tra trạng thái tường lửa
  • Dùng sudo nft -c -f /etc/nftables.conf để xác thực cấu hình
  • Có thể cập nhật rules không gián đoạn bằng sudo systemctl reload nftables.service
  • Kiểm tra log DHCP
    sudo less /var/lib/misc/dnsmasq.leases
    sudo journalctl -eu dnsmasq.service
    

Tính năng bổ sung

  • Có thể mở rộng với ghi log và phân tích lưu lượng, tách VLAN, hỗ trợ IPv6, VPN tunneling, định tuyến động (BGP, IGP)
  • Cũng có thể thêm giám sát dựa trên Prometheus, port forwarding cho DMZ, phát hiện và chặn xâm nhập
  • Tuy vậy, nên tránh cài quá nhiều phần mềm ngay trên router; tốt hơn là tách lưu lượng bằng DMZ hoặc VLAN

Kết luận

  • Chỉ với phần mềm miễn phí và phần cứng bỏ đi cũng có thể dựng một router hoàn chỉnh
  • Suy cho cùng, router cũng chỉ là một máy tính thông thường, và ai cũng có thể tự làm
  • Có thể tái sử dụng thiết bị không còn dùng đến để xây dựng hạ tầng mạng ổn định và linh hoạt

1 bình luận

 
Ý kiến trên Hacker News
  • Bài viết rất hay. Tôi muốn giới thiệu script create_ap mà tôi đã bảo trì suốt thời gian dài
    Có thể xem tại kho GitHub.
    Đây là một shell script có thể biến bất kỳ máy tính Linux nào thành router WiFi chỉ với một dòng lệnh.
    Về cơ bản, nó cấu hình card WiFi sang chế độ AP và tự động thiết lập WPA2/3, lọc MAC, cùng cả máy chủ DHCP/DNS.
    Hầu như không có phụ thuộc nào, cũng không cần NetworkManager.
    Tôi từng dùng nó với một mini PC Atom cũ làm gateway Internet cho gia đình, và cũng thường dùng để tạo mạng thử nghiệm cho reverse engineering thiết bị IoT
    Có thể xem ví dụ liên quan trong bài này

    • Tôi cũng tò mò không biết có ai đề xuất chipset WiFi nào cho hiệu năng ổn ở chế độ AP không
  • Nhiều bình luận nói kiểu “cứ dùng X đi”, nhưng điểm chính của bài này là cho thấy cấu hình tối thiểu của định tuyến và sự đơn giản của nó
    Nếu bạn từng dùng NAT trong Docker hay VM thì thực ra đã làm đúng việc đó rồi.
    Tính năng điểm phát WiFi trên Android rốt cuộc cũng dùng cùng các chức năng của nhân Linux.
    Có lẽ ngay cả tin nhắn này cũng đang được chuyển qua nhiều router phần mềm

    • Tôi cũng thấy tự tay dựng từ đầu thú vị hơn. Làm vậy mới có thể tự đánh giá xem nên tự triển khai hay dùng giải pháp có sẵn
      Tôi nghĩ đây là một nguyên tắc thiết kế phần mềm tốt
    • Thật ra bất kỳ máy tính nào, nếu muốn, cũng có thể trở thành router
      Internet Connection Sharing của Windows cuối cùng cũng chỉ là một ô tích để bật NAT
      Có vẻ việc gom tường lửa, switch, file server... vào một thiết bị rồi gọi chung là “router” khiến mọi người dễ nhầm lẫn
  • Bài này làm tôi nhớ lại chuyện cũ. Mục đích đầu tiên tôi dùng Linux là để biến một máy tính dư thành router
    Tôi cắm hai NIC ISA 3Com vào một chiếc Pentium 100MHz và cấu hình theo IP-Masquerading HOWTO.
    Sau đó tôi phát triển tiếp dựa trên sách Linux Firewalls của Robert Ziegler, rồi còn thêm cả bộ lọc spamcache Squid, tận dụng phần cứng lẽ ra bị vứt đi theo cách khá hữu ích

    • Tôi cũng đi con đường tương tự. Tôi từng chia sẻ đường truyền ISDN của tòa soạn báo bằng một máy tính, và từ đó dẫn tới việc xây dựng website
      Sau 27 năm, tôi vẫn hay bị gọi tới bởi những người hỏi “làm sao giải quyết rẻ tiền bằng Linux, dây thun và kẹp giấy
    • Ngày xưa tôi từng dùng một Pentium MMX 200MHz để dựng tạm cầu nối OpenBSD khi DSL ở nhà bố mẹ bị gián đoạn. Ngạc nhiên là nó vẫn đủ nhanh
    • Chỉ cần có switch hỗ trợ VLAN là định tuyến bằng một NIC cũng làm được
    • Trường hợp của tôi thì ngược lại, ban đầu tôi học Linux bằng cách flash firmware router với OpenWRT
    • Giờ cuốn đó đã 25 năm tuổi nên quá lỗi thời rồi. Cần có ai đó viết một cuốn sách mới về router Linux
      Tham khảo: Linux Routers - A Primer for Network Administrators
  • Tôi đã dùng OPNsense/pfSense trong thời gian dài và rất khuyến nghị
    Các tính năng như cập nhật tự động, sao lưu, đường hầm WireGuard, lọc gói dựa trên Suricata đều rất tốt
    Khi quản lý mạng cuối tuần, việc cấu hình qua giao diện web tiện hơn terminal nhiều
    Trang chính thức

    • Đồng ý, nhưng GUI thường không khớp với các khái niệm của Linux. Tôi từng dùng router Barracuda rồi cuối cùng vẫn phải gõ lệnh trực tiếp qua SSH để giải quyết vấn đề
      pfSense, OpenWRT, Barracuda, Verizon OEM... chức năng thì giống nhau nhưng cách biểu đạt lại mỗi nơi một kiểu
    • Giờ tôi không còn muốn quản lý mạng vào cuối tuần nữa. Giá mà có một bản phân phối router kiểu appliance hoàn chỉnh như TrueNAS thì tốt
    • Lý do tôi bỏ OPNsense là vì nó hạn chế những cấu hình tôi muốn làm.
      Tôi không thích sản phẩm có thái độ “thiết bị biết rõ hơn tôi”. Thiếu linh hoạt là yếu tố quyết định
    • Học bằng Linux thì tốt, nhưng router mà lỗi thì rất phiền
      Tôi từng định tuyến tới 300Mb/s bằng mini PC Atom, nhưng khi chuyển sang Internet gigabit thì đổi sang OPNsense chạy trên VM
      Việc passthrough riêng từng cổng cho VM bằng card Intel 4 cổng khá thú vị
  • Tôi đang dùng thiết bị router N100 + 10Gbit, nhưng có cảm giác độ trễ (latency) cao hơn so với router phần cứng chuyên dụng
    Chipset chuyên dụng xử lý gói mà không cần CPU can thiệp nên hiệu quả hơn nhiều.
    Tôi tò mò không biết có ai thực sự đo được khác biệt kiểu này chưa. Phần lớn chỉ test băng thông

    • Đúng vậy, Linux bridge không thể nhanh bằng ASIC switch chuyên dụng
      OpenWRT có hỗ trợ một số API switch phần cứng, nhưng gần như không có dưới dạng card PCIe
      CCR2004-1G-2XS-PCIe của Mikrotik là một ví dụ thú vị.
      Nó kết nối qua PCIe một bo mạch router hoàn chỉnh chạy RouterOS.
      Nếu bạn tận dụng được cổng 25Gbps thì rất đáng giá, còn không thì cũng không khác RB5009 là mấy
  • Nếu có switch quản lý được thì cấu hình router với một NIC cũng khả thi
    Chỉ cần đặt thành cổng trunk 802.1q là có thể dùng switch như một bộ mở rộng giao diện
    Nhà tôi đang dùng cấu hình kiểu “router-on-a-stick” như vậy.
    Kết hợp switch PoE với Aruba IAP cũ có thể dựng WiFi chất lượng cao hơn rất nhiều so với đồ tiêu dùng
    Trước đây tôi dùng Thinkpad làm router, còn giờ chuyển sang Dell Optiplex để làm router homelab vừa chạy thêm VM
    Alpine Linux rất hợp cho mục đích này

    • Tôi tò mò hiệu năng độ trễ của WiFi mesh có thể cải thiện tới mức nào. So với router tiêu dùng thì chênh lệch ra sao?
    • AP do ISP của tôi cung cấp cũng hỗ trợ WiFi gigabit. Chỉ có điều nó ép cấu hình DNS để phục vụ mục đích giám sát nên tôi muốn thay nó
      Nhưng để mua một AP có hiệu năng tương đương thì phải tốn khoảng 180 đô, khá tiếc
  • Tôi tò mò về lý do chính sách đằng sau việc cấm nhập khẩu router
    Phần lớn lưu lượng giờ đã được mã hóa bằng TLS rồi, nên tôi không hiểu vì sao vẫn bị xem là rủi ro
    Có phải vì botnet, DDoS, mật khẩu mặc định yếu, hoặc khả năng xâm nhập mạng nội bộ không?

    • Trong ngành bảo mật, chuyện này được gọi là APT (Advanced Persistent Threat).
      Các trường hợp như Volt Typhoon, Flax Typhoon vẫn đang hoạt động.
      Cấm thiết bị nước ngoài không giải quyết triệt để, nhưng vì bảo mật là một quy trình chứ không phải sản phẩm, nên kiểm soát chuỗi cung ứng là điều cần thiết
    • Tất cả những lý do bạn nêu đều đúng. Ngoài ra còn có rủi ro lớn là “khả năng tắt thiết bị từ xa
      Trước đây tôi từng làm Bot Mitigation ở Amazon và thấy lưu lượng phát sinh từ thiết bị tiêu dùng trên toàn thế giới.
      Chỉ với chưa tới một nửa số thiết bị đang hoạt động cũng đã tạo ra lượng lưu lượng ở mức gần như không thể chặn nổi
    • Thật ra nếu FCC thực sự lo về bảo mật thì họ đã áp dụng bắt buộc mật khẩu riêng cho từng thiết bị hoặc quy trách nhiệm cho nhà sản xuất không vá lỗi.
      Dù là Huawei hay Netgear thì nguồn gốc DDoS cũng như nhau
    • Có nhiều lý do
      Truy cập DNS/siêu dữ liệu lưu lượng, tấn công mạng nội bộ, DDoS, cắt Internet...
      Cuối cùng thì nó có thể bị lạm dụng như công cụ giám sát và kiểm soát
    • Về mặt kỹ thuật thì đúng. Dù TLS mã hóa, chỉ riêng siêu dữ liệu cũng đủ để giám sát đáng kể.
      Khả năng thiết bị nước ngoài có backdoor là một giả định hoàn toàn thực tế
  • Câu “cứ dùng OPNsense đi” là lời khuyên tốt trong môi trường vận hành, nhưng lại tệ nhất cho mục đích học tập
    Giá trị của bài này là cho thấy định tuyến hoạt động theo nguyên lý đơn giản đến mức nào

    • Thiết bị cấp SOHO không thực hiện định tuyến theo đúng nghĩa
  • Có một điểm bài viết không nhắc tới: khi dùng làm router, có thể giảm overhead bằng cách đặt trong /etc/sysctl.d/10_router.conf

    net.ipv4.ip_early_demux = 0  
    net.ipv4.tcp_early_demux = 0  
    net.ipv4.udp_early_demux = 0
    

    những cấu hình như vậy.
    Nó hiệu quả cho việc tinh chỉnh giảm độ trễ và jitter cho VoIP hoặc chơi game.
    Tôi cũng chỉnh gro_flush_timeout, sch_cake, napi_defer_hard_irqs...
    Mục tiêu là để người nhà cảm nhận được trải nghiệm chơi game tốt hơn

    • Tôi cũng tắt early_demux nhưng chưa từng test xem khác biệt thực tế thế nào.
      Với tôi thì chỉ fq_codel thôi cũng đã đủ ổn định trong môi trường 10Gbps
  • Còn tôi thì lại tò mò hơn về việc thay thế modem quang
    Thiết bị AT&T cấp cho tôi thường xuyên bị chậm và cũng đáng ngờ về mặt bảo mật.
    Không biết có hướng dẫn nào về cách tự thay bằng modem quang riêng không