歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

整理最近做的vpn系統的項目前端後端客戶端。vpn的配置之pptp與freeradius

這個項目的所有vpn連接的認證是用freeradius+mysql,用freeradius+mysql進行登錄驗證可以讓系統管理更加輕松。只需要在主驗證服務器上控制mysql的radius表 就能控制所有的vps的
靈活的應對各個vps上的不同的vpn協議(pptp、l2tp 、sstp、 openvpn)。
所以用一台主服務器就能控制所有用戶的有效期、同時在線數還有各個vps的連接狀態和流量監測。
這篇文章也修正了一部分網絡上教程中頻繁出現的問題。
一些問題真的是不把各種情況的日志仔細研究。就很難發現
系統用的是centos6.6 64位
getconf LONG_BIT 可以查看系統位數
還有 cat /proc/version
如果centos 系統太精簡的話,還需要安裝一些別要的編譯環境和ppp要用到的程序
yum install -y gcc gcc-c++ make yum -y install make libpcap iptables gcc-c++ logrotate tar cpio perl pam tcp_wrappers
這篇文章我主要是記錄freeradius 客戶端(撥號驗證服務)+pptp 的配置方法。不過我把pptp 的常用配置方法一並記錄下來。方便剛開始的新手參考。 
#freeradius 的服務器端配置稍後再來寫。

一、檢查服務器系統環境是否支持安裝pptp vpn

1、檢查系統內核是否支持MPPE補丁

modprobe ppp-compress-18 &&echo 1

顯示 1 說明系統支持MPPE補丁,如果不支持,需要先安裝kernel-devel

yum install kernel-devel
用以下命令檢查PPP是否支持MPPE:

strings /usr/sbin/pppd |grep -i mppe | wc --lines

如果以上命令輸出為“0”則表示不支持;輸出為“30”或更大的數字就表示支持,MPPE(Microsoft Point to Point Encryption,微軟點對點加密)。

2、檢查系統是否開啟TUN/TAP支持

cat /dev/net/tun

如果這條指令顯示結果為下面的文本,則表明通過:

cat: /dev/net/tun: File descriptor in bad state

3、檢查系統是否開啟ppp支持

cat /dev/ppp

如果這條指令顯示結果為下面的文本,則表明通過:

cat: /dev/ppp: No such device or address

上面三條必須同時滿足,否則不能安裝pptp vpn

二、開始安裝pptp

直接運行
yum -y install ppp pptpd
如果出現 No package pptpd available. 
那就需要 rpm 來安裝
一般linux 系統裡都會有這些安裝程序 如果沒有就自行下載後rpm進行安裝.運行下面的命令

1、ppp #安裝pptpd需要此支持

rpm -ivh http://poptop.sourceforge.net/yum/stable/packages/ppp-2.4.4-14.1.rhel5.x86_64.rpm

2、pptpd

rpm -ivh http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.4.0-1.rhel5.x86_64.rpm

如果出現
ppp = 2.4.4 is needed by pptpd-1.3.4-2.rhel5.x86_64
原因是pptpd與PPP不兼容,下載pptpd-1.3.4-2.el6.x86_64.rpm安裝即可。

我找來一些別人分享的資源可供下載(Sina 博客:Professor哥)
當然如果你可以直接訪問 poptop.sourceforge.net 的話可以直接去這裡下載。

pptpd-1.3.4-2.el6.x86_64.rpm 的下載地址:http://pan.baidu.com/s/1gidxe
pptpd-1.3.4-2.rhel5.x86_64.rpm http://pan.baidu.com/s/17mzWE
pptpd-1.3.4-2.rhel5.i386.rpm http://pan.baidu.com/s/1CCghJ
pptpd-1.3.4-2.el6.i686.rpm http://pan.baidu.com/s/11gNxp
pptpd-1.3.4-2.el6.x86_64.rpm http://pan.baidu.com/s/1wxfX3

等全部安裝完畢 就開始配置ppp 和pptp 了

三、配置pptp

1.配置文件/etc/ppp/options.pptpd

vi /etc/ppp/options.pptpd

修改options.pptpd內容如下(用以下內容替換所有原內容):

    name pptpd
    refuse-pap
    refuse-chap
    refuse-mschap
    require-mschap-v2
    require-mppe-128
    proxyarp
    lock
    nobsdcomp
    novj
    novjccomp
    nologfd
    idle 2592000
    ms-dns 8.8.8.8
    ms-dns 8.8.4.4
解析:ms-dns 8.8.8.8, ms-dns 8.8.4.4是使用google的dns服務器。注意:如果虛擬機內核不支持MPPE的話,無法使用加密,用WINDOWS默認VPN連接會顯示“證書信任錯誤”。
解決方法:修改/etc/ppp/options.pptpd注釋掉require-mppe-128(注釋:#require-mppe-128)這行,然後windows的vpn撥號的屬性改為可選加密,再次連接就成功了

2、不使用freeradius 直接用文本來做vpn用戶認證

vi /etc/ppp/chap-secrets 

添加pptp撥號用戶和密碼(可以設置多個用戶,每行一個)

 #client server secret IP addresses 
 test1 pptpd 123456 * 
 test2 pptpd 1234 * 

格式:用戶名 pptpd 密碼 * 其中*表示為客戶端自動分配IP地址

3、 設置pptp服務器IP地址,設置vpn撥入客戶端ip的ip分配范圍

vi /etc/pptpd.conf 
option /etc/ppp/options.pptpd
logwtmp
localip 192.168.1.1 #這就相當於配置路由器的地址。一個局域網內的網關地址。
remoteip 192.168.1.2-254  #為連接vpn的用戶動態分配192.168.1.254之間的IP地址的地址。注意:不能用1-255, 192.168.1.1 是網關地址192.168.1.255是廣播地址。

4.配置文件/etc/sysctl.conf 開啟路由轉發
將“net.ipv4.ip_forward”改為1:

net.ipv4.ip_forward=1

同時在“net.ipv4.tcp_syncookies = 1”前面加# :

# net.ipv4.tcp_syncookies = 1

*另外:還可以可以運行下面的命令來建立設備節點

    mknod /dev/ppp c 108 0 #建立ppp設備節點
    echo 1 > /proc/sys/net/ipv4/ip_forward 
    echo "mknod /dev/ppp c 108 0" >> /etc/rc.local
    echo "echo 1 > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.local

保存退出,並執行下面的命令來生效它:

sysctl -p 或
/sbin/sysctl -p

四.配置防火牆

不配置防火牆轉發規則的話。。就只能連接vpn上不了網

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERAD #添加規則eth0 是網卡 一般單網卡都是叫這個 如果你的不是就替換成你的網卡名稱 MASQUERAD 自行判斷
或者
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 153.128.21.17 #153.128.21.17 這個是你的公網 ip 

iptables -A FORWARD -p tcp --syn -s 192.168.1.0/24 -j TCPMSS --set-mss 1356  #添加規則 這兩條命令的192.168.1.1 就是之前的local ip ,24 子網掩碼
或者
iptables -A FORWARD -p tcp -i ppp+ -j TCPMSS  --syn --set-mss 1356 #調節適合ppp的MTU最大值

iptables -A INPUT -p gre -j ACCEPT                                          # 放行47端口    
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT    # 放行1723端口 

/etc/init.d/iptables save #保存防火牆設置

下面 貼出一個最精簡,使服務器除了ssh連接 和 pptp連接,其余的連接一律拒絕,防止被攻擊 ,以下是防火牆配置文件裡的內容
/etc/sysconfig/iptables

##########################################
 # Generated by iptables-save v1.4.7 on Tue Mar  8 15:02:25 2016
*filter
:FORWARD ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT #ssh連接端口開放
-A INPUT -p gre -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT 
-A INPUT -p udp -m udp --dport 1812 -j ACCEPT
 #1812-1814 這三條是我的服務器作為遠程freerdius 驗證服務器的端口 如果你們不用fresradius 做認證可以不需要這三條
 # 重點是 1812 1813 1814 freeradius 在監聽時都是監聽的udp協議。。網上的教程 防火牆的過濾好多都寫得是tcp。結果就是如果radius客戶端和服務器端不是同一台服務器時。。根本就不能通訊
-A INPUT -p udp -m udp --dport 1813 -j ACCEPT 
#1812 是radius 用來認證的 1813 是用來計時之類的。如果1813端口不開放。那什麼時候登錄退出  還有 流量都不會被記錄
-A INPUT -p udp -m udp --dport 1814 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT #dns端口
-A FORWARD -p tcp -i ppp+ -j TCPMSS  --syn --set-mss 1356
-A FORWARD -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited  #拒絕除了以上規則的所有請求
COMMIT
 # Completed on Tue Mar  8 15:02:25 2016
 # Generated by iptables-save v1.4.7 on Tue Mar  8 15:02:25 2016
*nat
:PREROUTING ACCEPT [37:3710]
:POSTROUTING ACCEPT [18:1675]
:OUTPUT ACCEPT [18:1675]
-A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE #路由轉發把vpn連接的數據轉到進入外網的網卡上
COMMIT
 # Completed on Tue Mar  8 15:02:25 2016
 # Generated by webmin
*mangle
:FORWARD ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
 # Completed
##########################################

都配置好後

/sbin/service pptpd start #啟動pptp

/etc/init.d/pptpd stop #關閉

service pptpd restart #重啟

chkconfig pptpd on  #設置開機啟動

以下是配置pptp 中的 freeradius 客戶端配置部分
下面的操作不會被之前pptp的配置所影響
只需將 freeradius 連接、客戶端配置添加到
/etc/ppp/options.pptpd

1.找到一個想要的freeradius client 做客戶端

可以直接去freeradius的ftp來復制想要的版本鏈接

ftp://ftp.freeradius.org/pub/freeradius

然後用命令下載

wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-client-1.1.7.tar.gz

再解壓

tar zxvf freeradius-client-1.1.7.tar.gz

再進入目錄進行編譯

cd freeradius-client-1.1.7
./configure && make && make install

然後再進行freeradius 客戶端的配置

vi /usr/local/etc/radiusclient/radiusclient.conf

用這條命令可以跳過空段和注釋段

cat  /usr/local/etc/radiusclient/radiusclient.conf |grep -v ^# |grep -v ^$

看到的就是這樣

auth_order      radius,local
login_tries     4
login_timeout   60
nologin /etc/nologin
issue   /usr/local/etc/radiusclient/issue
authserver      localhost
acctserver      localhost
servers         /usr/local/etc/radiusclient/servers
dictionary      /usr/local/etc/radiusclient/dictionary
login_radius    /usr/local/sbin/login.radius
seqfile         /var/run/radius.seq
mapfile         /usr/local/etc/radiusclient/port-id-map
default_realm
radius_timeout  10
radius_retries  3
radius_deadtime 0
bindaddr *
login_local     /bin/login

找到 authserver 和 acctserver 將值改為 freeradius 驗證主服務器的 ip地址:端口號
將 radius_deadtime 0 和 bindaddr * 將這兩項注釋掉(或者通過以下命令來注釋之)

sed -i ‘s/radius_deadtime/#radius_deadtime/g’ /usr/local/etc/radiusclient/radiusclient.conf
sed -i ‘s/bindaddr/#bindaddr/g’ /usr/local/etc/radiusclient/radiusclient.conf

就像這樣

auth_order  radius
login_tries 4
login_timeout   60
nologin /etc/nologin
issue   /usr/local/etc/radiusclient/issue
authserver  108.61.16.250:1812
acctserver  108.61.16.250:1813
servers     /usr/local/etc/radiusclient/servers
dictionary  /usr/local/etc/radiusclient/dictionary
login_radius    /usr/local/sbin/login.radius
seqfile     /var/run/radius.seq
mapfile     /usr/local/etc/radiusclient/port-id-map
default_realm
radius_timeout  10
radius_retries  3
login_local /bin/login

指定FreeRADIUS Server地址,並設置key

cat >>/usr/local/etc/radiusclient/servers<

增加字典。這一步很重要!

wget -c http://hello-linux.googlecode.com/files/dictionary.microsoft
mv ./dictionary.microsoft /usr/local/etc/radiusclient/
cat >>/usr/local/etc/radiusclient/dictionary<

然後找到radius.so

locate radius.so

然後在 /etc/ppp/options.pptpd 最後一行添加他的路徑 要選對應自己的系統位數的那個路徑的radius.so

plugin /usr/lib64/pppd/2.4.5/radius.so
#也可以直接寫 plugin radius.so
radius-config-file /usr/local/etc/radiusclient/radiusclient.conf

這些配置好後就可以連接了 pptp 連接後 pptp服務器會向freeradius 服務器請求驗證 驗證通過後就ptpp 連接成功。
如果你們出錯了。就可以在

/var/log/message 

查看系統日志 找出錯誤原因
查查是在驗證的時候連接不上radius 驗證服務器
還是pptp本身不能成功連接客戶端
freeradius 可以進行 兩台服務器驗證測試
只需在freeradius服務端停止radiusd服務

service radiud stop

然後進入debug 調試模式來觀察驗證狀態

然後進入debug 調試模式來觀察驗證狀態
radiud -X

客戶端只需用radtest命令即可

[root@www ~]# radtest
Usage: radtest [OPTIONS] user passwd radius-server[:port] nas-port-number secret [ppphint] [nasname]
        -d RADIUS_DIR       Set radius directory
        -t            Set authentication method
                            type can be pap, chap, mschap, or eap-md5
        -x                  Enable debug output
        -4                  Use IPv4 for the NAS address (default)
        -6                  Use IPv6 for the NAS address

但是因為我客戶端不是安裝的整個freeradius 服務
而是只編譯了精簡的 freeradius-client 客戶端 所有沒有radtest 命令可以用
這時你只需在freeradius的服務端從
/usr/bin 裡 把radtest 和 radclient 這兩個文件
復制到 freeradius 客戶端 服務器裡的
/usr/bin 即可 運行radtest 命令了

Copyright © Linux教程網 All Rights Reserved