存档2020

SoftEther VPN 搭建




SoftEther VPN 搭建


linux服务器端

    # yum install gcc zlib-devel openssl-devel readline-devel ncurses-devel
    # wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.29-9680-rtm/softether-vpnserver-v4.29-9680-rtm-2019.02.28-linux-x64-64bit.tar.gz
    # tar zxvf softether-vpnserver-v4.29-9680-rtm-2019.02.28-linux-x64-64bit.tar.gz -C /usr/local/
    # cd /usr/local/vpnserver
    # make
        1                \\ 同意一些声明
        1
        1

    # vim /etc/systemd/system/vpnserver.service              \\ 创建 启动项
        [Unit] 
        Description=SoftEther Server 
        After=network.target 
        [Service] 
        Type=forking 
        ExecStart=/usr/local/vpnserver/vpnserver start 
        ExecStop= /usr/local/vpnserver/vpnserver stop

        [Install] 
        WantedBy=multi-user.target
        
    # iptables -I INPUT 4 -m state --state NEW -p tcp --dport 5555 -j ACCEPT   \\ 只放行了5555
    # cat /etc/resolv.conf               \\ 记录dns 后面 配置服务端会用到
    # systemctl start vpnserver           \\ 其他防火墙端口 自行尝试 这里可能以前开通过 可能还需要转发
    # systemctl stop vpnserver
    # systemctl enable vpnserver
    # systemctl list-unit-files | grep vpnserver
    # ./vpncmd        \\ 设置管理服务器ip及密码
        1              \\ 此为服务器选项
        47.91.219.64    \\ 输入 服务器ip 即可  端口号默认为8888 不必更改
        ............     \\ Specify Virtual Hub Name  不需要设置 直接回车
        ............      \\ 在windows服务器管理端设置空密码进入即可设置


windows 安装服务器管理端      \\ 仅 管理linux服务器配置

    新设置
        设置名 47.91.219.64
        主机名 47.91.219.64     \\ 填写ip即可  也可以写www.syk.my
        端口号 5555              \\ 端口选择 5555  8888  992 都可以
        密码   ---                \\ 第一次进入此密码 空 即可  之后 设置服务器端密码123456即可

    连接

        IPsec /L2TP /EtherIP/L2tpv3设置  简单安装   \\ 第一次 设置会弹出此对话框  以后在进入则没有
            vpn 的其他高级选项 --> 关闭按钮
            SoftEther VPN Server 管理器 --> 确定      \\ 第一次 设置会弹出此对话框 以后在进入则没有
            IPsec /L2TP /EtherIP/L2tpv3设置           \\ 此选择后期 可更改 在 IPsec/L2TP设置里 更改
                启用 L2TP 服务器功能(L2TP over IPsec)   \\ 前面 打 √
                IPsec 预共享密码 12345678                \\ 此密码为 连接l2tp/IPsec 的共享秘钥     

        SoftEther VPN Server管理器
            管理虚拟 HUB(A)
                管理用户 --> 新建 
                    用 户 名: teo          \\ vpn的用户名
                    验证类型: 密码验证
                    密码设置: 123456         \\ vpn的密码

                虚拟 NAT 和 虚拟 DHCP 服务器(V) 
                    启用 SecureNAT(E) --> 确定
                    SecureNAT 配置 --> DNS服务器地址1 100.100.2.136  \\ 查看此地址在linux服务器端

windows 客户端
    1 可以使用 vpn 创建l2tp/ipsec 进行连接 用户名teo 密码123456 秘钥12345678
    2 可以使用 SoftEther VPN Client 客户端进行连接
        安装
        添加新的VPN连接
            连接设置名: aaaaaa
            主机名:     47.91.219.64
            端口号:     5555
            HUB名:      DEFAULT
            用户名:     teo
            密码:       123456


注: 
    下载网址 https://www.softether-download.com/cn.aspx?product=softether
    SOFTETHER VPN SERVER --> windows 



lindux 客户端 搭建

    # wget https://www.softether-download.com/files/softether/v4.34-9745-rtm-2020.04.05-tree/Linux/SoftEther_VPN_Client/64bit_-_Intel_x64_or_AMD64/softether-vpnclient-v4.34-9745-rtm-2020.04.05-linux-x64-64bit.tar.gz
    # tar zxvf softether-vpnclient-v4.34-9745-rtm-2020.04.05-linux-x64-64bit.tar.gz -C /usr/local/
    # cd /usr/local/vpnserver/
    # make
    # vim /etc/systemd/system/vpnclient.service
        [Unit]
        Description=SoftEther Server
        After=network.target
        [Service]
        Type=forking
        ExecStart=/usr/local/vpnserver/vpnclient start
        ExecStop= /usr/local/vpnserver/vpnclient stop
        [Install]
        WantedBy=multi-user.target
        
    # /usr/local/vpnclient/vpnclient start  \\ 可以用此启动
    # systemctl start vpnclient              \\ 添加到 管理
    # ss -tnl                     \\ 9930端口被监听 好像也没啥用
    # cd /usr/local/vpnclient
    # vim lang.config               \\ 修改语言 为中文
        cn
    # ./vpncmd                        \\ 
        2 --> 直接回车

    VPN Client> help                   \\ 查看命令帮助
    VPN Client> AccountCreate           \\ 创建新的 连接
        连接设置名: admin                                 \\ 此名 为 随便设置的
        终端 VPN Server 主机名和端口号: 47.91.219.64:443    \\ 此为vpn服务器的ip及端口号
        终端虚拟 HUB 名称: DEFAULT                           \\ 服务器端创建的 默认为 DEFAULT
        连接用户名: admin                                     \\ * 此为 vpn的用户名
        使用虚拟 LAN 卡名称: admin                             \\ 没啥用 填admin即可
    VPN Client> AccountProxyNone            \\ 设置为tcp/ip直连方式
        连接设置名: admin                     \\ 设置 admin 的连接方式
    VPN Client> AccountPasswordSet             \\ 设置连接的 密码
        连接设置名: admin                        \\ 设置 admin 的
        密码    : 123456                         \\ *此为 vpn的 密码
        确认输入: 123456
        指定 standard 或者 radius: standard        \\ 填standard就好
    VPN Client> AccountList                        \\ 查看 连接列表 及状态
    VPN Client> AccountConnect                      \\ 连接vpn
    VPN Client> AccountList
        状态                   |已连接                 \\ 已连接即为成功、

    VPN Client> AccountDetailSet                       \\ 可设置高级选项 在这里没有设置
    VPN Client> AccountDelete             \\ 删除连接设置
    VPN Client> AccountDisconnect          \\ 断开连接中的连接设置

    注:
        1. 如果没有获取到ip地址 可以执行以下操作

            # ifconfig         \\ 会多网卡 vpn_vpn 会发现未获取到ip地址
                vpn_vpn:
            # route -n
            # ip route add 47.91.219.64/32 via 192.168.10.1 dev ens192   \\ 添加到vpn服务器的路由 走原来的网关
            # echo "ip route add 47.91.219.64/32 via 192.168.10.1 dev ens192" >> /etc/rc.local \\ 写进开机启动
            # dhclient vpn_vpn      \\ 获取ip地址
            # route -n               \\ 会发现自动添加了路由
            # curl ifconfig.me        \\ 查看外网ip 是否改变

            其他可能会用的命令

                # dhclient -r               \\ 释放ip地址
                # ip route del 18.163.188.1/32 via 115.146.177.1 dev ens224  \\ 删除路由

        2. 开启核心转发可以 充当中转服务器 会把所有收到的报文按照路由表转发出去
            # vim /etc/sysctl.conf
                net.ipv4.ip_forward = 1
            # sysctl -p



使用 VPN 桥接  内网与外网服务器          \\ 可以使外网服务器访问内网的ip  相当于内网穿透

    外网服务器搭建 vpnserver端             \\ 配置vpnserver 参照上面的 配置流程即可

        管理虚拟 HUB --> 管理用户 --> 新建   \\ 创建用户名 密码  用于 内网的连接 
            用户名: teo01
            全名: teo01
            密码: 123456
            确认密码: 123456

        动态DNS
            分配的动态 DNS 主机名
                vpn404782520.softether.net  \\ 这个名字要记住 添加到服务器端 用于连接 亦可以自定义修改

        连接到管理端 --> 本地网桥设置
            虚拟 HUB: DEFAULT                 \\ 默认为default 如修改了填写真实的
            要创建的类型: 新 tap 设备的桥接
            新 tap 设备名称: mi                  \\ 名字随便起
            创建本地桥
        # ip a                                    \\ 会有名字为 tap_mi 的虚拟网卡 但是没有ip 需要配置临时ip  只能配置临时ip
            tap_mi: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
        # ip addr add 172.21.130.209/24 dev tap_mi  \\ 配置 ip  与下面 ip 在一个网段且不冲突即可
        # ip a



    内网服务器搭建 vpnserver端         \\ 两台服务器都搭建 vpnserver端 连接服务器管理配置设置即可

        管理虚拟 HUB --> 管理级联连接 --> 新建
            连接设置名: vpn404782520.softether.net      \\ 名字而已
            主机名: vpn404782520.softether.net           \\ 填写 外网的动态DNS主机名
            端口号: 443                                   \\ 任意一个 监听的端口号
            虚拟HUB名: DEFAULT                             \\ 默认为default 如修改了填写真实的
            用户名: teo01                                   \\ 此为外网vpnserver端的用户名
            密码: 123456                                     \\ 此为外网vpnserver端的密码

        连接到管理端 --> 本地网桥设置
            虚拟 HUB: DEFAULT                 \\ 默认为default 如修改了填写真实的
            要创建的类型: 新 tap 设备的桥接
            新 tap 设备名称: mi                  \\ 名字随便起
            创建本地桥
        # ip a                                    \\ 会有名字为 tap_mi 的虚拟网卡 但是没有ip 需要配置临时ip  只能配置临时ip
            tap_mi: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
        # ip addr add 172.21.130.210/24 dev tap_mi  \\ 配置 ip
        # ip a
        # ping 172.21.130.209                         \\ ping 通即可


修改 VPN Server 语言
    # vim /usr/local/vpnserver/bin/vpncmd/lang.config
        cn
    # vim /usr/local/vpnserver/bin/vpnserver/lang.config
        cn


修改 VPN Server 管理员密码                         \\ 修改 windows端 管理 linux端 vpnserver 的密码

    # /usr/local/vpnserver/bin/vpncmd/vpncmd        \\ vpnserver 命令
        VPN Server>help                              \\ 帮助
        VPN Server>ServerPasswordSet                  \\ 修改密码











Apache 服务器



Apche 服务器


Apache 编译安装

    http://httpd.apache.org/download.cgi       \\ 下载三个包
        apr-1.7.0.tar.gz
        apr-util-1.6.1.tar.gz
        httpd-2.4.41.tar.gz
    # yum install zlib-devel expat-devel openssl-devel pcre-devel gcc gcc++    \\ expat-devel开发库
    # groupadd apache
    # useradd -g apache apache -s /sbin/nologin
    # tar zxf apr-1.7.0.tar.gz
    # cd apr-1.7.0
    # ./configure --prefix=/usr/local/apr
    # make && make install
    # tar zxf apr-util-1.6.1.tar.gz
    # cd apr-util-1.6.1
    # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr     \\ 需要依赖apr包
    # make && make install
    # tar zxf httpd-2.4.41.tar.gz
    # cd httpd-2.4.41
    # ./configure --prefix=/usr/local/apache --sysconf=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
    # make && make install
    # /usr/local/apache/bin/apachectl -t    \\ 检测语法
    # ./apachectl -V              \\ 查看版本等信息 可以查看到当前使用MPM  对于编译安装修改MPM模式只在编译的时候修改 
    # ./apachectl -M               \\ 查看所有的模块
    # ./apachectl -l                \\ 查看所

    # vim /etc/httpd/httpd.conf       \\ 编译安装的主配置文件 位置
        ServerName localhost:80        \\ 添加此行 localhost为主机名 否则会有警告httpd: Could not reliably determine the 
    # ./apachectl start                 \\ 以下 省略了目录                       ↑ server's fully qualified domain name
    # ss -tnl                            \\ 80端口被监控
    # ./apachectl stop

    # vim /etc/init.d/httpd                \\ 创建启动脚本
        #!/bin/bash
        # chkconfig: 12345 80 90
        function start_http()
        {
        /usr/local/apache/bin/apachectl  start
        }
        function stop_http()
        {
         /usr/local/apache/bin/apachectl  stop
        }
        case "$1" in
        start)
            start_http
        ;;  
        stop)
            stop_http
        ;;  
        restart)
            stop_http
            start_http
        ;;
        *)
            echo "Usage : start | stop | restart"
        ;;
        esac
    # chmod +x /etc/init.d/httpd
    # chkconfig --add httpd
    # chkconfig httpd on
    # systemctl restart httpd
    # ss -tnl
    # cat /usr/local/apache/build/config.nice           \\ 查看编译安装时候的参数


实例配置

  ❶ 站点基本配置  使用中心主机 创建站点
    # vim /etc/httpd/httpd.conf                  \\ 主配置文件 编译安装的目录
        DocumentRoot "/data/www/www.teo1.com"     \\ 站点目录  中心主机只有一个站点使用  多个站点注释掉 使用虚拟机
        <Directory "/data/www/www.teo1.com">       \\ 对/data/www/www.teo1.com/目录的一个权限的设置 指设置web目录的属性
            Options Indexes FollowSymLinks          \\ Options使用哪些特性  Indexes FollowSymLinks等 见注释1
            AllowOverride None              \\ 表示禁止用户对目录配置文件(.htaccess进行修改)重载 普通站点不建议开启 All 为允许
            Require all granted              \\ 允许所有访问   如果要拒绝 详见注解1
        </Directory>
        <IfModule dir_module>
            DirectoryIndex index.html          \\ 默认首页文件名为 index.html
        </IfModule>


  ❷ 做下载站                             \\ 上一条基础上
    # mkdir /data/download
    # touch /data/download/{a,b}.txt         \\ 测试使用  访问 http://192.168.10.14/download
    # vim /etc/httpd/httpd.conf
    <Directory "/data/download">               \\ 给权限
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
        <IfModule alias_module>                \\ 对所有的虚拟主机都会生效
            Alias /download  "/data/download/"  \\ 别名 添加一条配置 也可以写在外面 如DocumentRoot下一行也行 注意后面的"/""
        </IfModule>                              \\ ↑ /download/为相对路径 相对于DocumentRoot. /data/download/为绝对路径


  ❸ 虚拟主机
    ① 虚拟主机 https 基础配置
        # vim /etc/httpd/httpd.conf
           #DocumentRoot "/usr/local/apache/htdocs"                            \\ 注释 掉中心主机
            LoadModule socache_shmcb_module modules/mod_socache_shmcb.so        \\ 开启此项 配置证书使用
            LoadModule ssl_module modules/mod_ssl.so                             \\ 开启此项 配置证书使用
            LoadModule rewrite_module modules/mod_rewrite.so                      \\ 开启 跳转模块
            LoadModule proxy_module modules/mod_proxy.so
            LoadModule proxy_http_module modules/mod_proxy_http.so
            #LoadModule proxy_balancer_module modules/mod_proxy_balancer.so \\ 此模块开启负载均衡 但开启报错 所以实验五未做
            <VirtualHost *:80>                         \\ 拒绝ip访问和拒绝未绑定的网址访问 此为默认虚拟机 要放到第一个
                <Location />                            \\ 拒绝所有ip访问 及 拒绝未绑定的网址访问
                    Require all denied                   \\ 默认拒绝
                </Location>
                <Location /server-status>                  \\ 开启status页面 如不需要 可删除此段代码
                    SetHandler server-status
                    Require ip 192.168.10.1
                </Location>
            </VirtualHost>
            <VirtualHost *:443>                              \\ 默认https虚拟机 匹配不到网址的会配置到此 返回错误页面
                SSLEngine on                                  \\ 开启 ssl
                SSLCertificateFile "/usr/local/apache/ssl/www.teo1.com.crt"          \\ 随便一个 证书即可
                SSLCertificateKeyFile "/usr/local/apache/ssl/www.teo1.com.key"
            </VirtualHost>                                       \\ 此虚拟机 要放到第一个
            #ExtendedStatus On                                    \\ 开启状态页面的所有信息 但是好像没有什么用 可以删除
            Listen 443
            SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
            SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
            SSLHonorCipherOrder on
            SSLProtocol all -SSLv3
            SSLProxyProtocol all -SSLv3
            SSLPassPhraseDialog  builtin
            SSLSessionCache        "shmcb:/usr/local/apache/logs/ssl_scache(512000)"
            SSLSessionCacheTimeout  300                          
            Include /etc/httpd/sites/*.conf               \\ 载入虚拟机配置文件   以上代码 在最后一行加入

    ② 此虚拟主机实现 https 不强制跳转
        # mkdir /etc/httpd/sites                              \\ 创建的 虚拟机 配置文件夹
        # vim /etc/httpd/sites/www.teo1.com                    \\ 第一个虚拟主机配置文件
            <VirtualHost *:80>                                  \\ 监听地址
               #ServerAdmin www.teo1.com@gmail.com               \\ 设置管理员的邮箱 可删除 
                DocumentRoot "/data/www/www.teo1.com"             \\ 网址的根目录
                ServerName www.teo1.com                            \\ 配置域名
                ServerAlias teo1.com ce.teo1.com                    \\ 设置别名 同ServerName一样功能 多个使用空格隔开
                ErrorLog "logs/www.teo1.com-error_log"               \\ 错误日志
                CustomLog "logs/www.teo1.com-access_log" common       \\ 访问日志
                <Directory "/data/www/www.teo1.com">
                    Options FollowSymLinks
                    AllowOverride None
                    Require all granted
                </Directory>                                           \\ 此为不强制跳转到https
            </VirtualHost>
            <VirtualHost *:443>                                          \\ https
                DocumentRoot "/data/www/www.teo1.com/"
                ServerName www.teo1.com:443
                ServerAlias teo1.com ce.teo1.com                            \\ 在此 不能加 :443
                ErrorLog "/usr/local/apache/logs/www.teo1.com_error_log"
                TransferLog "/usr/local/apache/logs/www.teo1.com_access_log"
                SSLEngine on
                SSLCertificateFile "/usr/local/apache/ssl/www.teo1.com.crt"
                SSLCertificateKeyFile "/usr/local/apache/ssl/www.teo1.com.key"
                BrowserMatch "MSIE [2-5]" \
                         nokeepalive ssl-unclean-shutdown \
                         downgrade-1.0 force-response-1.0
                CustomLog "/usr/local/apache/logs/ssl_request_log" \
                          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
            </VirtualHost>

    ③ 此虚拟主机实现 强制跳转https
        # vim /etc/httpd/sites/www.teo2.com
            <VirtualHost *:80>                                     \\ 只实现80端口的跳转
                ServerName www.teo2.com
                ServerAlias teo2.com ce.teo2.com                     \\ 定义多个域名
                RewriteEngine On                                      \\ 开启跳转
                RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [R=301,L]  \\ 强制跳转到https
                #RewriteRule ^(.*)$ https://www.teo2.com$1 [R=301,L]    \\ 强制跳转到https 或者使用此语句
            </VirtualHost>
            <VirtualHost *:443>                                           \\ 
                DocumentRoot "/data/www/www.teo2.com/"
                ServerName www.teo2.com:443
                ServerAlias teo2.com ce.teo2.com                            \\ 不加:443
                ErrorLog "/usr/local/apache/logs/www.teo2.com_error_log"
                TransferLog "/usr/local/apache/logs/www.teo12.com_access_log"
                SSLEngine on
                SSLCertificateFile "/usr/local/apache/ssl/www.teo2.com.crt"
                SSLCertificateKeyFile "/usr/local/apache/ssl/www.teo2.com.key"
                BrowserMatch "MSIE [2-5]" \
                         nokeepalive ssl-unclean-shutdown \
                         downgrade-1.0 force-response-1.0
                CustomLog "/usr/local/apache/logs/ssl_request_log" \
                          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
            </VirtualHost>

    ④ 此虚拟主机实现 80端口301重定向   443端口未重定向
        # vim /etc/httpd/sites/www.teo3.com
            <VirtualHost *:80>                                     \\ 实现301重定向
                ServerName www.teo3.com
                RewriteEngine On
                RewriteRule ^(.*)$ https://www.syk.my$1 [R=301,L]
            </VirtualHost>
            <VirtualHost *:443>
                ServerName www.teo3.com:443
                ErrorLog "/usr/local/apache/logs/www.teo3.com_error_log"
                TransferLog "/usr/local/apache/logs/www.teo3.com_access_log"
                SSLEngine on
                SSLCertificateFile "/usr/local/apache/ssl/www.teo1.com.crt"
                SSLCertificateKeyFile "/usr/local/apache/ssl/www.teo1.com.key"
                RewriteEngine On
                RewriteRule ^(.*)$ https://www.syk.my$1 [R=301,L]
            </VirtualHost>

    ⑤ 此虚拟主机实现 反向代理
        # vim /etc/httpd/sites/www.teo4.com
            <VirtualHost *:80>
                ServerName www.teo4.com             \\ 虚拟主机名字
                ProxyVia On                          \\ 加首部 说明由此主机反向代理过去的 可以不添加为Off
                ProxyRequests Off                     \\ 同时支持正想代理 使用反向 必须要显示关闭正向代理
                ProxyPreserveHost On                   \\ 基于主机名的虚拟主机 把主机名会带到后端
                <Proxy *>                               \\ 代理模块 允许哪些用户使用
                        Require all granted              \\ 允许所有人访问
                </proxy>
                #ProxyPass /status !                       \\ 可以使status页面不代理到后端 由本机httpd响应 也可以去掉
                ProxyPass / http://47.91.219.64/            \\ 反向代理 /根的所有请求 到 此代理为基于http协议
            </VirtualHost>

    ⑥ 此虚拟主机实现 反向代理+负载均衡             主要代码 由于启用模块报错 此实验未做  负载均衡可以使用Nginx   
        # vim /etc/httpd/sites/www.teo4.com
            Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED \\ session绑定需加
            <proxy balancer://syk.my>
                BalancerMember http://192.168.10.10:80 loadfactor=10
                BalancerMember http://192.168.10.13:80 loadfactor=10
                ProxySet stickysession=ROUTEID                                         \\ 基于session绑定需要加
            </proxy>
            <VirtualHost *:80>
                ServerName www.teo4.com
                ProxyVia On
                ProxyRequests Off
                ProxyPreserveHost On
                <Proxy *>
                        Require all granted
                </proxy>
                ProxyPass / balancer://syk.my/
                ProxyPassReverse / balancer://syk.my/
                <Location />
                        Require all granted
                </location>
            </virtualHost>      


  注:
     ❶ 访问控制
        Options                   使用哪些特性
            Indexes               索引 访问该目录时 如找不到DirectoryIndex的主页文件 则返回该目录下的文件列表给用户 做下载站使用
            FollowSymLinks        允许跟踪符号 链接文件 是否允许链接文件 追踪到源目录进行访问 表示允许使用符号链接 默认为禁用
            SymLinksifOwnerMatch  源文件和符号链接的属主匹配的时候 允许
            MultiViews            允许多视图   内容协商机制 一般都不开 有风险
        AllowOverride None
        Require all granted       允许所有访问
        Require all denied        拒绝所有访问
        Require host google.com   只允许来自特定域名主机的访问请求 其他请求将被拒绝
        Require ip 192.120 192.168.100 192.168.1.1     只允许来自特定IP或IP段的访问请求 其他请求将被拒绝

        <RequireAll>                     可以在<Directory> 下嵌套
            Require all granted          允许所有访问请求 但拒绝来自特定IP或IP段的访问请求(阻止恶意IP或恶意爬虫网段的访问)
            Require not ip 192.168.1.1
            Require not ip 192.120 192.168.1234500
        </RequireAll>

        例 ①:允许所有访问请求,但拒绝某些User-Agent的访问请求(通过User-Agent屏蔽垃圾网络爬虫)
            使用mod_setenvif通过正则表达式匹配来访请求的User-Agent,并设置内部环境变量BADBOT,最后拒绝BADBOT的访问请求。
            <Directory xxx/www/yoursite>
                SetEnvIfNoCase User-Agent ".*(FeedDemon|JikeSpider|AskTbFXTV|CrawlDaddy|Feedly|Swiftbot|ZmEu|oBot).*" BADBOT
                SetEnvIfNoCase User-Agent "brandwatch" BADBOT
                SetEnvIfNoCase User-Agent "rogerbot" BADBOT
                <RequireAll>
                    Require all granted
                    Require not env BADBOT
                    Require not ip 192.168.100.1
                </RequireAll>
            </Directory>

        其它require访问控制指令用法如下:
            Require all granted #允许所有
            Require all denied #拒绝所有
            Require env env-var [env-var] ... #允许匹配环境变量中任意一个
            Require method http-method [http-method] ... #允许特定的HTTP方法(GET/POST/HEAD/OPTIONS)
            Require expr expression #允许,表达式为true
            Require user userid [ userid ] ... #允许特定用户
            Require group group-name [group-name] ... #允许特定用户组
            Require valid-user # #允许,有效用户
            Require ip 192.100 192.168.100 192.168.100.5 #允许特定IP或IP段,多个IP或IP段间使用空格分隔

        <Directory>           \\ 对目录进行访问控制
            <RequireAll>       \\ 嵌套在<Directory>下有Require访问控制语句
        <Files>                 \\ 对任何目录匹配文件的形式做访问控制 可嵌套在<Directory>下对目录下的文件单独做访问控制


配置文件详解                             \\ 仅仅 用于说明参数详解

    ServerRoot "/usr/local/apache"        \\ 主程序目录
    Listen 80                              \\ 监听端口

    <Directory />              \\ 对于根目录访问控制
        AllowOverride none      \\ 表示禁止用户对目录配置文件(.htaccess进行修改)重载 普通站点不建议开启 All 为允许
        Require all denied       \\ 拒绝所有访问
    </Directory>

    DocumentRoot "/data/www/www.teo1.com"      \\ 站点目录  中心主机只有一个站点使用  多个站点注释掉 使用虚拟机

    <Directory "/data/www/www.teo1.com">        \\ 对/data/www/www.teo1.com/目录的一个权限的设置 指设置web目录的属性
        Options Indexes FollowSymLinks           \\ 以下几条具体参见上 注解1
        AllowOverride None
        Require all granted
        <RequireAll>                     可以在<Directory> 下嵌套
            Require all granted          允许所有访问请求 但拒绝来自特定IP或IP段的访问请求(阻止恶意IP或恶意爬虫网段的访问)
            Require not ip 192.168.1.1
            Require not ip 192.120 192.168.100
        </RequireAll>
    </Directory>

    <IfModule dir_module>           \\ IfModule为模块  dir_module为模块名称 
        DirectoryIndex index.html    \\ 默认首页文件名为 index.html 
    </IfModule>                       \\ 配置段中的指令仅当模块名称为真的时候才进行处理 如果为假 所有其间的指令都将被忽略

    <Files ".ht*">            \\ 会拒绝对任何目录下 以 .ht 类型开头的文件
        Require all denied
    </Files>                    \\ <Files> 可以嵌套在<Directory>下对指定目录进行访问控制

    <Files "*.html">             \\ 会拒绝对任何目录下 以 .html类型结尾的文件
        Require all denied
    </Files>

    ErrorLog "logs/error_log"      \\ 错误日志存放的位置 相对路径  相对ServerRoot主程序目录
    LogLevel warn                   \\ 日志的级别 从低到高 debug < info < notice < warn < error < crit < alert < emerg

    <IfModule log_config_module>
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined \\ 定义日志格式 并用combined表示
        LogFormat "%h %l %u %t \"%r\" %>s %b" common                    \\ 定义日志的格式 并用common代号表示
        <IfModule logio_module>
          LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
        </IfModule>
        CustomLog "logs/access_log" common      \\ 访问日志配置路径 (生产环境我们用combined格式代替common格式)
    </IfModule>
        %h 客户端IP地址
        %l 远程登录的用户名  大多数为空 用 - 表示 不重要
        %u 用户认证时的用户名  
        %t 服务器收到请求时的 时间
        %r 请求报文的首行信息
        %>s 响应状态码   如403 301
        %b 响应报文的大小 单位是字节 不包括响应报文首部
        %{Referer}i 请求报文当中"referer"首部的值 referer: 当前资源的访问入口 即从哪个页面中的超链接跳转而来
        %{User-Agent}i 请求报文当中"User-Agent"首部的值: 即发出请求用到的应用程序 通常是浏览器 压力测试工具AB 爬虫也是一种Agent

    <IfModule alias_module>
        Alias /download/ "/data/download/"   \\ 别名 必须以/结尾 /download/为相对路径 相对于DocumentRoot 后一个路径为绝对路径
        ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"    \\ 对CGI模块儿的别名 与Alias相似       ↑ 可做下载站使用
    </IfModule>
    <IfModule cgid_module>
    </IfModule>

    <IfModule headers_module>
        RequestHeader unset Proxy early  \\ httpoxy漏洞检测与处理 可以使用mod_headers来修复这个漏洞 阻止请求头中"Proxy:"字段
    </IfModule>

    <IfModule mime_module>
        TypesConfig /etc/httpd/mime.types   \\ 用于设置保存有不同MIME类型数据的文件名
        AddType application/x-compress .Z
        AddType application/x-gzip .gz .tgz
    </IfModule>

    <IfModule proxy_html_module>
    Include /etc/httpd/extra/proxy-html.conf      \\ 
    </IfModule>

    <IfModule ssl_module>
    SSLRandomSeed startup builtin
    SSLRandomSeed connect builtin
    </IfModule>