SuSELinux上部署pppoe-server服務,rp-pppoe
前言:
實驗室的寬頻是公網靜態IP,上外網不需要撥號也不能撥號。 為了測試某款終端產品的撥號上網功能,除錯時只能自己弄個pppoe-server了。
網上搜索了一下,解決方案有很多:RouterOS,Windows Server 2003上部署撥號服務軟體,Linux pppoe-server等。有其他專案的同事以前搞過,給我發了一個模擬BAS,軟體叫RASPPPOE啥的。
時間不等人,沒有多的電腦裝置,也傾向於使用linux,最後選來選去決定使用rp-pppoe來搭建一個PPPOE-Server
網上資料不是很多,國內的資料也總是抄來抄去或者不夠詳細,於是就有了這篇部落格,希望能夠幫助到後來人
-----------------------------------------------------
軟體準備:
作業系統用的SuSELinux11
軟體用的rp-pppoe,這個軟體支援adsl撥號和pppoe-server,開源免費。
參考文件:
(1)Rehat上安裝rp-pppoe:
(2)rp-pppoe自帶的簡單文件
再就是rp-pppoe doc目錄下自帶的簡單的說明文件,至於配置項什麼的在配置檔案有些說明
(3)還有這個文件,網上貼的比較多
Linux 系統伺服器配置文件—《PPPoE 篇》
具體操作:
檢查系統是否已安裝PPPOE伺服器: 網上介紹用rpm -q rp-pppoe,但下載下來的並不是一個rpm,用which pppoe-server直接看就可以了
檢查linux核心版本:uname -r ,自帶doc上介紹安裝rp-pppoe需要核心2.2.9以上
rp-pppoe-3.11.tar.gz 下載後解壓,解壓後有README檔案指導安裝,可以快速安裝或手動安裝
我用的手動編譯和安裝
1) Unpack:
$ tar xzvf rp-pppoe-xxx.tar.gz
2) Change to source directory:
$ cd src
3) Configure:
$ ./configure
4) Compile:
$ make
4) Install (this step must be done as root)
# make install
----------------------------------------------------------
二、配置
/etc/ppp/目錄下有很多配置檔案,改這3個就可以了
(1)vi /etc/ppp/pppoe-server-options #可以先參考 pppoe-server-options-example
require-chap #使用chap驗證協議,如果使用pap驗證協議,則此行為 require-pap
login #使用系統的賬號進行認證。 要求pppd的登入賬號在系統和chap-secrets檔案中均存在。
lcp-echo-interval 10
lcp-echo-failure 2
ms-dns 8.8.8.8 #分配給客戶端的DNS
(2)新增身份驗證賬戶
vi /etc/ppp/chap-secrets #如果使用pap驗證,則修改/etc/ppp/pap-secrets
# client server secret IP addresses
username * password *
其中username和password分別是使用者名稱和密碼
如果pppoe-server-options中使用了login項,需要在linux上用useradd命令建立同名帳戶
(3)vi /etc/ppp/options --- 是否要修改不確定,但改了下面這一項
local #這個是pppoe撥號協議的一個開關,options檔案內有說明
三、啟動pppoe伺服器
用eth0提供撥號服務,eth0沒有配置地址。eth1已經配置好地址,可以上公網
(1)檢查網絡卡
ifconfig eth0 #如果網絡卡沒有起來,可以用ifconfig eth0 up
確保這個網口正常,最好接上一個裝置,用ethtool eth0命令檢視是否連線
linux:~ # ethtool eth0
Link detected: yes
(2)提供pppoe-server的網絡卡上不能配IP地址
用ifconfig eth0 檢視
(3)在網絡卡上啟用pppoe-server服務
pppoe-server -I eth0 -L 192.168.1.1 -R 192.168.1.2 -N 10
-I eth0 指定pppoe伺服器在那個網絡卡介面監聽連線請求
-L 192.168.1.1 指定pppoe伺服器的ip地址。(注意:此IP地址不是網絡卡的IP地址,而是PPPOE伺服器的虛擬IP)
-R 192.168.1.2 pppoe伺服器分配給客戶端的IP地址,從192.168.1.2開始,遞增
-N 10 指定最多可以連線pppoe伺服器的客戶端數量
-k: 使用核心模組
-L: 設定服務端IP地址
-R: 設定客戶端啟示IP地址
-x: 每個MAC地址能發起的session(這個似乎在新版本中才有)
-C:設定連結主機名字,預設是主機名
-S: 設定服務名
-I:設定需要監聽的埠
-N: 設定最大客戶端連結數,預設是64
啟動pppoe-server後檢查程序是否存在:ps -ef | grep -i pppoe
關閉pppoe所有服務(包括server服務): killall pppoe-server
pppoe-server的日誌輸出在/var/log/messages,這個日誌是SuSELinux作業系統的日誌
終端裝置撥號成功後,用ifconfig命令可以在SuSELinux看到這樣一個連線
其中inet addr:192.168.1.1是pppoe-server的ip, P-t-P:192.168.1.2是終端撥號成功獲取到的ip
ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.1.1 P-t-P:192.168.1.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
RX packets:34888 errors:0 dropped:0 overruns:0 frame:0
TX packets:69929 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:2013508 (1.9 Mb) TX bytes:90514273 (86.3 Mb)
四、使撥號的終端也能夠上公網
撥號伺服器有2塊網絡卡:eth0用於PPPOE Server,eth1能上外網
為了使撥號的終端能上外網,還需要如下配置:
(1)開啟IP轉發,這樣eth0的包才會被允許轉發到eth1
# echo "1" > /proc/sys/net/ipv4/ip_forward
(2)將eth1出向包的源地址進行修改
如果eth1是靜態地址:
# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 172.20.7.251
將輸出到eth1的出向包的源地址修改為172.20.7.251,172.20.7.251是eth1的靜態地址。
命令解釋: -A POSTROUTING -o eth1是匹配(match)到網路包, -j 是指定nat時的具體動作。就是對match到的包做指定動作。
如果eth1是動態獲取的地址:
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
將源地址修改為eth1實際獲取到的地址,又稱ip欺騙
配置後,檢視iptables配置
linux:~ # iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- anywhere anywhere to:172.20.7.251
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
如果要全清除iptables規則,使用iptables -t nat -F
五、補充問題
1.pppoe認證失敗
PAP的使用者名稱稱(pap驗證的ID、密碼),不是任意的,必須與server系統的一個使用者名稱、密碼一致。
CHAP的使用者名稱稱是任意的,沒有限制的。
在原始碼裡面有個doc目錄:
F) Internal hosts can't see the Internet
Do you have masquerading set up? I can't help you in great detail, but
see the IPCHAINS-HOWTO and the IP-Masquerade mini-HOWTO.
如果撥號成功的終端還是不能上網,需要同時對eth0和eth1抓包進行分析。比如抓到的網路包分別是cur_eth0.cap和cur_eth1.cap
第一步,檢視傳送給eth0的訊息,有沒有轉發到eth1上。正常情況,同一個訊息應該在cur_eth0.cap和cur_eth1.cap都存在。
第二步,檢視終端發出來的訊息有沒有被SNAT,需要重點分析下cur_eth1.cap了