Tin tức chung·Hacker News·0 lượt xem

Cách biến mọi thứ thành bộ định tuyến

How to turn anything into a router

AI Summary

Chính sách mới của chính phủ Mỹ về việc cấm nhập khẩu router Wi-Fi mới có thể đang thúc đẩy giới công nghệ tìm kiếm giải pháp DIY (tự làm) cho router. Các developer Việt hoàn toàn có thể tận dụng nhiều loại phần cứng tương thích với Linux, từ mini-PC cho đến laptop cũ, để biến chúng thành những router mạnh mẽ và đáng tin cậy. Điểm mấu chốt là router về bản chất chỉ là một chiếc máy tính. Với hệ điều hành Linux cùng các công cụ như `hostapd`, `dnsmasq` và `bridge-utils`, bạn hoàn toàn có thể xây dựng một thiết bị mạng ổn định và đầy đủ chức năng chỉ từ những linh kiện sẵn có, thậm chí là đồ bỏ đi.

Tôi không muốn đề cập nhiều đến “các sự kiện thời sự”, nhưng chính phủ Mỹ vừa tiết lộ một chính sách thực sự gây hoang mang, cấm nhập khẩu các mẫu bộ định tuyến dành cho người tiêu dùng mới một cách hiệu quả. Điều này thật nực cười vì nhiều lý do, nhưng nếu điều này thực sự xảy ra thì bạn có thể học cách “homebrew” một bộ định tuyến. May mắn thay, về cơ bản, bạn có thể tạo ra một bộ định tuyến từ bất cứ thứ gì giống với máy tính. Tôi đã sử dụng một máy tính mini chạy bằng linux làm bộ định tuyến của riêng mình trong nhiều năm và đã đăng một vài lần trước đây về cách tạo bộ định tuyến và tường lửa linux trong thời gian đó.

Tôi không muốn đưa tin nhiều về “các sự kiện thời sự”, nhưng chính phủ Mỹ vừa tiết lộ một thực sự gây hoang mang chính sách cấm nhập khẩu các mẫu bộ định tuyến tiêu dùng mới một cách hiệu quả. Điều này thật nực cười vì nhiều lý do, nhưng nếu điều này thực sự xảy ra thì bạn có thể tìm hiểu cách “homebrew” bộ định tuyến.

May mắn thay, về cơ bản, bạn có thể tạo ra bộ định tuyến từ bất kỳ thứ gì giống với máy tính.

Tôi đã sử dụng máy tính mini chạy bằng linux làm bộ định tuyến của riêng mình trong nhiều năm và đã đăng vài lần trước đây về cách tạo bộ định tuyếntường lửa cho linux vào thời điểm đó. Nó hoạt động rất ổn định và vấn đề duy nhất tôi gặp phải trong nhiều năm qua là ổ mSATA trị giá 20 USD bị hao mòn. Mặc dù tôi thường sử dụng Debian nhưng Alpine linux có lẽ cũng hoạt động tốt, có lẽ tốt hơn nếu bạn quen với nó. Miễn là thiết bị chạy Linux tốt và có một vài cổng USB, bạn sẽ ổn. Máy tính mini, máy tính để bàn, SBC, máy chủ rackmount, máy tính xách tay cũ hoặc thiết bị được thiết kế chuyên dụng đều sẽ hoạt động.

Nói rõ hơn, đây không phải là một “giải pháp” thực tế cho chính sách của Hoa Kỳ mà là để cho mọi người thấy một “hack” gọn gàng mà bạn có thể làm để khai thác thêm khả năng từ phần cứng mà bạn có thể đã sở hữu và để chứng minh rằng không có gì đặc biệt về bộ định tuyến - Suy cho cùng thì chúng cũng chỉ là máy tính.

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

Sở thích cá nhân của tôi là một chiếc PC mini chuyên dụng với thiết kế được làm mát thụ động.

bộ định tuyến thích hợp

Tuy nhiên, về cơ bản thì mọi thứ sẽ ổn. Nó phải có hai giao diện Ethernet, nhưng một dongle USB-Ethernet tiêu chuẩn cũng sẽ thực hiện được thủ thuật này. Nó sẽ không đáng tin cậy như giao diện tích hợp nhưng có lẽ sẽ đủ tốt. Ví dụ: đống phụ tùng lộn xộn này có thể dễ dàng đẩy tốc độ 820-850mbps trên mạng LAN có dây và ~300 mbps trên mạng không dây:

bộ định tuyến crappy

Thiết bị cụ thể này là lõi kép Celeron 3205U chạy ở tốc độ 1,5 GHz cực nhanh. Ngay cả con chip sởi đó cũng có khả năng định tuyến lưu lượng truy cập cho toàn bộ ngôi nhà hoặc doanh nghiệp nhỏ.

Quay lại xa hơn, đây là thiết lập của tôi trong vài tuần đầu tiên của học kỳ mùa thu năm 2016:

bộ định tuyến thùng rác

Có thể khó để biết điều gì đang xảy ra ở đây bằng cách nhìn, vì vậy hãy để tôi chia nhỏ:

  • Một chiếc ThinkPad T60, thứ rác rưởi được nhặt từ công việc trước đây của tôi
  • Cầu nối ExpressCard-PCIe trong khoang mở rộng của ThinkPad
  • Thẻ Ethernet không tên được chọn trong thùng rác trong khe cắm PCIe, thiếu khung gắn
  • Một bộ chuyển mạch Cisco 2960 100 mbit cổ, được mua với giá 10 USD từ trường đại học của tôi
  • Bộ định tuyến D-Link hoạt động như một điểm truy cập (“tìm cửa hàng tiết kiệm” có cổng WAN kém)

Vâng, đây thực sự là một bộ định tuyến! Bởi vì nó có thể trông giống như một đống rác, nhưng nó là rác hoàn toàn có khả năng thực hiện công việc mà tôi giao cho nó!

Nó được định cấu hình như thế nào?

Khi thiết lập, hệ thống sẽ có cấu hình như sau:

<đầu> Giao diện Mạng eth0 WAN eth1 LAN (Có dây) wlan0 Mạng LAN (Không dây)

Cả hai giao diện LAN sẽ được kết nối với nhau, nghĩa là các thiết bị trên mạng có dây và không dây sẽ có thể giao tiếp bình thường. Nếu một cổng LAN không đủ, bạn có thể cắm bao nhiêu khóa USB Ethernet tùy thích và kết nối tất cả chúng lại với nhau. Nó sẽ không nhanh bằng một switch “thực sự”, nhưng nếu bạn đang tìm kiếm hiệu suất thì hôm nay bạn có thể đã đến nhầm chỗ.

Như đã đề cập trước đó, phiên bản này sẽ chạy Debian làm hệ điều hành và sử dụng rất ít phần không đi kèm với bản cài đặt cơ bản:

  • Mọi đốm màu chương trình cơ sở không có trong cài đặt mặc định
  • hostapd - Để tạo mạng Wi-Fi
  • dnsmasq - Dành cho DNS & DHCP
  • bridge-utils - Để kết hợp các cổng vào một mạng chung

Ngoài ra, tôi cũng nên đề cập rằng tôi sẽ chỉ thiết lập IPv4 tại đây. IPv6 hoạt động rất tốt cho những thứ như thiết bị di động, nhưng tôi vẫn thấy nó quá khó chịu trong mạng LAN. Có lẽ não tôi đã bị vôi hóa quá nhiều rồi, nhưng hiện tại tôi vẫn vui vẻ sử dụng IPv4.

Cài đặt và thiết lập

Nhìn chung, đây là một bản cài đặt Debian khá chuẩn. Một vài điều tôi nên đề cập:

  • Tắt khả năng khởi động qua mạng PXE trong thiết lập BIOS/UEFI.
  • Nếu có thể, hãy đặt thiết bị ở tốc độ xung nhịp thấp nhất nhưng tắt mọi quản lý nguồn điện cho thiết bị USB hoặc PCI.
  • Tìm tùy chọn như “Khôi phục sau khi mất nguồn AC” và BẬT tùy chọn này.
  • Một số thiết bị sẽ không bật nguồn đúng cách nếu không có màn hình nào được kết nối. Nếu thiết bị của bạn gặp tình trạng như vậy, hãy cắm một "khóa điện tử giả" vào cổng HDMI.
  • Rất nhiều phần cứng sẽ chỉ hoạt động chính xác khi bật kho lưu trữ không có chương trình cơ sở miễn phí

Tùy thuộc vào phần cứng không dây của bạn, bạn có thể cần cài đặt gói chương trình cơ sở bổ sung.

Đối với thiết bị Intel:

sudo apt cài đặt firmware-iwlwifi

Đối với thiết bị Realtek:

sudo apt cài đặt firmware-ath9k-htc

Hoặc nếu bạn có thứ gì đó thực sự cổ xưa như tôi:

sudo apt cài đặt firmware-atheros

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

Sau khi cài đặt ban đầu xong, có một số tiện ích bổ sung cần cài đặt:

sudo apt cài đặt bridge-utils hostingapd dnsmasq

Về mặt phần mềm, đó là tất cả những gì cần thiết. Tổng cộng sẽ có khoảng 250 gói trên hệ thống.

Đặt tên chính xác cho các giao diện

Trong các hệ thống Linux hiện đại, tên giao diện mạng được đặt tên dựa trên kết nối vật lý và loại trình điều khiển, như enp0s31f6. Tôi thấy định dạng cũ như ethX đơn giản hơn nhiều nên mỗi giao diện đều có một tên cố định.

Đối với mỗi giao diện mạng, hãy tạo một tệp tại /etc/systemd/network/10-persistent-ethX.link

[Trận đấu]
Địa chỉ MAC=AA:BB:CC:DD:00:11
[Liên kết]
Tên=ethX

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

Thiết bị này sử dụng khóa USB Wi-Fi để hoạt động như một điểm truy cập, tạo mạng cho các thiết bị khác tham gia. Điều này sẽ không hoạt động tốt như một thiết bị được thiết kế có mục đích, nhưng có còn hơn không. Tôi đã đạt được kết quả khá tốt với việc này, nhưng tôi cũng sống trong một tòa nhà rất nhỏ, nơi tôi hiếm khi cách xa bộ định tuyến quá 10m. Nếu bạn phụ thuộc nhiều vào mạng không dây của mình hoạt động bình thường, hãy thử tìm một thiết bị điểm truy cập chuyên dụng. Một bộ định tuyến cũ, thậm chí từ hơn một thập kỷ trước, có thể sẽ hoạt động tốt cho việc này chỉ bằng cách kết nối với cổng LAN của nó (không phải cổng WAN!).

Để thiết lập mạng wi-fi tích hợp, hãy tạo tệp cấu hình tại /etc/hostapd/hostapd.conf

giao diện=wlan0 cầu=br0 hw_mode=g kênh=11 ieee80211d=1 country_code=US ieee80211n=1 wmm_enabled=1 ssid=Tên Wi-Fi thú vị và sáng tạo của tôi auth_algs=1 wpa=2 wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP wpa_passphrase=mật khẩu an toàn của tôi

Theo mặc định, dịch vụ hostapd không thể khởi động được, vì vậy chúng tôi vạch mặt nó trước khi kích hoạt dịch vụ.

sudo systemctl vạch mặt Hostapd
sudo systemctl kích hoạt --now Hostapd

Định cấu hình giao diện

Giao diện “bên ngoài” sẽ là mạng WAN và “bên trong” sẽ là mạng LAN. Lưu ý rằng giao diện LAN không có cổng mặc định.

/etc/mạng/giao diện

cho phép-hotplug eth0
cho phép hotplug eth1
tự động wlan0
tự động br0
iface eth0 inet dhcp
iface br0 inet tĩnh
    bridge_ports eth1 wlan0
    địa chỉ 192.168.1.1/24

Sau bước này, thiết bị sẽ được khởi động lại nhanh chóng. Nó sẽ hoạt động trở lại bình thường. Nếu nó không xác nhận rằng các bước trước đó đã được thực hiện chính xác thì hãy kiểm tra lỗi bằng cách chạy journalctl -e -u Network.service

Nếu tất cả đều hoạt động chính xác thì đầu ra của lệnh này sẽ giống nhau:

$ sudo brctl hiển thị br0 tên cầu nối id cầu giao diện hỗ trợ STP br0 8000.xxxxx không eth1 wlan0

Chuyển tiếp IP

Tạo /etc/sysctl.d/10-forward.conf và thêm dòng này để bật chuyển tiếp IP:

net.ipv4.ip_forward=1

Áp dụng các thay đổi:

sudo systemctl khởi động lại systemd-sysctl.service

Quy tắc tường lửa

Các quy tắc tường lửa và cấu hình NAT đều được xử lý bởi hệ thống netfilter mới trong Linux. Chúng tôi quản lý việc này bằng nftables.

/etc/nftables.conf

#!/usr/sbin/nft -f
bộ quy tắc tuôn ra
bộ lọc bảng inet {
    đầu vào chuỗi {
        loại móc lọc ưu tiên đầu vào 0; giảm chính sách;
        trạng thái ct { đã thành lập, có liên quan } chấp nhận phản đối
        giao thức ip bộ đếm icmp chấp nhận
        iifname "br0" tcp dport { 22, 53 } chấp nhận bộ đếm
        iifname "br0" udp dport { 53, 67, 68 } chấp nhận bộ đếm quầy tính tiền
    }
    chuỗi về phía trước {
        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
    }
    đầu ra chuỗi {
        loại móc lọc ưu tiên đầu ra 0; chính sách chấp nhận;
        quầy tính tiền
    }
}
bảng ip nat {
    định tuyến sau chuỗi {
        gõ tự nhiên hook postrouting ưu tiên 100; chính sách chấp nhận;
        giả trang truy cập oifname "eth0"
    }
}

Điều này thực hiện NAT, từ chối tất cả lưu lượng truy cập vào từ bên ngoài mạng và cho phép thiết bị bộ định tuyến hoạt động như một máy chủ DNS, DHCP và SSH (để quản lý). Khá giống một cấu hình tường lửa tiêu chuẩn không có thật.

Bật tính năng này cho lần khởi động tiếp theo:

sudo systemctl kích hoạt nftables.service

DHCP và DNS

Không giống như các thiết bị trước đây của tôi, thiết bị này sẽ sử dụng dnsmasq thay vì isc-dhcp-serverbind9. Nó nhỏ hơn, dễ cấu hình hơn và hoạt động tốt cho mục đích của một thiết bị nhỏ như thế này. Tệp cấu hình cực kỳ đơn giản và bạn không thể tranh cãi về điều đó!

/etc/dnsmasq.conf

giao diện=br0
địa chỉ nghe=0.0.0.0
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
kích thước bộ đệm = 10000

Dịch vụ có thể được kích hoạt cho lần khởi động tiếp theo.

sudo systemctl kích hoạt dnsmasq

Phần thưởng: Cổng nối tiếp

Nếu thiết bị của bạn có cổng nối tiếp hoặc cổng bảng điều khiển tích hợp thì đó là một cách cực kỳ tiện lợi để quản lý bộ định tuyến mà không cần phải tìm màn hình và bàn phím để cắm vào. Điều này cực kỳ phổ biến trong không gian mạng doanh nghiệp, nhưng không có lý do gì một thiết bị gia đình lại không có khả năng tương tự!

Sửa đổi /etc/default/grub

GRUB_CMDLINE_LINUX='console=tty0 console=ttyS0,115200n8'
GRUB_TERMINAL=nối tiếp
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

Sau đó kích hoạt dịch vụ Getty để chạy trên cổng:

sudo systemctl kích hoạt [email được bảo vệ]

Cập nhật cấu hình bộ nạp khởi động grub và khởi động lại hộp.

sudo cập nhật-grub

Kiểm tra xem nó hoạt động như thế nào

Sau khi đã định cấu hình xong, hãy khởi động lại thiết bị vài lần để đảm bảo mọi thứ sẽ hoạt động ổn định.

Có thể kiểm tra trạng thái của tường lửa để đảm bảo lưu lượng truy cập đang di chuyển qua mạng:

$ bộ quy tắc danh sách sudo nft
bộ lọc bảng inet {
	đầu vào chuỗi {
		loại bộ lọc móc lọc ưu tiên đầu vào; giảm chính sách;
		trạng thái ct { đã thiết lập, có liên quan } gói truy cập 1546 byte 138508 chấp nhận
		giao thức ip bộ đếm icmp gói 1 byte 84 chấp nhận
		iifname "br0" tcp dport { 22, 53 } gói truy cập 4 byte 240 chấp nhận
		iifname "br0" udp dport { 53, 67, 68 } gói truy cập 92 byte 6658 chấp nhận
		gói truy cập 2110 byte 128536
	}
	chuỗi về phía trước {
		loại bộ lọc móc ưu tiên bộ lọc chuyển tiếp; giảm chính sách;
		iifname "eth0" oifname "br0" trạng thái ct { đã thiết lập, có liên quan } gói truy cập 52964 byte 479878687 chấp nhận
		iifname "br0" oifname "eth0" ct state { đã thiết lập, liên quan, mới } gói truy cập 78017 byte 54802223 chấp nhận
		gói truy cập 0 byte 0
	}
	đầu ra chuỗi {
		loại bộ lọc móc lọc ưu tiên đầu ra; chính sách chấp nhận;
		gói truy cập 1650 byte 155966
	}
}
bảng ip nat {
	định tuyến sau chuỗi {
		gõ nat hook postrouting ưu tiên srcnat; chính sách chấp nhận;
		gói truy cập oifname "eth0" 101 byte 15882 giả trang
	}
}

Trước khi thực hiện bất kỳ thay đổi nào đối với cấu hình tường lửa, hãy đảm bảo xác thực tệp cấu hình:

sudo nft -c -f /etc/nftables.conf

Một lợi thế thú vị của nftables so với iptables cũ là khả năng tải lại dịch vụ để cập nhật bộ quy tắc mà không bị gián đoạn:

sudo systemctl tải lại nftables.service

Có thể kiểm tra máy chủ DHCP bằng cách xem nhật ký của nó và kiểm tra tệp thuê:

sudo less /var/lib/misc/dnsmasq.leases
sudo tạp chí -eu dnsmasq.service

Nó có thể làm được nhiều việc hơn

Tại thời điểm này, thiết bị sẽ hoạt động khá hoàn hảo. Nếu muốn, có thêm một số tính năng có thể được định cấu hình hoặc thêm bằng các gói bổ sung:

Vẻ đẹp của những thứ như thế này là sự đơn giản và đáng tin cậy. Mặc dù điều này có vẻ hấp dẫn nhưng tôi thực sự khuyên bạn nên không cài đặt nhiều phần mềm ngay trên bộ định tuyến mà thay vào đó hãy chuyển tiếp lưu lượng truy cập đến một thiết bị trong DMZ hoặc VLAN.

Chúng tôi có khả năng biến mọi thứ thành bộ định tuyến. Hãy thử nó! Hãy tìm một đống rác thải điện tử, tìm một số thứ có thể hoạt động được và xây dựng bộ định tuyến mới dựa trên phần mềm miễn phí!

Tác giả: yabones

#discussion