1. 程式人生 > >Ubuntu 18.04 從頭配置 openVPN MySQL+PAM VPN系統

Ubuntu 18.04 從頭配置 openVPN MySQL+PAM VPN系統

環境

server:

Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic

client:

OS 名稱:Microsoft Windows 7 企業版
OS 版本:6.1.7601 Service Pack 1 Build 7601


一、為 root 使用者開啟 ssh 登入

  1. 修改root密碼
    sudo passwd root
  2. 以其他賬戶登入,通過nano編輯配置檔案
    su - root
    nano /etc/ssh/sshd_config

    其中nano為編輯器,與vi類似,但相比於vi更加類似於Windows環境的編輯器,所以更加易用,nano的最後兩行是按鍵提示
  3. 修改檔案中的如下內容
    #permitrootlogin without-password

    permitrootlogin yes
  4. 儲存
    ctrl + x
  5. 重啟 sshd
    systemctl restart sshd

現在就可以直接用root賬戶登入了


二、配置 openVPN

一、 修改源

  1. 檢視原始檔
    cat /etc/apt/sources.list
  2. 修改原始檔
  • 可以直接覆蓋原始檔
    mv 修改好的檔案 要修改的檔案
  • 也可以修改內容
    nano /etc/apt/sources.list
    ctrl + x 儲存

二、 從本地原始碼包安裝 openVPN

  1. 將壓縮包移動到/home目錄下
    mv 原始碼包(路徑) /home
  2. 解壓
    tar xvf 包
  3. 執行 configure 檢查缺少的包
    ./configure --prefix=/usr
  4. 根據缺少的包查詢包名
    apt-cache search 包名
  5. 安裝相應的包
    apt-get install 包名
    直到 3.檢查通過
  6. 編譯
    make
  7. 安裝
    make install
  8. 複製openvpn-plugin-auth-pam.so
    檔案到/etc/openvpn
    先用find . | grep查詢外掛路徑
    得到路徑/usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so
    再用cp -p /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so /etc/openvpn
  • 其中會提示缺少 gcc 和 gcc+ ,Ubuntu中提供了 build-essential 軟體包,安裝了該軟體包,編譯c/c++所需要的軟體包也都會被安裝
    apt-get install build-essential
  • 另外幾個包
    libssl1.0-dev liblz4-dev liblzo2-dev libpam0g-dev

三、 檢查是否安裝成功

ls /usr/sbin
檢視有沒有 openVPN 的選項,有就成功了
openVPN安裝成功


三、MySQL 安裝和配置

  1. 查詢 MySQL 需要的包
    apt-cache search mysql
  2. 安裝兩個包
    apt-get install mysql mysql-client mysql-server
  3. 重要的一步:設定安全策略
    mysql_secure_installation
    在這裡設定資料庫的 root 賬戶密碼
  4. 檢視 MySQL 執行狀態
    systemctl status mysql
  5. 設定 MySQL 開機啟動
    systemctl enable mysql
    附啟動、關閉、重啟、設定開機是否自啟動命令(其他服務也適用):
    #檢視服務狀態  
    systemctl status mysql
    #設定服務開機啟動  
    `systemctl enable mysql`
    #設定服務開機不啟動  
    `systemctl disable mysql`
    #啟動服務  
    `systemctl start mysql`
    #關閉服務  
    `systemctl stop mysql`
    #重啟服務  
    `systemctl restart mysql`
    
  6. 登入 MySQL
    mysql -uroot -p12345678
  7. 建立 openvpn 資料庫
    -- 新增vpn使用者,允許訪問資料庫
    GRANT ALL ON openvpn.* TO [email protected]'%' IDENTIFIED BY 'vpn123456' WITH GRANT OPTION;
    GRANT ALL ON openvpn.* TO [email protected]'localhost' IDENTIFIED BY 'vpn123456' WITH GRANT OPTION;
     
    -- 更新sql資料庫的許可權設定,這步很重要,少了會導致測試認證失敗
    flush privileges;
     
    -- 建立資料庫openvpn
    CREATE DATABASE IF NOT EXISTS openvpn DEFAULT CHARSET utf8;
     
     
    -- 切換資料庫
    USE openvpn;
     
     
    -- 建立使用者資料表
    CREATE TABLE IF NOT EXISTS user (
        username char(32) COLLATE utf8_unicode_ci NOT NULL,
        password char(128) COLLATE utf8_unicode_ci NOT NULL,
        active int(10) NOT NULL DEFAULT 1,                            
        creation timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        expired_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        name varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
        email char(128) COLLATE utf8_unicode_ci DEFAULT NULL,
        note text COLLATE utf8_unicode_ci NULL,
        quota_cycle int(10) NOT NULL DEFAULT 30,
        quota_bytes bigint(20) NOT NULL DEFAULT 10737418240,
        enabled int(10) NOT NULL DEFAULT 1,
        PRIMARY KEY (username),
        KEY idx_active (active),
        KEY idx_enabled (enabled)
    ) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
     
    -- 建立日誌資料表
    CREATE TABLE IF NOT EXISTS log (
        username varchar(32) COLLATE utf8_unicode_ci NOT NULL,
        start_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        end_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        trusted_port int(10) DEFAULT NULL,
        protocol varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
        remote_ip varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
        bytes_received bigint(20) DEFAULT 0,
        bytes_send bigint(20) DEFAULT 0,
        status int(10) NOT NULL DEFAULT 1,
        KEY idx_username (username),
        KEY idx_start_time (start_time),
        key idx_end_time (end_time)
    ) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
     
    -- 新增測試使用者
    INSERT INTO user(name,username, password, expired_time) VALUES('test','test', ENCRYPT('123456'), DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 30 DAY));
    

四、安裝配置 pam_mysql

一、安裝和配置

  1. 更新
    apt-get update
  2. 搜尋apt-cache search pamapt-cache search libpam_mysql
    安裝apt-get install libpam_mysql
  3. 搜尋apt-cache search pam-krb5
    安裝apt-get install libpam-krb5
  4. 搜尋apt-cache search sasl
    安裝apt-get install sasl2-bin
  5. 設定saslauthd開機自啟
    systemctl enable saslauthd
  6. 建立/etc/pam.d/openvpn檔案
    cd /etv/pam.d
    touch openvpn
    nano ./openvpn
    auth required /lib/x86_64-linux-gnu/security/pam_mysql.so  user=vpn passwd=vpn123456 host=localhost db=openvpn table=user usercolumn=username passwdcolumn=password where=active=1 sqllog=0 crypt=1 
    account required /lib/x86_64-linux-gnu/security/pam_mysql.so user=vpn passwd=vpn123456 host=localhost db=openvpn table=user usercolumn=username passwdcolumn=password where=active=1 sqllog=0 crypt=1 
    #crypt(0) -- Used to decide to use MySQL's PASSWORD() function or crypt() 
    #0 = No encryption. Passwords in database in plaintext. NOT recommended! 
    #1 = Use crypt 
    #2 = Use MySQL PASSWORD() function
    
    注意:檔案中的路徑需要替換
    先在根目錄下查詢find . | grep pam_mysql.so
    將得到路徑替換檔案中的
  7. 測試認證
    #驗證本地登入,使用者名稱和密碼是登入 Ubuntu 使用的使用者名稱和密碼 
    testsaslauthd -u user -p pwd -s sshd  
    #驗證openvpn,使用者名稱密碼是資料庫openvpn.user中的使用者名稱和密碼(test,123456)  
    testsaslauthd -u username -p password -s openvpn  
     
    #成功會顯示: 0: OK "Success."</code>
    

二、可能出現的問題

  1. testsaslauthd -u test -p 123456 -s openvpn測試認證時顯示:

    connect() : No such file or directory
    
  2. systemctl status saslauthd檢視saslauthd執行狀態如下顯示active(exited)

        saslauthd.service - LSB: saslauthd startup script
        Loaded: loaded (/etc/init.d/saslauthd; generated)
        Active: active (exited) since Thu 2018-11-0114:58:31 UTC; 43s ago
        Docs: man:systemd-sysv-generator(8)
    
  3. 解決方法
    首先可能是未建立/etc/pam.d/openvpn檔案
    其次可能是/etc/default/saslauthd檔案中的START=no沒有修改為yes

    
    # Settings for saslauthd daemon
    # Please read /usr/share/doc/sasl2-bin/README.Debian for details.
    #
    
    # Should saslauthd run automatically on startup? (default: no)
    START=no
    
    # Description of this saslauthd instance. Recommended.
    # (suggestion: SASL Authentication Daemon)
    DESC="SASL Authentication Daemon"
    
    # Short name of this saslauthd instance. Strongly recommended.
    # (suggestion: saslauthd)
    NAME="saslauthd"
    
    # Which authentication mechanisms should saslauthd use? (default: pam)
    #
    

    最後systemctl restart saslauthd重啟


五、在 Windows 端生成證書

  1. 進入openVPN安裝目錄
    cd E:\OpenVPN\easy-rsa
    E:
    dir
  2. 複製檔案
    copy vars.bat.sample vars.bat
  3. 執行檔案vars.bat
    vars.bat
  4. 執行檔案clean-all.bat
    clean-all.bat
  5. 執行檔案build-ca.bat
    build-ca.bat
  6. 執行檔案build-key-server.bat openvpn1.bat
    build-key-server.bat openvpn1.bat
  7. 執行檔案build-key.bat szq
    build-key.bat szq
  8. 執行檔案build-key.bat szq1
    build-key.bat szq1
    7.和 8.生成了兩個客戶端分別是 szq 和 szq1
  9. 執行檔案build-dh.bat
    build-dh.bat
    生成的證書在keys資料夾內
  10. 用 winscp 將 keys 資料夾複製到伺服器的 etc/openvpn/easy-rsa

六、建立/etc/openvpn/server.conf檔案

一、 server.conf 檔案內容如下

port 1194        #指定埠
proto tcp     #指定採用的傳輸協議,可以選擇tcp或udp
dev tap       #指定建立的通訊隧道型別,可選tun或tap 
#tap模式也就是橋接模式,通過軟體在系統中模擬出一個tap裝置,該裝置是一個二層裝置,同時支援鏈路層協議。
#tun模式也就是路由模式,通過軟體在系統中模擬出一個tun路由,tun是ip層的點對點協議。

ca /etc/openvpn/easy-rsa/keys/ca.crt              #ca證書
cert /etc/openvpn/easy-rsa/keys/openvpn1.crt		#伺服器公鑰
key /etc/openvpn/easy-rsa/keys/openvpn1.key		#伺服器私鑰
dh /etc/openvpn/easy-rsa/keys/dh2048.pem         #指定迪菲赫爾曼引數的檔案路徑

 
local 10.6.0.103   #本機IP,這是一個內網IP,不過在路由上已經做了IP的對映到一個外網ip
server 10.8.0.0 255.255.255.0    #指定虛擬區域網佔用的IP地址段和子網掩碼,此處配置的伺服器自身佔用10.8.0.1。

#設定管理,通過此埠管理管理正在連線的使用者
management 10.6.0.103 1195

#定義openvpn執行時使用的使用者及使用者組。
user nobody
group nogroup
 
keepalive 20 120     # 保持連線,每 20 秒 ping 一次,若是 120 秒未收到封包,即認為 client 斷線
 
#mysql 認證,如不需要可註釋掉
#plugin /etc/openvpn/openvpn-auth-pam.so /usr/sbin/openvpn
plugin /etc/openvpn/openvpn-plugin-auth-pam.so openvpn

#client-cert-not-required       #不請求客戶的CA證書,使用User/Pass驗證
username-as-common-name       #使用客戶提供的UserName作為Common Name
 
 
;金鑰不用重協商,客戶端也需要設定,否則iOS下,會出現一段時間後自動斷開的情況
reneg-sec 0

#伺服器自動給客戶端分配IP後,客戶端下次連線時,仍然採用上次的IP地址(第一次分配的IP儲存在ipp.txt中,下一次分配其中儲存的IP)
ifconfig-pool-persist ipp.txt     

#push "redirect-gateway def1 bypass-dhcp"
#push "dhcp-option DNS 8.8.8.8"
#push "dhcp-option DNS 8.8.4.4"
#push "dhcp-option DNS 192.168.1.1"
#讓所有客戶端都增加到10.6.0.0/24
push "route 10.6.0.0 255.255.255.0"
 
client-to-client      #允許客戶端與客戶端相連線,預設情況下客戶端只能與伺服器相連線
 
comp-lzo      #開啟VPN連線壓縮,如果伺服器端開啟,客戶端也必須開啟

persist-key   #通過keepalive檢測超時後,重新啟動VPN,不重新讀取keys,保留第一次使用的keys。
persist-tun   #通過keepalive檢測超時後,重新啟動VPN,一直保持tun或者tap裝置是linkup的。否則網路連線,會先linkdown然後再linkup。
verb 3        #指定日誌檔案的記錄詳細級別,可選0-9,等級越高日誌內容越詳細

max-clients 1000              #最多允許連線1000個客戶端
;script-security 3    #OpenVPN 2.1需要'--script-security 2'或更高版本來呼叫使用者定義的指令碼或可執行檔案
 
log         /etc/openvpn/logs/openvpn.log      #指定記錄OpenVPN的日誌檔案路徑
log-append  /etc/openvpn/logs/openvpn.log
status /etc/openvpn/logs/openvpn-status.log    #指定記錄OpenVPN狀態的日誌檔案路徑

#設定連線和斷開指令碼,以便統計流量資訊 重要
#client-connect /etc/openvpn/connect.sh
#client-disconnect /etc/openvpn/disconnect.sh

二、 檔案內容如下

#!/bin/sh
 
DB='openvpn'
DBADMIN='vpn'
DBPASSWD='vpn123456'
 
mysql -u$DBADMIN -p$DBPASSWD -e "INSERT INTO log(username,start_time,trusted_port,protocol,remote_ip,status) VALUES('$common_name',now(),'$trusted_port’,'$proto_1','$ifconfig_pool_remote_ip',1)" $DB

三、 檔案內容如下

#!/bin/sh
 
DB='openvpn'
DBADMIN='vpn'
DBPASSWD='vpn123456'
 
#插入日誌
mysql -u$DBADMIN -p$DBPASSWD -e "
UPDATE log SET end_time=now(),bytes_received=$bytes_received,bytes_send=$bytes_send,status=0 WHERE remote_ip='$ifconfig_pool_remote_ip' AND username='$common_name' AND status=1
" $DB
 
#如果流量超出,則鎖定使用者
mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE user.username IN (SELECT username FROM (SELECT log.username AS username, quota_bytes FROM user, log WHERE log.username='$common_name' AND log.username=user.username AND log.status=0 AND TO_DAYS(NOW())-TO_DAYS(start_time)<=quota_cycle GROUP BY log.username HAVING SUM(bytes_received)+SUM(bytes_sent)>=quota_bytes) AS u);" $DB
 
#如果過期時間超出,則鎖定使用者
mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE username='$common_name' AND UNIX_TIMESTAMP(now())>UNIX_TIMESTAMP(expired_time);" $DB

七、 設定轉發

一、 開啟路由核心轉發

圖中紅框內容改為綠框內容
開啟路由核心轉發
為了讀取sysctl.conf檔案並且讓調整後設置對當前系統的session生效,鍵入如下命令:
sysctl -p

二、 設定防火牆的埠轉發

  1. 先檢視網絡卡資訊
    ifconfig -a顯示全部介面資訊
    紅框 ens160 表示第一塊網絡卡
    所有介面資訊
  2. 輸入命令設定轉發
    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens160 -j MASQUERADE
    向 NAT 表的 POSTROUTING 鏈條列尾新增一條規則,規則的具體內容是:
    所有來自10.8.0.0/24、從ens160出去的資料包地址都偽裝成指定IP輸出,SNAT就是改變轉發資料包的源地址
  3. iptables 命令規則iptables [-t 表名] 選項 [鏈名] [條件] [-j 控制型別]iptables命令規則
    -P 設定預設策略:iptables -P INPUT (DROP|ACCEPT)
    -F 清空規則鏈
    -L 檢視規則鏈(列出已有規則)(-n 顯示IP數字 預設會反向解析成域名)
    -A 在規則鏈末尾加新規則
    -I INPUT/… num 在規則鏈頭部加入新規則
    -D INPUT/… num 刪除某一規則
    -s 匹配來源地址IP/MASK(!取反)
    -d 匹配目標地址
    -i 網絡卡名 匹配從這塊網絡卡流入的資料
    -o 網絡卡名 匹配從這塊網絡卡流出的資料
    -p 匹配協議(tcp,udp,icmp)
    –dport num 匹配目標埠
    –sport num 匹配來源埠
    -i eth0 匹配從網路介面 eth0 進來
    -o eth0 匹配從網路介面 eth0 出去
    DNAT:目標地址轉換
    SNAT:原地址轉換
    -j SNAT --to-source
    -j DNAT --to-destination
    -j MASQUERADE #等價於-j SNAT --to-source一起寫。

八、 新增定時任務定時統計流量、超過流量或已過期的使用者將踢出連線

  1. 新增/etc/openvpn/openvpn_flow_calc.sh 檔案,主要是通過分析 openvpn-status.log 檔案來即時統計使用者流量資訊
    #!/bin/sh
     
    NAME_TAG=("OpenVPN CLIENT LIST" "ROUTING TABLE" "GLOBAL STATS" "END")
    LOG_FILE="/etc/openvpn/openvpn-status.log"
     
    DB='openvpn'
    DBADMIN='vpn'
    DBPASSWD='vpn123456'
     
    flow_info_index=0
    function IsFlowInfoStatus()
    {
        if [ "${1}" == "${NAME_TAG[0]}" ]
        then
            #進入客戶端列表,返回[1]
            flow_info_index=1
            return 1
        elif [ "${1}" == "${NAME_TAG[1]}" ] || [ "${1}" == "${NAME_TAG[2]}" ] || [ "${1}" == "${NAME_TAG[3]}" ]
        then
            #進入其他資訊,返回結束[0]
            flow_info_index=0
            return 0
        fi
     
        if [ ${flow_info_index} -lt 1 ]
        then
            #沒有進入客戶端列表,返回[0]
            return 0
        fi
        
        let "flow_info_index+=1"
        if [ ${flow_info_index} -lt 4 ]
        then
            #進入客戶端列表,還沒有進入IP列表,返回[1]
            return 1
        fi
        
        #進入到IP列表,返回[2]
        return 2;
    }
     
    flow_infos=("")
    function GetFlowInfo()
    {
        OLD_IFS=${IFS}
        IFS=$2
        unset flow_infos
        flow_infos=(${1})
        IFS=${OLD_IFS}
        #echo "flow_infos: ${#flow_infos[@]}"
    }
     
    function StringSplit()
    {
        local OLD_IFS=${IFS}
        IFS=$2
        local array=(${1})
        IFS=${OLD_IFS}
        echo ${array[@]}
    }
     
    function UpdateUserFlowToDB()
    {
        local common_name=${flow_infos[0]}
        local bytes_received=${flow_infos[2]}
        local bytes_sent=${flow_infos[3]}
        #echo "username: $username received: $received sents: $sents"
        
        local ip_port=(`StringSplit ${flow_infos[1]} ':'`)
        local trusted_ip=${ip_port[0]}
        local trusted_port=${ip_port[1]}
        #echo "ip: $trusted_ip port: $trusted_port"
        
        #更新日誌
        mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE log SET end_time=now(),bytes_received=$bytes_received,bytes_send=$bytes_send WHERE trusted_port=$trusted_port AND username='$common_name' AND status=1" $DB
     
        #統計流量
        mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE user.username IN (SELECT username FROM (SELECT log.username AS username, quota_bytes FROM user, log WHERE log.username='$common_name' AND log.username=user.username AND TO_DAYS(NOW())-TO_DAYS(start_time)<=quota_cycle GROUP BY log.username HAVING SUM(bytes_received)+SUM(bytes_sent)>=quota_bytes) AS u);" $DB
        
        #判斷使用者是否被禁用或過期
        mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE username='$common_name' AND (enabled=0 or UNIX_TIMESTAMP(now())>UNIX_TIMESTAMP(expired_time));" $DB
        
        local SQL="SELECT COUNT(*) FROM user WHERE username='$common_name' AND active=0"
        local COUNT=($(mysql -u$DBADMIN -p$DBPASSWD -e "$SQL" $DB))
        if [ ${COUNT[1]} -ne 0 ]
        then
            (sleep 1
            echo kill $common_name
            sleep 1)|telnet localhost 7505
        fi
    }
     
    #判斷使用者是否過期
    #mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET enabled=0 WHERE UNIX_TIMESTAMP(now())>UNIX_TIMESTAMP(expired_time);" $DB
     
    while read LOG_FILE; do
        
        IsFlowInfoStatus "${LOG_FILE}"
        status=$?
        #echo "output: ${status}"
        if [ ${status} -eq 2 ]
        then
            GetFlowInfo "${LOG_FILE}" ","
            if [ ${#flow_infos[@]} -ne 5 ]
            then
                continue
            fi
            UpdateUserFlowToDB
        fi
    done < ${LOG_FILE}
    
  2. 安裝 incron
    #搜尋
    [email protected]:~# apt-cache search incron
    #安裝
    [email protected]:~# apt-get install incron
    
  3. 新增/etc/incron.d/openvpn 檔案,每分鐘執行指令碼,檔案內容如下:
    * * * * * root /etc/openvpn/openvpn_flow_calc.sh
    

九、 測試服務

  • 啟動openvpn服務
    openvpn --daemon --config /etc/openvpn/server.conf
  • 檢視服務是否啟動
    ps -ef | grep openvpn
    如圖即啟動成功
    服務啟動成功
  • 如果啟動不成功檢視日誌排錯
    cat /etc/openvpn/logs/openvpn.log

十、 配置客戶端

一、 設定網絡卡

新增tap

二、 配置檔案

client           #指定當前VPN是客戶端
dev tap       #必須與伺服器端的保持一致
proto tcp     #必須與伺服器端的保持一致
remote 10.6.0.103 1194    #設定Server的IP地址和埠,這個地方需要嚴格和Server端保持一致。
resolv-retry infinite           #斷線自動重新連線
nobind                          #不繫結特定的本地埠號
#route 10.172.192.0 255.255.255.0
persist-key
persist-tun
ca ca.crt               #ca證書
cert szq.crt            #客戶端公鑰
key szq.key             #客戶端私鑰
#remote-cert-tls server
comp-lzo                #與伺服器保持一致
verb 4                  #指定日誌檔案的記錄詳細級別,可選0-9,等級越高日誌內容越詳細
auth-user-pass          #詢問使用者名稱和密碼

<ca>
#複製ca.crt的內容
</ca>
<cert>
複製szq.crt的內容
</cert>
<key>
複製szq.key的內容
</key>

十、 連線客戶端時出現問題

一、 在開啟使用者連線日誌記錄後

  • 報錯./xx.sh: Permission denied
    需要修改 nobody 的許可權:
    nano /etc/sudoers編輯 sudoers 檔案,在紅框的 root 下一行新增nobody ALL=(ALL) NOPASSWD:ALL
    修改nobody的許可權

  • 日誌報錯WARNING: External program may not be called unless '--script-security 2' or higher is enabled. See --help text or man page for detailed info.
    在server.conf中新增script-security 3


十一、 使用者訪問許可權控制

每個客戶端分配不同的IP地址,然後利用 iptables 防火牆對不同的 IP 地址進行控制;

  • 為客戶端分配IP段:
    server 10.8.2.0 255.255.255.0
  • 給指定客戶端分配地址,根據名稱獲取指定客戶端
    ifconfig-push 10.8.2.5 10.8.2.6
  • 來自10.8.2.0的資料包只有訪問10.66.4.12時才能通過:
    iptables -A FORWARD -i tun0 -s 10.8.2.0/24 -d 10.66.4.12 -j ACCEPT

參考文章1
參考文章2


N、需要掌握的命令

一、 cmd 命令

  • 檢視本機路由
    route print
  • 複製
    copy D:\原始目錄\檔案.字尾 E:\新目錄\檔案.字尾
    如果有同名檔案,需要覆蓋,那就在copy後加上/f這個引數,是一個斜槓加字母F。如果名稱中有空格,請把路徑用英文雙引號括起來。
  • 顯示d盤目錄列表
    dir d:\

二、 MySQL 命令

  • 更新資料表
    UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause];

三、 Ubuntu 命令

  • 檢視端口占用情況
    netstat -an
    顯示簡要資訊netstat -i
  • 啟動openVPN服務
    openvpn --daemon --config /etc/openvpn/server.conf
  • 檢視所有介面資訊
    ifconfig -a
    在這裡插入圖片描述
    顯示簡要資訊ifconfig -s
    ifconfig 網路裝置 引數可以顯示、修改、增加、刪除網路裝置的資訊,比如啟動指定網絡卡、配置IP地址、啟動關閉網路協議等
  • 所有日誌都在/var/log目錄下
    ls /var/log
    包括系統日誌(syslog),軟體包管理器日誌(dpkg.log),身份驗證日誌(auth.log)等
    日誌
  • 複製檔案
    cp -p 原始檔或目錄 目標檔案或目錄
      - a 通常在拷貝目錄時使用。它保留連結、檔案屬性,並遞迴地拷貝目錄
      - d 拷貝時保留連結
      - f 刪除已經存在的目標檔案而不提示
      - i 在覆蓋目標檔案之前將給出提示要求使用者確認
      - p 此時cp除複製原始檔的內容外,還將把其修改時間和訪問許可權也複製到新檔案中
      - r 若給出的原始檔是一目錄檔案,此時cp將遞迴複製該目錄下所有的子目錄和檔案。此時目標檔案必須為一個目錄名。
      - l 不作拷貝,只是連結檔案。
  • 查詢檔案
    find . | grep 檔名
    注意:查詢檔案之前要先進入要查詢的目錄,如果沒有就進入根目錄cd /
  • 檢視命令
    man xx
  • 檢視所有執行的程式
    ps -ef
    -e 顯示所有程序,環境變數
    -f 全格式
    -h 不顯示標題
    -l 長格式
    一般配合grep使用ps -ef | grep 程序名
  • 終止程序
    • kill -9 程序ID
      根據程序ID殺死程序,-9是強制終止退出
    • killall 程序名
      通過程式的名字,直接殺死所有程序,也可以使用-9強制殺死
  • chmod 777 xx.sh
    • Ubuntu中,chmod 755代表使用者對該檔案擁有讀,寫,執行的許可權,同組其他人員擁有執行和讀的許可權,沒有寫的許可權,其他使用者的許可權和同組人員許可權一樣。
    • chmod 777代表user,group和others 都有讀寫和可執行許可權。
    • 在終端輸入ls -al,可以看到如: -rwx-r–r– (一共10個引數)
      第一個跟引數跟chmod無關
      2-4引數:屬於user
      5-7引數:屬於group
      8-10引數:屬於others
      接下來就簡單了:r=>可讀 | w=>可寫 | x=>可執行
      r=4 w=2 x=1
      755就代表 rwx-xr-xr,而777代表rwx-rwx-rwx