Linux 環境下 ADSL PPPoE 撥號失敗,常見於伺服器、嵌入式裝置、無圖形介面系統。本文建立標準化排查流程,從軟體版本、介面綁定、網路參數、防火牆四個維度逐層定位。
# 檢查版本 (需 >= 3.10,現代發行版通常 3.14+)
pppd --version
pppoe --version
# 更新 (RHEL/Fedora)
dnf update rp-pppoe ppp
# Debian/Ubuntu
apt update && apt install ppp pppoeconf
# 確認服務狀態
systemctl status pppd-dns
systemctl status NetworkManager # 若由 NM 管理
ip link show dev eth0
# 輸出應含 UP,LOWER_UP, state UP
# 無 carrier 表示實體連線異常 (換線、換埠、檢查 MODEM 橋接模式)
# 停用 NetworkManager 管理該介面
nmcli dev set eth0 managed no
# 直接撥號測試 (前景模式,看完整日誌)
pppoe-start
# 或手動
pppd plugin rp-pppoe.so eth0 user "username" password "password" \
defaultroute replacedefaultroute persist maxfail 0 \
lcp-echo-interval 30 lcp-echo-failure 4 \
nodetach debug logfd 2
# 成功會建立 ppp0 介面
ip addr show dev ppp0
RHEL/Fedora (legacy network-scripts):
# /etc/sysconfig/network-scripts/ifcfg-ppp0
DEVICE=ppp0
TYPE=xDSL
ONBOOT=yes
USERCTL=no
BOOTPROTO=dialup
PEERDNS=yes
ETH=eth0
USER="username"
PAPNAME="username"
PASSWORD="password"
DEMAND=no
DEFROUTE=yes
Debian/Ubuntu (/etc/ppp/peers/provider):
plugin rp-pppoe.so
eth0
user "username"
password "password"
defaultroute
replacedefaultroute
persist
maxfail 0
lcp-echo-interval 30
lcp-echo-failure 4
noipdefault
usepeerdns
nodetach
NetworkManager (現代桌面/伺服器):
nmcli con add type pppoe con-name "ADSL" ifname eth0 \
username "username" password "password" \
pppd-options "persist,lcp-echo-interval=30,lcp-echo-failure=4"
nmcli con up "ADSL"
# 1. 確認 PPP 介面取得 IP
ip addr show ppp0
# 應有 inet xxx.xxx.xxx.xxx peer yyy.yyy.yyy.yyy/32
# 2. 確認預設路由指向 ppp0
ip route show default
# default dev ppp0 scope link
# 3. 測試連通性
ping -c 3 8.8.8.8 # 直接 IP 通 => L3 正常
ping -c 3 google.com # 域名通 => DNS 正常
# 4. DNS 故障排查
cat /etc/resolv.conf # 應含 nameserver 來自 PPPoE 協商
# 若為空或錯誤
# NetworkManager: 自動管理,勿手動編輯
# systemd-resolved: systemctl restart systemd-resolved
# 傳統: 確認 /etc/ppp/ip-up.d/ 含 dns 更新腳本
# firewalld (RHEL/Fedora/CentOS)
firewall-cmd --get-active-zones
firewall-cmd --zone=external --add-interface=ppp0 --permanent
firewall-cmd --zone=external --add-service=ssh --permanent
firewall-cmd --reload
# iptables 直接規則 (若不使用 firewalld)
iptables -A INPUT -i ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --dport 22 -j ACCEPT # SSH
iptables -A INPUT -i ppp0 -j DROP
# NAT (若此機為閘道)
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
# 移除預設路由 (避免非撥號流量觸發計費)
ip route del default dev ppp0
# 需要時手動加回
ip route add default dev ppp0
使用 iproute2 策略路由 + mwan3 (OpenWrt) 或 systemd-networkd 多路徑配置。
# /etc/ppp/ipv6-up
ip -6 route add ::/0 dev $1
# 確認 /etc/ppp/options.ipv6
+ipv6 ipv6cp-use-ipaddr
| 代碼/訊息 | 原因 | 對策 |
|---|---|---|
| LCP: timeout sending Config-Requests | 實體層不通 / MODEM 未橋接 / VLAN ID 錯誤 | 檢查線路、MODEM 設定、eth0.100 VLAN 子介面 |
| PAP/CHAP authentication failed | 帳號密碼錯誤、ISP 改用 CHAP | 確認帳號、嘗試 refuse-pap 或 require-chap |
| Peer refused to authenticate | 我方要求對方認證但對方拒絕 | 加 noauth 選項 |
| Could not determine remote IP | IPCP 協商失敗 | 加 noipdefault、確認 defaultroute |
| Script /etc/ppp/ip-up failed | 撥號後腳本錯誤 (常為 DNS 更新) | 檢查腳本權限與語法、暫停腳本測試 |
# systemd 服務單元 (自動重啟)
# /etc/systemd/system/pppoe@.service
[Unit]
Description=PPPoE on %I
After=network.target
[Service]
Type=simple
ExecStart=/usr/sbin/pppd plugin rp-pppoe.so %I user "username" password "password" persist maxfail 0 nodetach
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
# 啟用
systemctl enable --now pppoe@eth0
核心原則:實體層先行、協商日誌為證、路由 DNS 分層驗證、防火牆區域劃分、systemd 托管自愈。