因?yàn)樵跇漭缮蠈懩_本會(huì)有點(diǎn)卡,
就先在臺(tái)式機(jī)上寫寫看, 還能邊寫邊用瀏覽器查...
連校園網(wǎng), 這次是用腳本實(shí)現(xiàn)的, 上次是用一個(gè)下載的軟件, 但是那個(gè)被我重新裝之后比规, 就不能用了次伶,因?yàn)樵谝郧皼]有記錄下怎么配置的過程,
那現(xiàn)在堵未, 用現(xiàn)在的方法扶平,可以做到開機(jī)就連上網(wǎng)絡(luò),
首先 先說一下, 這個(gè)撥號(hào)的過程,
- 學(xué)校的局域網(wǎng)內(nèi)有個(gè) 192.168.254.1 的服務(wù)器是作為l2tp的server.
學(xué)生作為client, 可以和他建立vpn, 也就是l2tp隧道. - 在隧道建立完成之后, 會(huì)使用ppp協(xié)議作為載體, 把隧道內(nèi)傳輸?shù)臄?shù)據(jù)按照ppp來打包, 然后這些ppp包就從這個(gè)隧道中發(fā)到server. 從而實(shí)現(xiàn)上網(wǎng).
有個(gè)鏈接: 解釋了為啥還是在使用l2tp作為上網(wǎng)的認(rèn)證手段,而不是用ppop啥的:
https://www.zhihu.com/question/26810403
簡單的說, 就是認(rèn)證用戶是用ppp協(xié)議的, 但是宿舍到server不是一條線的, 中間要經(jīng)過好多個(gè)路由啥的, 就不是peer to peer的了, 那么ppp的包就過不去了, 最后要借助l2tp這個(gè)在ip層的協(xié)議來幫助發(fā)送ppp包.
然后再來看怎么配置:
要下的軟件:
要建立l2tp連接, 那么就要用xl2tpd這個(gè)軟件.
要用ppp協(xié)議發(fā)送包, 那么就要用pppd這個(gè)軟件.
( 如果l2tp是要加密的話, 好像還要下載其他的東西, 但是我發(fā)現(xiàn), 聯(lián)通的這個(gè)東西, 是不加密的, 密碼都是明文發(fā)送的......)
你可以用apt-get 來下載這兩個(gè)包.
給軟件的配置文件:
xl2tpd 的配置文件:
/etc/xl2tpd/xl2tpd.conf
內(nèi)容:
[lac testvpn]
name = test
lns = 192.168.254.1
pppoptfile = /etc/ppp/peers/testvpn.l2tpd
ppp debug = yes
第一個(gè)name,這個(gè)選項(xiàng)不曉得干啥的,但是例子上有..
第二個(gè)就是遠(yuǎn)端服務(wù)器的ip.
第三個(gè)是ppp協(xié)議的配置文件, 因?yàn)閤l2tpd在建立完成隧道之后, 就會(huì)自己啟動(dòng)pppd, 所以他就需要知道pppd的配置文件在哪里.
第4個(gè)是 是否要輸出ppp的詳細(xì)運(yùn)行信息.
更多的有關(guān)配置的信息可以在這里找到:https://linux.die.net/man/5/xl2tpd.conf
配置是分lac 和lns和global的, global和lns的配置不用去管, lns是服務(wù)器的配置信息.
因?yàn)閤l2tpd還是可以用作服務(wù)端的, 我們就只用到了作為客戶的功能.
然后就是要設(shè)置 pppd 的配置文件:
/etc/ppp/peers/testvpn.l2tpd
內(nèi)容:
remotename testvpn
user "賬號(hào)"
passwrod 密碼
unit 0
nodeflate
noauth
persist
noaccomp
maxfail 5
usepeerdns
debug
這些參數(shù)可以用 man pppd來查詢,
這個(gè)option文件是我抄網(wǎng)上的教程后修修改改出來的,
有些東西也不知道為啥....
我發(fā)現(xiàn), 我們的機(jī)器的ip和dns都是需要server告訴我們的, 所以加了 usepeerdns.
然后ppp 有兩種認(rèn)證的方式PAP和CHAP, 我選的是PAP, 因?yàn)楦杏Xchap比較高級(jí), chap比較耗費(fèi)運(yùn)算??
這些認(rèn)證過程可以/var/log/syslog文件中找到.
有個(gè)中文的翻譯:http://blog.csdn.net/chenliang0224/article/details/8572699
然后兩個(gè)文件設(shè)置完成之后, 就要啟動(dòng)這個(gè)連接了.
首先啟動(dòng)xl2tp:
xl2tpd -c /etc/xl2tpd/xl2tpd.conf -D
-c 是指定配置文件
你不加這個(gè)也可以, 因?yàn)閤l2tpd的默認(rèn)的配置文件就是這個(gè)目錄上的文件.
-D 是debug模式, 不加的話, xl2tpd就會(huì)變成后臺(tái)進(jìn)程, 但可以用ps aux | grep xl2tpd 和 kill 殺死...
然后你就可以在當(dāng)前的terminal中看到他的執(zhí)行情況了.
然后再發(fā)送連接指令給xl2tpd
echo 'c testvpn' > /var/run/xl2tpd/l2tp-control
這里的testvpn這個(gè)名字, 就是上面設(shè)置的remotename, 我不清楚這兩個(gè)名字是不是有關(guān)系的, 其實(shí)改一下就好知道, 但是太懶....
echo 'd testvpn' > /var/run/xl2tpd/l2tp-control 是斷開連接.
成功的話, 就可以在ifconfig中看到ppp0接口了.
如果不成功, 就需要查看日志來找出錯(cuò)誤.
我碰到的大部分的錯(cuò)誤是可以在 xl2tpd -D的那個(gè)terminal中可以看出來的,
我經(jīng)常就是 ppp 的參數(shù)設(shè)置錯(cuò)誤, 然后xl2tpd檢測到錯(cuò)誤后就殺死了pppd啥的, 反正就改改配置文件后再來一邊試試看.
還有一個(gè)可以看到日志的地方就是 /var/log/message 或者 /var/log/syslog 文件.
你可以再開個(gè)窗口, 然后用 tail -f 看.
反正目標(biāo)就是 看不到 fail的字樣. 要看到: 隧道成功建立和ppp認(rèn)證成功.
這里是我的成功后的兩個(gè)日志的情況:
上圖是 syslog 的. 可以看到, 在l2tp連接建立之后, 就會(huì)有
Mar 8 18:08:11 dogegg-HP pppd[3618]: sent [LCP EchoReq id=0x2 magic=0x2a789e01]
Mar 8 18:08:11 dogegg-HP pppd[3618]: rcvd [LCP EchoRep id=0x2 magic=0x4dd4d216]
這樣子的收發(fā)信息, 這個(gè)是代表這個(gè)隧道是存在的,30s一次( 這個(gè)東西很重要, 和路由有關(guān))
然后我們可以看到服務(wù)器發(fā)給我們, 我們的ip地址, 我們的主/次dns服務(wù)器地址, 還有他的地址.
上圖是xl2tpd進(jìn)程的日志, 可以看到他一步步的把配置文件中的內(nèi)容給解析出來, 如果有解析錯(cuò)的, 那么肯定會(huì)打印出來的.
設(shè)置路由
這樣弄完之后, 網(wǎng)上的教程都說, 你就可以上網(wǎng)了, 但是我不行.....
因?yàn)槭锹酚傻膯栴}.....
我們要讓電腦的所有流量都經(jīng)過ppp0端口出去, 而不是原來的eth0啥的.
現(xiàn)在我們的情況是 我們和服務(wù)器連上了, 但是我們包還是從默認(rèn)的路由默認(rèn)的網(wǎng)關(guān)發(fā)送出去的.
用route -n看到的情況大概是這樣子的.
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.64.70.1 255.255.255.255 ?????????
10.64.70.0 0.0.0.0 255.255.255.0 U 100 0 0 enx000ec6d2bc57
101.68.75.84 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enx000ec6d2bc57
第一條的??參數(shù)是我忘記了... 就亂打上去.
destination是 0.0.0.0的那條是叫做default路由. 數(shù)據(jù)包不知道往哪里發(fā)的話, 就發(fā)那邊去.
我的路由表在 沒有連上ppp0之前就只有3個(gè)路由, 就是現(xiàn)在的去掉第三條的樣子.
最后一條169.254.0.0的是local-link, 查了百度, 也沒怎么弄清楚這是干啥的, 反正不影響.
如果想把流量都改了的話, 那么就應(yīng)該把default給刪除再加上一條去ppp0的default,
但是, 并不是把所有的流量都給導(dǎo)過去, 我們和server的通訊是要走網(wǎng)卡的不能走ppp0.
所以, 就需要3條route命令來改:
echo 'add route to 192..'
route add -host 192.168.254.1 gw $getway dev enx000ec6d2bc57
echo 'del default'
route del default
echo 'add default to ppp0'
route add default gw $remote dev ppp0
這是腳本里面寫著的, 這樣子改完之后, 應(yīng)該就好上網(wǎng)了.如果還不行...
可以試試看ping remote通不通. 然后ping那個(gè)dns服務(wù)器.
我本來以為加上 ping 的-I 參數(shù) 就可以跳過路由, 但是如果路由不對(duì), 就算加上-I ppp0, ping的包好像也是不會(huì)順利的發(fā)送出去的.
下面是腳本:
#!/bin/bash
dir=/home/dogegg/Desktop/log.txt
#因?yàn)閤l2tpd進(jìn)程是自動(dòng)隨著系統(tǒng)開機(jī)而運(yùn)行的, 就不用寫入腳本了.
echo 'c testvpn' > /var/run/xl2tpd/l2tp-control
#在發(fā)送完連接命令之后, 就每隔2s檢查下有沒有ppp0的接口在ifconfig中出現(xiàn). 次數(shù)超過10次就exit.
count=0
while [ $count -lt 10 ]; do
haveppp0=`ifconfig | grep ppp0`
if [[ $haveppp0 != "" ]];then
break
fi
echo 'check ppp0 is exist, time:'$count > $dir
let count=count+1
sleep 2s
done
if [[ $count == 10 ]];then
echo 'time out!' >> $dir
exit 0
fi
echo 'ppp0 is exist!' >> $dir
#匹配出 網(wǎng)關(guān)的地址.
getway=`ifconfig enx000ec6d2bc57 | grep 'inet addr'`
reg='.*inet addr\:([0-9]+\.[0-9]+\.[0-9]+\.)([0-9]+).*'
if [[ "$getway" =~ $reg ]];then
pre=${BASH_REMATCH[1]}
last=${BASH_REMATCH[2]}
else
exit 222
fi
getway=$pre'1'
# 匹配出 遠(yuǎn)程server的地址
remote=`ifconfig ppp0 | grep 'P-t-P'`
reg='.*P-t-P:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*'
if [[ "$remote" =~ $reg ]];then
remote=${BASH_REMATCH[1]}
else
exit 223
fi
### debug!!
echo 'the getway is '$getway >> $dir
echo 'the remote is '$remote >> $dir
###
#改改路由:
echo 'add route to 192..' >> $dir
route add -host 192.168.254.1 gw $getway dev enx000ec6d2bc57
echo 'del default' >> $dir
route del default
echo 'add default to ppp0' >> $dir
route add default gw $remote dev ppp0
exit 0
最后就是配置開機(jī)了
在/etc/rc.local
文件中加入運(yùn)行腳本的語句
如果 想知道一些出錯(cuò)的信息, 我用的是笨辦法, 就是讓我的腳本里面的echo把字符串輸出到一個(gè)桌面的文件中($dir), 但是好像網(wǎng)上有比較優(yōu)雅的辦法, 看上去是改輸出流啥的:
exec 2> /tmp/rc.local.log
exec 1>&2
set -x
不懂.... 用不來, 但是在 /tmp/rc.local.log里面可以看到:
+ ./home/dogegg/Desktop/checkppp0.sh
+ exit 0
下一步就是把這個(gè)東西轉(zhuǎn)到樹梅pi上.