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 vpn@'%' IDENTIFIED BY 'vpn123456' WITH GRANT OPTION;
    GRANT ALL ON openvpn.* TO vpn@'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
    #搜索
    root@tester:~# apt-cache search incron
    #安装
    root@tester:~# 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

猜你喜欢

转载自blog.csdn.net/weixin_41474364/article/details/83684681