1、L2TP介紹linux
一、L2TP定義
git
L2TP(Layer 2 Tunneling Protocol,二層隧道協議),經過公共網絡(如Internet)上創建點到點的L2TP隧道,將PPP(Point-to-Point Protocol,點對點協議)數據幀封裝後經過L2TP隧道傳輸,使得遠端用戶利用PPP接入公共網絡後,可以經過L2TP隧道與企業內部網絡通訊,訪問企業內部網絡資源,從而爲遠端用戶接入私有的企業網絡提供了一種安全、經濟且有效的方式。
github
L2TP是一種工業標準的Internet隧道協議,功能大體和PPP協議相似,一樣能夠對網絡數據流進行加密。不過也有不一樣之處,好比PPTP要求網絡爲IP網絡,L2TP要求面向數據包的點對點鏈接;PPTP使用單一隧道,L2TP使用多隧道;L2TP提供包頭壓縮、隧道驗證,而PPTP不支持。
算法
第二層隧道協議(L2TP)是用來整合多協議撥號服務至現有的因特網服務提供商點。PPP 定義了多協議跨越第二層點對點連接的一個封裝機制。特別地,用戶經過使用衆多技術之一(如:撥號 POTS、ISDN、ADSL 等)得到第二層鏈接到網絡訪問服務器(NAS),而後在此鏈接上運行 PPP。數據庫
L2TP 擴展了 PPP 模型,容許第二層和 PPP 終點處於不一樣的由包交換網絡相互鏈接的設備來。經過 L2TP,用戶在第二層鏈接到一個訪問集中器(如:調制解調器池、ADSL DSLAM 等),而後這個集中器將單獨得的 PPP 幀隧道到 NAS。這樣,能夠把 PPP 包的實際處理過程與 L2 鏈接的終點分離開來。vim
L2TP 是一個數據鏈路層協議。其報文分爲數據消息和控制消息兩類。數據消息用投遞 PPP 幀,該幀做爲L2TP報文的數據區。L2TP不保證數據消息的可靠投遞,若數據報文丟失,不予重傳,不支持對數據消息的流量控制和擁塞控制。控制消息用以創建、維護和終止控制鏈接及會話,L2TP確保其可靠投遞,並支持對控制消息的流量控制和擁塞控制。windows
二、L2TP典型組網原理
centos
L2TP的典型組網中包括如下三個部分:
瀏覽器
(1)、遠端系統
安全
遠端系統是要接入企業內部網絡的遠端用戶和遠端分支機構,一般是一個撥號用戶的主機或私有網絡中的一臺設備。
(2)、LAC(L2TP Access Concentrator ,L2TP訪問集中器)
LAC是具備PPP和L2TP協議處理能力的設備,一般是一個當地的ISP的NAS(Network Access Server,網絡接入服務器),主要用於爲PPP類型的用戶提供接入服務。
LAC做爲L2TP隧道的端點,位於LNS和遠端系統之間,用於在LNS和遠端系統之間傳遞報文。它把遠端系統收到的報文按照L2TP協議進行封裝並送往LNS,同時也將LNS接收到的報文進行解封裝病送往遠端系統。
(3)、LNS (L2TP Network Server ,L2TP網絡服務器)
LNS是具備PPP和L2TP協議處理能力的設備,一般位於企業內部網絡的邊緣。
LNS做爲L2TP隧道的另外一側端點,是LAC經過隧道傳輸的PPP會話的邏輯終點。L2TP經過在公共網絡中創建L2TP隧道,將遠端系統的PPP鏈接由原來的NAS延伸到了企業內部網絡的LNS設備。
三、L2TP消息類型及封裝結構
L2TP協議定義了兩種消息:
(1)、控制消息:
用於L2TP隧道和L2TP會話的創建、維護和拆除。控制消息的傳輸是可靠的,而且支持流量控制和擁塞控制。
(2)、數據消息:
用於封裝PPP幀,數據消息的傳輸是不可靠的,若數據消息丟失,不予重傳。數據消息支持流量控制,既支持對亂序的數據消息進行排序。
L2TP控制消息和L2TP數據消息均封裝在UDP報文中。
四、L2TP隧道和會話
L2TP隧道是LAC和LNS之間的一條虛擬點到點鏈接。控制消息和數據消息都在L2TP隧道上傳輸。在同一對LAC和LNS之間能夠創建多條L2TP隧道。每條隧道能夠承載一個或多個L2TP會話。
L2TP會話複用在L2TP隧道之上,每一個L2TP會話對應於一個PPP會話。當遠端系統的LNS之間創建PPP會話時,LAC和LNS之間將創建與其對應的L2TP會話。屬於該PPP會話的數據幀經過該L2TP會話所在的L2TP隧道傳輸。
五、L2TP協議的特色
(1)、靈活的身份驗證機制以及高度的安全性
L2TP協議自己並不提供連接的安全性,但它可依賴於PPP提供的認證(好比CHAP、PAP等),所以具備PPP所具備的全部安全特性。
L2TP還能夠與IPSec結合起來實現數據安全,使得經過L2TP所傳輸的數據更難被***。
(2)多協議傳輸
L2TP 傳輸PPP數據包,在PPP數據包內能夠封裝多種協議。
(3)、支持RADIUS服務器的認證
LAC和LNS能夠將用戶名和密碼發往RADIUS服務器,有RADIUS服務器對用戶身份進行認證。
(4)、支持內部地址分配
LNS能夠對遠端系統的地址進行動態的分配和管理,可支持私有地址應用(RFC 1918)。爲遠端系統的分配企業內部的私有地址,能夠方便地址的管理並增長安全性。
(5)網絡計費的靈活性
可在LAC和LNC兩處同時計費,既ISP處(用於產生帳單)既企業網關(用於付費及審計)。L2TP可以提供數據傳輸的出/入包數、字節數、字節數以及鏈接的起始、結束時間等計費數據,AAA服務器可根據這些數據方便地進行網絡計費。
(6)、可靠性
L2TP協議支持備份LNS,當主LNS不可達以後,LAC能夠與備份LNS創建鏈接,增長L2TP服務的可靠性。
(7)、支持由RADIUS服務器爲LAC下發隧道屬性
L2TP隧道採用NAS-Initiated模式時,LAC上的L2TP隧道屬性能夠經過RADIUS服務器來下發。此時,在LAC上只須要開啓L2TP服務,並配置採用AAA遠程認證方式對PPP用戶進行身份驗證,無需進行其餘L2TP配置。
當L2TP用戶撥入LAC時,LAC做爲RADIUS客戶端將用戶的身份信息發送給RADIUS服務器。RADIUS服務器對L2TP用戶的身份進行驗證。RADIUS服務器將驗證結果返回給LAC,並將該用戶對應的L2TP隧道屬性下發給LAC。LAC根據下發的隧道屬性,建立L2TP隧道和會話。
六、L2TP的封裝
在L2TP中,控制通道和數據通道都採用L2TP頭格式,只是其中的具體的字段不一樣,以type位代表本消息的類型,值爲1並表示此消息是控制消息,值是0表示此消息是數據消息。
L2TP頭中的tunnel id字段是L2TP控制鏈接的標識符,也就是隧道的標識符。
使用的是UDP的端口1701
私網的ip包前面加上ppp頭,ppp頭前面加上L2TP頭,加上udp頭,加上公網的IP頭。
在UDP頭中,用端口1701標識這時L2TP協議。
2、L2TP隧道模式及隧道創建過程
一、兩種典型的L2TP隧道模式
L2TP隧道的創建包括如下兩種典型模式
(1)、NAS-Intiated
NAS-Initiated L2TP隧道的創建是由LAC(值NAS)發起L2TP隧道鏈接。遠程系統的撥號用戶經過PPPoE/ISDN撥入LAC,由LAC經過Internet向LNS發起創建隧道鏈接請求。撥號用戶的私網地址有LNS分配;對遠程撥號用戶的驗證與計費既可由LAC側代理完成,也可在LNS側完成。
(2)、Client-Initiated
Client-Initiated L2TP隧道的創建是由LAC客戶(指本地支持L2TP協議的用戶)發起L2TP隧道鏈接。LAC客戶得到Internet訪問權限後,可直接向LNS發起隧道鏈接請求,無需通過一個單獨的LAC設備創建隧道。LAC客戶的私網地址由LNS分配。
在Client-Initiated模式下,LAC客戶須要具備公網地址,可以直接經過Internet與LNS通訊。
二、L2TP隧道的創建過程
(1)、 L2TP應用的典型組網以下圖:
(2)、L2TP隧道的呼叫創建流程
在此已NAS-Initiated模式的L2TP隧道爲例,介紹L2TP的呼叫創建流程。
L2TP隧道的呼叫創建流程如圖:
如上圖所示,L2TP隧道的呼叫創建過程以下:
3、IPSec 介紹
一、IPSec定義:
IPSec(IPSecurity)是IETF制定的三層隧道加密協議,它爲Internet上傳輸的數據提供了高質量的、可互操做的、基於密碼學的安全保證。「Internet協議安全性」是一種開放標準的框架結構,經過使用加密的安全服務以確保在Internet協議(IP)網絡上進行保密而安全的通信。IPSec(Internet Protocol Security)是安全聯網的長期方向。它經過端對端的安全性來提供主動的保護以防止專用網絡與Internet的***。
特定的通訊方之間在IP層經過加密與數據源認證等方式,提供瞭如下的安全服務:
(1)、數據機密性(Confidentiality):IPsec發送方在經過網絡傳輸包前對包進行加密。
(2)、數據完整性(Data Integrity):IPsec接受方對發送方發送來的包進行認證,以確保數據在傳輸過程當中沒有被篡改。
(3)、數據來源認證(Data Authentication):IPsec在接收端能夠認證發送IPsec報文的發送端是否合法。
(4)、防重放(Anti-Replay):IPsec接收方可檢測並拒絕接收過期或重複的報文。
二、IPsec的協議實現
IPsec協議不是一個單獨的協議,它給出了應用於IP層上網絡數據安全的一整套體系結構,包括網絡認證協議AH(Authentication Head,認證頭)、ESP(Encapsulating Security Payload,封裝安全載荷)、IKE(Internet Key Exchange,因特網密鑰交換)和用於網絡認證及加密的一些算法等。其中,AH協議和ESP協議用於提供安全服務,IKE協議用於密鑰交換。
IPsec提供了兩種安全機制:認證和加密。認證機制使IP通訊的數據接收方可以確認數據發送方的真實身份以及數據在傳輸過程當中是否遭篡改。加密機制經過對數據進行加密運算來保證數據的機密性,以防數據在傳輸過程當中被竊聽。
IPsec協議中的AH協議定義了認證的應用方法,提供數據源認證和完整性保證;ESP協議定義了加密和可選認證的應用方法,提供數據可靠性保證。
(1)AH協議
AH協議(IP協議號爲51)提供數據源認證、數據完整性校驗和防報文重放功能,它能保護通訊免受篡改,但不能防止竊聽,適合用於傳輸非機密數據。AH的工做原理是在每個數據包上添加一個身份驗證報文頭,此報文頭插在標準IP包頭後面,對數據提供完整性保護。可選擇的認證算法有MD5(Message Digest)、SHA-1(Secure Hash Algorithm)等。
(2)ESP協議
ESP協議(IP協議號爲50)提供加密、數據源認證、數據完整性校驗和防報文重放功能。ESP的工做原理是在每個數據包的標準IP包頭後面添加一個ESP報文頭,並在數據包後面追加一個ESP尾。與AH協議不一樣的是,ESP將須要保護的用戶數據進行加密後再封裝到IP包中,以保證數據的機密性。常見的加密算法有DES、3DES、AES等。同時,做爲可選項,用戶能夠選擇MD五、SHA-1算法保證報文的完整性和真實性。
在實際進行IP通訊時,能夠根據實際安全需求同時使用這兩種協議或選擇使用其中的一種。AH和ESP均可以提供認證服務,不過,AH提供的認證服務要強於ESP。同時使用AH和ESP時,設備支持的AH和ESP聯合使用的方式爲:先對報文進行ESP封裝,再對報文進行AH封裝,封裝以後的報文從內到外依次是原始IP報文、ESP頭、AH頭和外部IP頭。
(3)IKE 密鑰交換協議
在兩個對等體之間來創建一條隧道來完成密鑰交換,協商完成再用ESP和AH協議來進行封裝數據。IKE動態的,週期性的在兩個PEER之間更新密鑰。
三、IKE原理
(1)、組成
由三個不一樣的協議組成:
ISAKMP:定義了信息交換的體系結構,也就是格式。
SKEME:實現公鑰加密認證的機制
Oakley:提供在兩個IPsec對等體間達成相同加密密鑰的基本模式的機制
ISAKMP 基於UDP ,源目端口都是500
(2)、安全聯盟(Security Association,簡稱SA)
SA是兩個通訊實體經協商創建起來的一種協定,它們決定了用來保護數據包安全的IPsec協議、轉碼方式、密鑰、以及密鑰的有效存在時間等等。任何IPsec實施方案始終會構建一個SA數據庫(SADB),由它來維護IPsec協議,用來保障數據包安全。
SA是單向的:若是兩個主機(好比A和B)正在經過ESP進行安全通訊,那麼主機A就須要有一個SA,即SA(OUT),用來處理外發的數據包,另外還須要有一個不一樣的SA,即SA(IN)用來處理進入的數據包。主機A的SA(OUT)和主機B的SA(IN)將共享相同的加密參數(好比密鑰)。
SA還要根據協議來區分,若是兩個主機間同時使用ESP和AH,對於ESP和AH會生成不一樣的SA。
SA分爲兩種:
IKE(ISAKMP)SA 協商對IKE數據流進行加密以及對對等體進行驗證的算法(對密鑰的加密和peer的認證)
IPsec SA 協商對對等體之間的IP數據流進行加密的算法
對等體之間的 IKE SA只能有一個 對等體之間的IPsec SA能夠有多個。
IKE的交換模式(主動模式)
IKE的交換模式(被動模式)
(3)site-to-site ipsec×××的協商過程,分兩個階段:
要想在兩個站點之間安全的傳輸IP數據流,它們之間必需要先進行協商,協商它們之間所採用的加密算法,封裝技術以及密鑰。
階段一:在兩個對等體設備之間創建一個安全的管理鏈接。沒有實際的數據經過這個鏈接。這個管理鏈接是用來保護第二階段協商過程的。
階段二:當對等體之間有了安全的管理鏈接以後,它們就能夠接着協商用於構建安全數據鏈接的安全參數,這個協商過程是安全的,加密的。協商完成後,將在兩個站點間造成安全的數據鏈接。用戶就能夠利用這些安全的數據鏈接來傳輸自已的數據了。
(4)、ESP
ESP的概述,Encapsulationsecurity payload,用於實現數據機密性以及完整性校驗。
ESP有兩種模式:
傳輸模式:只加密IP頭部以上的數據,對IP頭部不進行加密(適用於GRE(通用路由協議)over IPSEC)加密地點即通訊地點
隧道模式:加密原有數據包,再加入新的頭部 加密地點非通訊地點。
4、環境準備
一、服務器:
操做系統:CentOS Linux release 7.5.1804(Core)
IP地址:172.28.8.192
二、客戶端:
windows 7 操做系統
windows10 操做系統
5、安裝服務
一、查看主機是否支持pptp,返回結果爲yes表示經過
modprobe ppp-compress-18 && echo yes
二、是否開啓了TUN
有的虛擬機須要開啓,返回結果爲 cat:/dev/net/tun:File descriptor in bad state. 表示經過。
cat /dev/net/tun
三、查看IP地址信息
ip addr
四、安裝須要的插件
yum install -y vim
yum install -y wget
yum install -y net-tools
五、更新epel
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
六、跟新源列表
yum repolist
yum -y update
七、使用腳本安裝
在網上能夠下載已經寫好的自動化腳本,直接運行自動化腳本便可,在下面咱們會具體介紹腳本的配置內容在此須要把腳本下載到服務器,運行下載好的腳本並配置本身的帳號、密碼、IP和客戶端IP地址。
(1)下載腳本
瀏覽器打開: https://github.com/BoizZ/PPTP-L2TP-IPSec-×××-auto-installation-script-for-CentOS-7
(2)想下載的自動腳本壓縮包解壓
(3)上傳腳本至服務器
ls
(4)、給運行腳本賦值權限
chmod +x ***-script-for-centos7.sh
ll
(5)、運行腳本
sh ***-script-for-centos7.sh
肯定獲取的IP地址是否是服務器的IP地址 若是是的話 直接回車。
輸入完信息 ,而後開始自動安裝
安裝完,會顯示安裝和設置的配置信息:
八、具體安裝和配置步驟
(1)安裝epel源
yum install -y epel-release
提示已安裝。
(2)、安裝依賴組件
yum install -y openswan
yum install -y ppp pptpd xl2tpd wget
(3)、修改配置文件
vim /etc/ipsec.conf
(4)、設置預共享密鑰配置文件
vim /etc/ipsec.secrets
設置的PSK密碼爲:password
(5)、配置xl2tpd.com文件
vim /etc/xl2tpd/xl2tpd.conf
(6)、配置 options.xl2tpd 文件
vim /etc/ppp/options.xl2tpd
(7)、建立chap-secrets配置文件,即用戶列表及密碼
vim /etc/ppp/chap-secrets
九、系統配置
(1)、容許IP轉發
vim /etc/sysctl.conf
(2)、容許防火牆端口
建立文件/usr/lib/firewalld/services/l2tpd.xml 並修改
vim /usr/lib/firewalld/services/l2td.xml
十、初始化並重啓防火牆
firewall-cmd --reload
十一、啓動並設置開機自啓動服務
systemctl enable pptpd ipsec xl2tpd
systemctl restart pptpd ipsec xl2tpd
6、問題解決
按照以上的配置方法,使用客戶端測試鏈接性,發現不能正常鏈接,如今下面進行具體解決方法
一、測試ipsec的安裝
ipsec verify
三、添加防火牆列表
firewall-cmd --zone=public --add-port=1701/tcp --permanent
firewall-cmd --zone=public --add-port=4500/tcp --permanent
firewall-cmd --zone=public --add-port=500/tcp --permanent
systemctl restart firewalld.service
四、iptables 轉發規則
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
iptables -I FORWARD -s 10.0.1.0/24 -j ACCEPT
iptables -I FORWARD -d 10.0.1.0/24 -j ACCEPT
/sbin/iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT
/sbin/iptables -A INPUT -p udp -m udp --dport 1701 -j ACCEPT
/sbin/iptables -A INPUT -p udp -m udp --dport 500 -j ACCEPT
/sbin/iptables -A INPUT -p udp -m udp --dport 4500 -j ACCEPT
/sbin/iptables -A INPUT -p esp -j ACCEPT
/sbin/iptables -A INPUT -m policy --dir in --pol ipsec -j ACCEPT
/sbin/iptables -A FORWARD -d 10.0.1.0/24 -j ACCEPT
/sbin/iptables -A FORWARD -s 10.0.1.0/24 -j ACCEPT
/sbin/iptables -A FORWARD -i ppp+ -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
五、vim /etc/ipsec.d/linuxcc_l2tp.secrets
六、防火牆列表配置
firewall-cmd --add-port=1701/udp
firewall-cmd --add-port=500/udp
firewall-cmd --add-port=4500/udp
firewall-cmd --list-ports
七、設置端口轉發機制
iptables --table nat --append POSTROUTING --jump MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -i eth0 -p esp -j ACCEPT
八、開啓iptables 端口
iptables -A INPUT -p udp --dport 1701 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p udp --dport 500 -j ACCEPT
九、通過以上的排除,終於可以經過帳號鏈接成功了,可是又出現新的問題了 ,可以訪問內部網絡了,不能訪問互聯網,查了不少資料,測試了不少次,發現是服務器iptables防火牆的問題。
由於centos7默認沒有安裝iptables服務,在此須要安裝iptables服務
yum install -y iptables-services
安裝完iptables之後,下面就要對iptables防火牆策略進行配置了
下面是我對iptables的配置,最主要的就是容許內部獲取的網絡地址能夠經過eth0口訪問網絡
/sbin/iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT
/sbin/iptables -A INPUT -p udp -m udp --dport 1701 -j ACCEPT
/sbin/iptables -A INPUT -p udp -m udp --dport 500 -j ACCEPT
/sbin/iptables -A INPUT -p udp -m udp --dport 4500 -j ACCEPT
/sbin/iptables -A INPUT -p esp -j ACCEPT
/sbin/iptables -A INPUT -m policy --dir in --pol ipsec -j ACCEPT
/sbin/iptables -A FORWARD -d 10.0.1.0/24 -j ACCEPT
/sbin/iptables -A FORWARD -s 10.0.1.0/24 -j ACCEPT
/sbin/iptables -A FORWARD -i ppp+ -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
service iptables save
systemctl stop firewalld
iptables --table nat --append POSTROUTING --jump MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -i eth0 -p esp -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
iptables -A INPUT -p udp --dport 1701 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p udp --dport 500 -j ACCEPT
service iptables save
經過以上的配置 輸入服務器的內網IP地址 ,能夠鏈接成功,可是非公司網絡,輸入公司公網IP不能正常訪問,而後進行進一步排查。
十、不能經過公網IP地址訪問 ,須要經過公司的路由器網關作服務器端口映射,將公司的公網IP對應的1701 4500 500 端口 使用udp協議映射到內網l2tp服務的IP地址(172.28.5.201)的端口 1701 4500 500 ,使用udp協議。
7、客戶端驗證:
一、windows 10 操做系統客戶端驗證
(1)點擊windows10 的「設置」-而後點擊「網絡和Internet」
(2)、點擊「***」選擇中,而後點擊「***」鏈接
(3)彈出的對話框,填寫相應的信息:
(4)、下面要對剛創建的l2tp進行簡單的配置:
點擊「以太網」,而後點擊「更改適配器選項」
(5)設置完成後,而後進行鏈接
若是顯示已鏈接,這表示鏈接成功。
(6)、測試訪問內網是否成功
ping 服務器內網IP地址
二、windows7 客戶端鏈接測試
(1)、右擊桌面右下角網絡圖標,而後打開「網絡和共享中心」。在打開的界面點擊「設置新的鏈接或網絡」
(3)、在彈出的頁面中點擊「鏈接到工做區」,點擊下一步,而後再彈出的界面選擇「使用個人Internet鏈接(×××)」:
(4)、而後再Internet地址中輸入L2tp的IP地址,名稱可自定義,而後點擊下一步,輸入帳號密碼,也可在後續鏈接時輸入:
(5)、點擊「跳過」按鈕,而後在「網絡和共享中心」點擊左側的「更改適配器設置」:
(6)而後進行簡單的配置,以下圖:
(7)、點擊上圖中的「高級設置」,在彈出的界面選擇「使用預共享的密鑰做身份驗證」並輸入密鑰,而後點擊「肯定」,
(8)、選擇剛剛建立的L2tp鏈接,而後進行鏈接:
(9)提示鏈接成功後,而後進行測試