一、L2TP介紹
1、L2TP定義
L2TP(Layer 2 Tunneling Protocol,二層隧道協議),通過公共網絡(如Internet)上建立點到點的L2TP隧道,將PPP(Point-to-Point Protocol,點對點協議)數據幀封裝後通過L2TP隧道傳輸,使得遠端用戶利用PPP接入公共網絡後,能夠通過L2TP隧道與企業內部網絡通信,訪問企業內部網絡資源,從而爲遠端用戶接入私有的企業網絡提供了一種安全、經濟且有效的方式。
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 連接的終點分離開來。
L2TP 是一個數據鏈路層協議。其報文分爲數據消息和控制消息兩類。數據消息用投遞 PPP 幀,該幀作爲L2TP報文的數據區。L2TP不保證數據消息的可靠投遞,若數據報文丟失,不予重傳,不支持對數據消息的流量控制和擁塞控制。控制消息用以建立、維護和終止控制連接及會話,L2TP確保其可靠投遞,並支持對控制消息的流量控制和擁塞控制。
2、L2TP典型組網原理
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設備。
3、L2TP消息類型及封裝結構
L2TP協議定義了兩種消息:
(1)、控制消息:
用於L2TP隧道和L2TP會話的建立、維護和拆除。控制消息的傳輸是可靠的,並且支持流量控制和擁塞控制。
(2)、數據消息:
用於封裝PPP幀,數據消息的傳輸是不可靠的,若數據消息丟失,不予重傳。數據消息支持流量控制,既支持對亂序的數據消息進行排序。
L2TP控制消息和L2TP數據消息均封裝在UDP報文中。
4、L2TP隧道和會話
L2TP隧道是LAC和LNS之間的一條虛擬點到點連接。控制消息和數據消息都在L2TP隧道上傳輸。在同一對LAC和LNS之間可以建立多條L2TP隧道。每條隧道可以承載一個或多個L2TP會話。
L2TP會話複用在L2TP隧道之上,每個L2TP會話對應於一個PPP會話。當遠端系統的LNS之間建立PPP會話時,LAC和LNS之間將建立與其對應的L2TP會話。屬於該PPP會話的數據幀通過該L2TP會話所在的L2TP隧道傳輸。
5、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隧道和會話。
6、L2TP的封裝
在L2TP中,控制通道和數據通道都採用L2TP頭格式,只是其中的具體的字段不同,以type位表明本消息的類型,值爲1並表示此消息是控制消息,值是0表示此消息是數據消息。
L2TP頭中的tunnel id字段是L2TP控制連接的標識符,也就是隧道的標識符。
使用的是UDP的端口1701
私網的ip包前面加上ppp頭,ppp頭前面加上L2TP頭,加上udp頭,加上公網的IP頭。
在UDP頭中,用端口1701標識這時L2TP協議。
二、L2TP隧道模式及隧道建立過程
1、兩種典型的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通信。
2、L2TP隧道的建立過程
(1)、 L2TP應用的典型組網如下圖:
(2)、L2TP隧道的呼叫建立流程
在此已NAS-Initiated模式的L2TP隧道爲例,介紹L2TP的呼叫建立流程。
L2TP隧道的呼叫建立流程如圖:
如上圖所示,L2TP隧道的呼叫建立過程如下:
三、IPSec 介紹
1、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接收方可檢測並拒絕接收過時或重複的報文。
2、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等。同時,作爲可選項,用戶可以選擇MD5、SHA-1算法保證報文的完整性和真實性。
在實際進行IP通信時,可以根據實際安全需求同時使用這兩種協議或選擇使用其中的一種。AH和ESP都可以提供認證服務,不過,AH提供的認證服務要強於ESP。同時使用AH和ESP時,設備支持的AH和ESP聯合使用的方式爲:先對報文進行ESP封裝,再對報文進行AH封裝,封裝之後的報文從內到外依次是原始IP報文、ESP頭、AH頭和外部IP頭。
(3)IKE 密鑰交換協議
在兩個對等體之間來建立一條隧道來完成密鑰交換,協商完成再用ESP和AH協議來進行封裝數據。IKE動態的,週期性的在兩個PEER之間更新密鑰。
3、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)加密地點即通信地點
隧道模式:加密原有數據包,再加入新的頭部 加密地點非通信地點。
四、環境準備
1、服務器:
操作系統:CentOS Linux release 7.5.1804(Core)
IP地址:172.28.8.192
2、客戶端:
windows 7 操作系統
windows10 操作系統
五、安裝服務
1、查看主機是否支持pptp,返回結果爲yes表示通過
modprobe ppp-compress-18 && echo yes
2、是否開啓了TUN
有的虛擬機需要開啓,返回結果爲 cat:/dev/net/tun:File descriptor in bad state. 表示通過。
cat /dev/net/tun
3、查看IP地址信息
ip addr
4、安裝需要的插件
yum install -y vim
yum install -y wget
yum install -y net-tools
5、更新epel
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
6、跟新源列表
yum repolist
yum -y update
7、使用腳本安裝
在網上可以下載已經寫好的自動化腳本,直接運行自動化腳本即可,在下面我們會具體介紹腳本的配置內容在此需要把腳本下載到服務器,運行下載好的腳本並配置自己的賬號、密碼、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地址 如果是的話 直接回車。
輸入完信息 ,然後開始自動安裝
安裝完,會顯示安裝和設置的配置信息:
8、具體安裝和配置步驟
(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
9、系統配置
(1)、允許IP轉發
vim /etc/sysctl.conf
(2)、允許防火牆端口
創建文件/usr/lib/firewalld/services/l2tpd.xml 並修改
vim /usr/lib/firewalld/services/l2td.xml
10、初始化並重啓防火牆
firewall-cmd --reload
11、啓動並設置開機自啓動服務
systemctl enable pptpd ipsec xl2tpd
systemctl restart pptpd ipsec xl2tpd
六、問題解決
按照以上的配置方法,使用客戶端測試連接性,發現不能正常連接,現在下面進行具體解決方法
1、測試ipsec的安裝
ipsec verify
3、添加防火牆列表
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
4、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
5、vim /etc/ipsec.d/linuxcc_l2tp.secrets
6、防火牆列表配置
firewall-cmd --add-port=1701/udp
firewall-cmd --add-port=500/udp
firewall-cmd --add-port=4500/udp
firewall-cmd --list-ports
7、設置端口轉發機制
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
8、開啓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
9、經過以上的排除,終於能夠通過賬號連接成功了,但是又出現新的問題了 ,能夠訪問內部網絡了,不能訪問互聯網,查了很多資料,測試了很多次,發現是服務器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不能正常訪問,然後進行進一步排查。
10、不能通過公網IP地址訪問 ,需要通過公司的路由器網關做服務器端口映射,將公司的公網IP對應的1701 4500 500 端口 使用udp協議映射到內網l2tp服務的IP地址(172.28.5.201)的端口 1701 4500 500 ,使用udp協議。
七、客戶端驗證:
1、windows 10 操作系統客戶端驗證
(1)點擊windows10 的“設置”-然後點擊“網絡和Internet”
(2)、點擊“***”選擇中,然後點擊“***”連接
(3)彈出的對話框,填寫相應的信息:
(4)、下面要對剛建立的l2tp進行簡單的配置:
點擊“以太網”,然後點擊“更改適配器選項”
(5)設置完成後,然後進行連接
如果顯示已連接,這表示連接成功。
(6)、測試訪問內網是否成功
ping 服務器內網IP地址
2、windows7 客戶端連接測試
(1)、右擊桌面右下角網絡圖標,然後打開“網絡和共享中心”。在打開的界面點擊“設置新的連接或網絡”
(3)、在彈出的頁面中點擊“連接到工作區”,點擊下一步,然後再彈出的界面選擇“使用我的Internet連接(×××)”:
(4)、然後再Internet地址中輸入L2tp的IP地址,名稱可自定義,然後點擊下一步,輸入賬號密碼,也可在後續連接時輸入:
(5)、點擊“跳過”按鈕,然後在“網絡和共享中心”點擊左側的“更改適配器設置”:
(6)然後進行簡單的配置,如下圖:
(7)、點擊上圖中的“高級設置”,在彈出的界面選擇“使用預共享的密鑰作身份驗證”並輸入密鑰,然後點擊“確定”,
(8)、選擇剛剛創建的L2tp連接,然後進行連接:
(9)提示連接成功後,然後進行測試