Chúng Ta Đang Thực Sự Xây Dựng Gì
Công việc với PPPoE server nằm ở một tầng mà hầu hết sysadmin chưa bao giờ đụng đến: xử lý session negotiation, quản lý IP pool, và xác thực từng người dùng ở tầng protocol. Đây chính là lõi vận hành của hạ tầng ISP thực sự. Nếu bạn đang dựng một ISP nhỏ, mạng campus, hay lab mô phỏng môi trường carrier-grade — đây là loại công việc bạn cần làm.
Tôi đã deploy cái này lên production: accel-ppp với local auth trên một mạng được quản lý, chạy 150 PPPoE session đồng thời. Hệ thống chạy ổn định hơn một năm mà không cần can thiệp lớn. Khi tôi sau đó thêm RADIUS để quản lý người dùng tập trung, quá trình chuyển đổi chỉ mất chưa đến một buổi chiều và không làm gián đoạn các session đang chạy.
So Sánh Các Phương Án
Ba công cụ chủ yếu được dùng để chạy PPPoE trên Linux. Lựa chọn nào phù hợp phụ thuộc vào số lượng session và mức độ phức tạp vận hành bạn chấp nhận.
Phương án 1: rp-pppoe (PPPoE Server Cổ điển)
rp-pppoe là PPPoE server userspace nguyên bản, bọc bên ngoài daemon pppd của Linux. Mỗi session tạo ra một process pppd riêng — ổn với vài người dùng, nhưng mô hình này sụp đổ nhanh khi tải tăng cao. Cấu hình nằm rải rác ở /etc/ppp/options, chap-secrets, và các flag khởi động pppoe-server. Xác thực thực hiện qua PAP/CHAP local hoặc qua RADIUS. Debug là phải theo dõi log của nhiều process cùng lúc.
Phương án 2: accel-ppp
accel-ppp là một máy chủ truy cập đa giao thức được tăng tốc ở kernel. Một daemon duy nhất xử lý PPPoE, L2TP, và PPTP thông qua một file cấu hình thống nhất. Session chạy trong kernel space, nên throughput có thể mở rộng vượt xa so với mô hình per-process của rp-pppoe. Hỗ trợ RADIUS tích hợp sẵn, CLI quản lý qua TCP, cấu hình IP pool, và rate limiting per-session đều có sẵn. Với bất kỳ triển khai nào vượt ra ngoài môi trường test lab, đây là công cụ phù hợp.
Phương án 3: RouterOS VM
Một số team chạy Mikrotik RouterOS dưới dạng VM thuần túy để làm PPPoE concentrator. Nếu team đã quen với RouterOS, đường cong học tập sẽ ngắn hơn. Nhưng bạn đang phải duy trì một OS riêng biệt hoàn chỉnh chỉ để xử lý PPPoE — cộng thêm chi phí bản quyền. Trên stack Linux thuần, accel-ppp làm công việc tương tự một cách tự nhiên với overhead thấp hơn nhiều.
Ưu và Nhược Điểm
rp-pppoe
- Ưu điểm: Cài đặt đơn giản, tài liệu phong phú, hoạt động với
pppdmặc định, tốt để học giao thức - Nhược điểm: Một process OS cho mỗi session (tốn nhiều CPU khi tải cao), cấu hình phân tán nhiều file, khó quản lý session trực tiếp, bắt đầu gặp vấn đề ở khoảng 100 session đồng thời
accel-ppp
- Ưu điểm: Tăng tốc kernel, daemon duy nhất, RADIUS client tích hợp, mở rộng đến hàng nghìn session, quản lý session trực tiếp qua CLI, rate limiting (shaper) tích hợp sẵn
- Nhược điểm: Cần biên dịch từ source trên hầu hết các distro, phụ thuộc kernel module, tài liệu ít hơn rp-pppoe
RouterOS VM
- Ưu điểm: Quản lý bằng GUI, quen thuộc với engineer có background Mikrotik
- Nhược điểm: Chi phí bản quyền, overhead tài nguyên cho VM đầy đủ, không tích hợp tự nhiên với hệ thống Linux
Cài Đặt Được Khuyến Nghị
Dùng accel-ppp cho bất kỳ triển khai nào ngoài môi trường test nhỏ. Chỉ riêng việc xử lý session ở tầng kernel đã đủ để bù đắp cho quá trình build phức tạp hơn một chút. Bắt đầu với chap-secrets local để xác thực, sau đó chuyển sang FreeRADIUS khi cần quản lý người dùng tập trung hoặc áp dụng gói dịch vụ per-user.
Stack được khuyến nghị:
- accel-ppp làm PPPoE concentrator
- Local auth (
/etc/ppp/chap-secrets) cho môi trường dev và triển khai nhỏ - FreeRADIUS cho production với nhiều người dùng và gói dịch vụ
- iptables MASQUERADE cho NAT ra uplink
- systemd service để tự khởi động và khởi động lại khi lỗi
Hướng Dẫn Triển Khai
Bước 1: Build và Cài Đặt accel-ppp
accel-ppp không có trong repo của hầu hết các distro, nên bạn cần biên dịch từ source:
# Cài đặt các gói phụ thuộc để build (Ubuntu/Debian)
sudo apt update && sudo apt install -y cmake libpcre3-dev libssl-dev \
libevent-dev libcurl4-openssl-dev git build-essential
git clone https://github.com/accel-ppp/accel-ppp.git
cd accel-ppp
mkdir build && cd build
cmake -DKDIR=/usr/src/linux-headers-$(uname -r) \
-DCMAKE_INSTALL_PREFIX=/usr \
-DRADIUS=TRUE \
..
make -j$(nproc)
sudo make install
Tải kernel module và giữ nó qua các lần khởi động lại:
sudo modprobe pppoe
echo "pppoe" | sudo tee -a /etc/modules
Bước 2: Cấu Hình accel-ppp
Tất cả cấu hình nằm trong /etc/accel-ppp.conf. Đây là cấu hình cơ bản hoạt động được:
[core]
thread-count=4
log-error=/var/log/accel-ppp/core.log
[modules]
log_file
pppoe
auth_mschap_v2
auth_chap_md5
auth_pap
ippool
shaper
[log]
log-file=/var/log/accel-ppp/accel-ppp.log
log-emerg=/var/log/accel-ppp/emerg.log
copy=1
[pppoe]
interface=eth1 # Interface phía client (mạng access)
ac-name=MyISP
service-name=internet
verbose=1
[dns]
dns1=8.8.8.8
dns2=1.1.1.1
[ip-pool]
gw-ip-address=10.10.0.1 # IP gán cho phía server của mỗi session
10.10.1.0/24 # IP pool cho client
10.10.2.0/24
[ppp]
mtu=1492
mru=1492
ccp=0
min-mtu=1280
unit-priv=1
[auth]
chap-secrets=/etc/ppp/chap-secrets
[cli]
verbose=1
mode=tcp
port=2000
timeout=0
sudo mkdir -p /var/log/accel-ppp
sudo chown nobody:nogroup /var/log/accel-ppp
Bước 3: Thêm Người Dùng cho Xác Thực Local
chap-secrets dùng định dạng pppd chuẩn. Cột thứ tư ghim một IP cụ thể cho người dùng, hoặc dùng * để gán từ pool:
# /etc/ppp/chap-secrets
# client server secret Địa chỉ IP
user1 * password123 *
user2 * securepass *
admin * adminpass 10.10.1.10 # IP cố định
File này chứa thông tin xác thực dạng plaintext — cần phân quyền chặt chẽ:
sudo chmod 600 /etc/ppp/chap-secrets
sudo chown root:root /etc/ppp/chap-secrets
Bước 4: Kích Hoạt IP Forwarding và NAT
Client PPPoE route tất cả traffic qua server của bạn, nên phải bật forwarding. Thay eth0 bằng interface uplink của bạn:
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
# NAT để truy cập internet
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Clamp MSS để tránh lỗi MTU với file lớn
sudo iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
# Lưu rules để giữ qua reboot
sudo apt install iptables-persistent
sudo netfilter-persistent save
Bước 5: Tạo systemd Service và Khởi Động
cat <<EOF | sudo tee /etc/systemd/system/accel-ppp.service
[Unit]
Description=Máy chủ truy cập accel-ppp
After=network.target
[Service]
ExecStart=/usr/sbin/accel-pppd -c /etc/accel-ppp.conf
Restart=on-failure
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now accel-ppp
sudo systemctl status accel-ppp
Bước 6: Kiểm Tra Kết Nối Client
Từ một máy Linux trên cùng phân đoạn Layer 2 với eth1:
sudo apt install pppoe
# Cấu hình kết nối PPPoE client
sudo pppd plugin rp-pppoe eth0 \
user "user1" \
password "password123" \
noauth defaultroute usepeerdns persist
# Xác nhận interface PPP đã lên
ip addr show ppp0
ip route show
Sau đó quay lại server và xác nhận session đã được đăng ký:
sudo accel-cmd show sessions
# Session đang hoạt động, IP được gán, tên người dùng, bytes vào/ra
Chuyển Sang FreeRADIUS cho Production
Local auth hoạt động tốt với quy mô nhỏ. Khi số người dùng tăng, hãy chuyển sang FreeRADIUS: cài đặt nó, định nghĩa người dùng, rồi cập nhật [modules] và thêm block [radius] vào accel-ppp.conf:
[modules]
log_file
pppoe
radius
ippool
shaper
[radius]
server=127.0.0.1,secret=your_radius_secret,auth-port=1812,acct-port=1813
dae-server=127.0.0.1:3799,secret=your_radius_secret
timeout=3
max-try=3
acct-timeout=120
verbose=1
Xóa bỏ hoàn toàn block [auth] local. FreeRADIUS sẽ xử lý toàn bộ xác thực từ đó. Để giới hạn băng thông per-user, đẩy WISPr-Bandwidth-Max-Up và WISPr-Bandwidth-Max-Down làm RADIUS attribute — cơ chế tương tự mà các ISP thương mại dùng để áp dụng gói tốc độ cho thuê bao.
Quản Lý Session Đang Hoạt Động
Không cần khởi động lại để quản lý session. accel-ppp đi kèm một CLI qua TCP cho phép bạn kiểm soát trực tiếp mọi kết nối đang hoạt động:
# Kết nối đến giao diện quản lý
sudo accel-cmd
# Các lệnh hữu ích trong CLI:
show sessions
show sessions username user1
show stat
terminate username user1
terminate ip 10.10.1.15
Những Cạm Bẫy Thường Gặp
Một vài điều từ kinh nghiệm triển khai của tôi mà bạn nên biết trước khi đưa vào hoạt động:
- MTU mismatch gây lỗi âm thầm: PPPoE thêm 8 byte overhead, giảm MTU hiệu dụng từ 1500 xuống 1492. Packet nhỏ hoạt động bình thường. Transfer file lớn bị đình trệ hoặc thất bại hoàn toàn. Lệnh clamp MSS ở Bước 4 xử lý hầu hết trường hợp — cũng nên đặt MTU interface client là 1492 một cách tường minh.
- Thiếu kernel module: Nếu session không thể thiết lập được, chạy
lsmod | grep pppoe. Một số kernel còn cần tải thủ côngppp_genericvàppp_async. - Interface sai phân đoạn mạng: Cài đặt
pppoe interface=phải nằm trên cùng broadcast domain Layer 2 với client. Client trên VLAN? Tạo VLAN subinterface trước (eth1.100, v.v.) rồi trỏ accel-ppp vào đó thay vì interface vật lý trực tiếp. - Giới hạn file descriptor khi tải cao: Mỗi session tiêu thụ file descriptor.
LimitNOFILE=65535trong systemd unit xử lý điều này tự động. Chạy daemon thủ công? Đặtulimit -n 65535trong shell trước khi khởi động.

