傳說工業標準的Internet隧道協議---L2TP

  簡介

    L2TP是一種工業標準的Internet隧道協議,功能大致和PPTP協議類似,比如同樣可以對網絡數據流進行加密。不過也有不同之處,比如PPTP要求網絡爲IP網絡,L2TP要求面向數據包的點對點連接;PPTP使用單一隧道,L2TP使用多隧道;L2TP提供包頭壓縮、隧道驗證,而PPTP不支持。

    以上是來源於百度百科的專業術語解釋,當然看不懂也正常,看懂了說明你厲害,用人類看的懂的語言翻譯一下就是一種加密的傳輸協議,我們常常說×××出去上Facebook、YouTu這些其實就是連接了***,而***的傳輸協議其中就包括L2TP,常見的還有pptp。

eac4b74543a982267c345a9b8282b9014b90eb91.jpg


  協議結構

4d086e061d950a7b1add72cd0ad162d9f3d3c9ca.jpg

L2TP 命令頭 :12 16 32 bit

T L X X S X O P X X X X VER Length

Tunnel ID Session ID

Ns (opt) Nr (opt)

Offset Size (opt) Offset Pad (opt)

T ― T 位表示信息類型。若是數據信息,該值爲0;若是控制信息,該值爲1。

L ― 當設置該字段時,說明 Length 字段存在,表示接收數據包的總長。對於控制信息,必須設置該值。

X ― X 位爲將來擴張預留使用。在導出信息中所有預留位被設置爲0,導入信息中該值忽略。

S ― 如果設置 S 位,那麼 Nr 字段和 Ns 字段都存在。對於控制信息,S 位必須設置。

O ― 當設置該字段時,表示在有效負載信息中存在 Offset Size 字段。對於控制信息,該字段值設爲0。

P - 如果 Priority (P)位值爲1,表示該數據信息在其本地排隊和傳輸中將會得到優先處理。

Ver ― Ver 位的值總爲002。它表示一個版本1 L2TP 信息。

Length ― 信息總長,包括頭、信息類型 AVP 以及另外的與特定控制信息類型相關的 AVPs。

Tunnel ID ― 識別控制信息應用的 Tunnel。如果對等結構還沒有接收到分配的 Tunnel ID,那麼 Tunnel ID 必須設置爲0。一旦接收到分配的 Tunnel ID,所有更遠的數據包必須和 Tunnel ID 一起被髮送。

Call ID ― 識別控制信息應用的 Tunnel 中的用戶會話。如果控制信息在 Tunnel 中不應用單用戶會話(例如,一個 Stop-Control-Connection-Notification 信息),Call ID 必須設置爲0。

Nr ― 期望在下一個控制信息中接收到的序列號。

Ns ― 數據或控制信息的序列號。

Offset Size & Pad ― 該字段規定通過 L2F 協議頭的字節數,協議頭是有效負載數據起始位置。Offset Padding 中的實際數據並沒有定義。如果 Offset 字段當前存在,那麼 L2TP 頭 Offset Padding 的最後八位字節後結束。


  與PPTP的區別

1.PPTP要求互聯網絡爲IP網絡。L2TP只要求隧道媒介提供面向數據包的點對點的連接。L2TP可以在IP(使用UDP),幀中繼永久虛擬電路(PVCs),X.25虛擬電路(VCs)或ATM VCs網絡上使用。

2.PPTP只能在兩端點間建立單一隧道。L2TP支持在兩端點間使用多隧道。使用L2TP,用戶可以針對不同的服務質量創建不同的隧道。

3.L2TP可以提供包頭壓縮。當壓縮包頭時,系統開銷(overhead)佔用4個字節,而PPTP協議下要佔用6個字節。

4、L2TP自身不提供隧道驗證,從L2TP的包頭可以看出。隧道認證是由PPP(pap或chap)協議提供!而PPTP則支持隧道驗證,PPTP自身就是PPP的擴展!但是當L2TP或PPTP與IPsec共同使用時,可以由IPsec提供隧道驗證,不需要在第2層協議上驗證隧道.

5.L2TP訪問集中器(L2TP Access Concentrator,LAC)是一種附屬在網絡上的具有PPP端系統和L2Tpv2協議處理能力的設備,它一般就是一個網絡接入服務器軟件,在遠程客戶端完成網絡接入服務的功能。

6.L2TP網絡服務器(L2TP Network Server,LNS)是用於處理L2TP協議服務器端的軟件。


  實踐嘗試

部署有兩種方法:一種是一鍵腳本安裝搭建,另一種則是手動DIY安裝,前者比較適用於經典網絡的服務器,沒有區分內外網IP地址,做起來比較簡單,而後者相對比較複雜,比較適合中高級玩家打的副本;


安裝前的檢查

執行命令:cat /dev/net/tun

#檢測是否支持TUN模塊,如果返回信息爲:cat: /dev/net/tun: File descriptor in bad state 說明正常


執行命令:cat /dev/ppp

#檢測是否支持ppp模塊,如果返回信息爲:cat: /dev/ppp: No such device or address 說明正常



方法一:腳本安裝

cd /root
wget http://lamp.teddysun.com/files/l2tp.sh    #CentOS、Fedora或Redhat系統時執行
wget http://lamp.teddysun.com/files/l2tp_ubuntu.sh    #Ubuntu系統時執行此命令
chmod +x *.sh
./l2tp.sh    #CentOS、Fedora或Redhat系統時執行
./l2tp_ubuntu.sh    #Ubuntu系統時執行此命令

等待出現
[Please input IP-Range:]設置網段,一般回車即可
[Please input PSK:]設置你預共享密鑰。

執行後,一直等待成功,會顯示相關配置信息。

生成的密碼是隨機的,需要修改的話,執行  

vim /etc/ppp/chap-secrets



方法二:手動安裝

首先,我們需要先準備準備

yum install -y make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced man
yum install -y openswan ppp xl2tpd


然後我們一步一步的來配置

(1) 配置編輯/etc/ipsec.conf文件

vim /etc/ipsec.conf


config setup
    protostack=netkey
    nhelpers=0
    uniqueids=no
    interfaces=%defaultroute
    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!${iprange}.0/24
    dumpdir=/var/run/pluto/

conn l2tp-psk
    rightsubnet=vhost:%priv
    also=l2tp-psk-nonat

conn l2tp-psk-nonat
    authby=secret
    pfs=no
    auto=add
    keyingtries=3
    rekey=no
    ikelifetime=8h
    keylife=1h
    type=transport
    left=%defaultroute
    leftid=47.52.18.101    #這裏將IP地址修改爲服務器的外網地址
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any
    dpddelay=40
    dpdtimeout=130
    dpdaction=clear
    sha2-truncbug=yes

include /etc/ipsec.d/*.conf

(2) 配置編輯/etc/ipsec.secrets文件

vim /etc/ipsec.secrets


include /etc/ipsec.d/*.secrets
%any %any : PSK "123456"      #"123456"這裏設置的是設置共享祕鑰


(3) 修改/etc/sysctl.conf,並使其生效


vim /etc/sysctl.conf


vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120

# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.default.log_martians = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2

# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
kernel.sysrq = 1

sysctl -p    #生效上面的修改使用如下命令


(4) 驗證ipsec運行狀態

ipsec restart
ipsec verify

如果出現如下內容,說明已經成功:


  1. Checking your system to see if IPsec got installed and started correctly:
    Version check and ipsec on-path                                 [OK]
    Linux Openswan U2.6.32/K2.6.32-431.20.3.0.1.el6.centos.plus.x86_64 (netkey)
    Checking for IPsec support in kernel                            [OK]
    SAref kernel support                                           [N/A]
    NETKEY:  Testing for disabled ICMP send_redirects              [OK]
    NETKEY detected, testing for disabled ICMP accept_redirects     [OK]
    Checking that pluto is running                                  [OK]
    Pluto listening for IKE on udp 500                             [OK]
    Pluto listening for NAT-T on udp 4500                          [OK]
    Checking for 'ip' command                                       [OK]
    Checking /bin/sh is not /bin/dash                               [OK]
    Checking for 'iptables' command                                 [OK]
    Opportunistic Encryption Support                                [DISABLED


(5) 配置編輯/etc/xl2tpd/xl2tpd.conf文件

vim /etc/xl2tpd/xl2tpd.conf


[global]
port = 1701

[lns default]
ip range = 10.10.20.1-10.10.20.5    #這裏設置IP地址分配的地址段
local ip = 10.10.20.254    #設置網關地址
require chap = yes
refuse pap = yes
require authentication = yes
name = l2tpd
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes


(6) 配置用戶名,密碼:編輯 /etc/ppp/chap-secrets

vim /etc/ppp/chap-secrets


# Secrets for authentication using CHAP
# client    server  secret      IP addresses
 Kemin     l2tpd   Kemin       10.10.20.1
 
# 用戶名     連接協議    密碼    指定IP地址


(7) 重啓xl2tp

service xl2tpd restart


(8) 添加自啓動

chkconfig xl2tpd on
chkconfig iptables on
chkconfig ipsec on


(9) 防火牆配置轉發規則

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# 允許已建立的或相關連的通行
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允許本地迴環接口
-A INPUT -i lo -j ACCEPT

# 允許指定主機使用ssh協議
-A INPUT -m tcp -p tcp --dport 22 -j ACCEPT

# 允許外網訪問l2tp協議的端口
-A INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.10.20.0/24  -j ACCEPT

# 拒絕其他未允許的規則訪問
-A INPUT -j DROP
-A FORWARD -j REJECT
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

#允許分配的地址段從內網網卡轉發
-A POSTROUTING -s 10.10.20.0/24 -j SNAT --to-source 172.31.243.141
COMMIT


OK,到這裏爲止,基本的服務已經配置好了,接下來連接試試


  驗證結果

手機和電腦上都是可以連接的,但是電腦連接的時候彈出報錯,下面是解決思路,可供參考

1、檢查IPsec服務時候開啓;

2、Win+R調出運行輸入regedit回車,打開註冊表單擊以下註冊表子項,HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters,新建AllowL2TPWeakCrypto的Dword值1;


  最後總結

我們簡單總結一下,我們這篇教程裏面用到的軟件有:

openswan(ipsec) : 提供一個密鑰
ppp :提供用戶名和密碼
xl2tpd : 提供L2TP服務
sysctl : 提供服務器內部轉發
iptables : 提供請求從服務器內部轉向外部,外部響應轉向服務器內部

感覺對你有用的話點個贊或收藏支持支持唄,如果在動手的過程中有什麼問題也可以在下方留言,我會第一時間爲你解答的喲~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章