前言

代理服务器和虚拟专用网(VPN)具有相同的用途,两者都旨在在线隐藏用户的身份,并且允许你更安全地访问互联网上的内容。同时,也可以使用任何一个虚拟位置为自己创建网络标识。例如,当你坐在洛杉矶的咖啡厅,你可以使用代理服务器通过澳大利亚的服务器连接到互联网,这样一来,网友就会认为你人在澳大利亚了。

代理服务器介绍

代理服务器充当着你的电脑和另一台计算机之间的联络人,当你使用代理连接到互联网时,你需要通过代理服务器请求连接。当你在计算机上执行的所有操作也称为客户端,将转发到代理服务器,该代理收集你的要求信息,随之将其返送给你。

代理服务器在起到了中间人的作用,你不需要直接向目标网点请求数据,而是将请求发给代理服务器,由代理服务器向目标网点请求,然后再返回给你,代理服务器有以下几个特点:

  • 可以隐藏自己的真实IP,从而在一定程度上保障安全。
  • 在传输过程中,一直都是明文传输,容易被劫持和破译。
  • 代理服务器只适合要求低安全,低风险的任务,例如看视频等,不适合登录诸如网络银行等操作。

VPN介绍

VPN(虚拟专用网络),在你和目标站点之间架设一条虚拟的信道,这条信道是加密的,安全性较高。VPN通常专门用于连接到本地intranet或外部链接不可访问的内容。许多工作场所允许他们的员工使用VPN远程连接,以便,以便从办公室外部访问公司的本地Intranet上的数据。

VPN拥有以下特点:

  • 相较于代理服务器是在应用级,VPN是在操作系统级的,也就是说代理服务器只能代理一个应用或者协议,例如你架设了一个HTTP 代理服务器,那么你可以访问外国的网站,但是却不能访问服务器位于外国的ftp,而vpn很好的解决了这个问题,通过配置,整个操作系统的数据流都可以直接访问外网。
  • VPN具有强加密功能,而代理服务器全程不加密,所以VPN的安全性要远远强于代理服务器。

代理与VPN

  • 时间、带宽、管控 都影响网络使用体验
  • 作为改善技术,VPN / 代理 可以突破限制改善体验
  • 代理主要提高访问速度,VPN更注重安全性
  • 在某些应用场景中,作用非常相似
  • 作为中间层,双向模拟

VPN底层很多,算是传输层的通道,让你的客户端通过一个传输层隧道穿过复杂的不可信外网到另一个可信子网内在出来而已,对上面应用层的内容不会干涉的。
代理一般在应用层的。一般会在干涉能应用层的传输内容的。

squid介绍

squid是一种用来缓存Internet数据的软件。接受来自人们需要下载的目标(object)的请求并适当的处理这些请求。也就是说,如果一个人想下载一web界面,他请求squid为他取得这个页面。squid随之连接到远程服务器并向这个页面发出请求。然后,squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时, squid可以简单的从磁盘中读到它,那样数据会立即传输到客户机上。

squid代理的作用

  • 通过缓存的方式为用户提供web访问加速
  • 对用户的web访问进行过滤控制

squid的工作流程

当代理服务器中有客户端需要的数据时:

  • 客户端向代理服务器发送数据请求
  • 代理服务器检查自己的数据缓存
  • 代理服务器在缓存中找到了用户想要的数据,取出数据
  • 代理服务器将从缓存中取得的数据返回给客户端

当代理服务器中没有客户端需要的数据时:

  • 客户端向代理服务器发送数据请求
  • 代理服务器检查自己的数据缓存
  • 代理服务器在缓存中没有找到用户想要的数据
  • 代理服务器向Internet 上的远端服务器发送数据请求
  • 远端服务器响应,返回相应的数据
  • 代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中

squid代理服务器工作在 TCP/ IP 应用层

squid各种代理的定义

正向代理

标准的代理缓冲服务器

一个标准的代理缓冲服务被用于缓存静态的网页到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指名代理服务器的IP地址和端口号。客户端上网时,每次都把请求发送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发送给客户端浏览器。

透明代理缓冲服务器

透明代理缓冲服务器和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因此不需要对浏览器作任何设置,所以,透明代理对于ISP(Internet服务器提供商)特别有用。

反向代理

反向代理缓冲器

反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发给用户。这种方式通过降低了WEB服务器的请求数从而降低了WEB服务器的负载。

正向代理与反向代理的区别

  • 正向代理:对于原始服务器而言,就是客户端的代言人。proxy和client同属一个LAN,对server透明;服务端不知道真实的客户端是谁,客户端请求的服务都由代理服务器代替来请求。
  • 反向代理:对于客户端而言,就像是原始服务器。proxy和server同属一个LAN,对client透明,客户不知道自己访问的是代理服务器,客户端也不需要任何配置就可以访问。

  • 正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。

  • 反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。

  • 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。

  • 反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。

安装配置squid

1
sudo apt install squid     # 安装软件包

squid主要组成

  • 服务名:squid
  • 主程序:/usr/sbin/squid
  • 配置目录:/etc/squid
  • 主配置文件:/etc/squid/squid.conf
  • 监听tcp端口号:3128
  • 默认访问日志文件:/var/log/squid/access.log

squid中的访问控制

使用访问控制特性,可以控制在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等等。squid访问控制有两个要素:ACL元素和访问列表。访问列表可以允许或拒绝某些用户对此服务的访问。

ACL元素类型

  • src:源地址(即客户机IP地址)
  • dst:目标地址(即服务器IP地址)
  • srcdomain:源名称(即客户机名称)
  • dstdomain:目标名称(即服务器名称)
  • time:一天中的时刻和一周内的一天
  • url_regex:URL规则表达式匹配
  • urlpath_regex:URL-path规则表达式匹配,略去协议和主机名
  • proxy_auth:通过外部程序进行用户验证
  • maxconn:单一IP的最大连接数

ACL格式

为了使用控制功能,必须先设置ACL规则并应用。ACL声明的格式如下:

1
acl acl_element_name type_of_acl_element values_to_acl
  • acl_element_name 可以是任一个在ACL中定义的名称
  • 任何两个ACL元素不能用相同的名字
  • 每个ACL由列表值组成。当进行匹配检测的时候,多个值由逻辑或运算连接;换言之,即任一ACL元素的值被匹配,则这个ACL元素即被匹配。
  • 并不是所有ACL元素都能使用访问列表中的全部类型
  • 不同的ACL元素写在不同行中,squid将把他们组合在一个列表中

访问条目

我们可以使用许多不同的访问条目。下面是我们常用的几个:

  • http_access:允许HTTP访问
  • no_cache:定义对缓存请求的响应。

访问列表的规则由一些类似allowdeny的关键字构成,用以允许或拒绝向特定或一组ACL元素提供服务。

  • 一个访问列表可以由多条规则组成
  • 如果没有任何规则与访问请求匹配,默认动作将与列表中最后一条规则对应。
  • 一个访问条目中所有元素将用逻辑与运算连接
    • http_access Action 声明1 AND 声明2 AND 声明 OR http_access Action 声明3
    • 多个http_accesss声明间用或运算连接,但每个访问条目的元素间用与运算连接。
  • 列表中的规则总是遵循由上而下的顺序
  • 这些规则按照他们的排列顺序进行匹配检测,一旦检测到匹配的规则,匹配就立即结束。

常用配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
sudo vi /etc/squid/squid.conf      # 编辑主配置文件

acl # 访问控制列表

acl menhu dstdomain .sina.com .163.com
# 小心页面元素CSS、图片无法加载,它们可能不是在这个地址上的

acl xiaban time MTWHFAS 18:00-23:59 # 限制时间
# Mon, Tues, Wednes, tHurs, Fri, sAtur, Sun, D:工作日

# 访问规则顺序匹配
http_access allow localhost
http_access deny all
http_access allow menhu xiaban

# 指定源地址
acl localnet src 10.0.0.0/24 10.0.3.0/24 10.0.5.0/24 192.168.0.1


# url 的过滤
acl noexes url_regex -i exe$ # URL 以 exe 结尾(-i 大小写不敏感)
acl httpsurls url_regex -i ^https # ^ URL 起始
acl noporn url_regex -i sex
acl zipfiles url_regex -i \.zip$


# 最后一条规则
http_access deny all


# 重新加载配置文件
sudo kill -SIGHUP `cat /var/run/squid.pid`

# 一般添加规则推荐是 禁止掉所有的,将允许特定的 规则添加到禁止所有的规则上面

squid默认配置是在 代理服务器的所有网卡上面都侦听代理的端口,这样的好处就是配置起来简单,因为默认所有网卡都侦听这个代理端口了,大家只要连上你哪个网卡去设置一下代理地址都可以拿这个代理服务器去上网。不好的地方就是,如果你一块网卡对外(公网),一块网卡对内,这就导致这个代理服务器无论对公网还是对内网,都是一个代理服务器,整个互联网上的人都可以用这个代理服务器,这肯定是我们不希望的。所以我们可以只对 那个对内的网卡侦听。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 代理端口,默认在所有IP上侦听代理端口
http_port 192.168.1.1:3128
# 不要对公网开放代理


# 访问日志
var/log/squid/access.log


# 缓存
cache_dir ufs /var/spool/squid3 100 16 256
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ 3600 90% 86400
# 缓存图片

VPN技术简介

企业内部系统不应该对外开发

  • 出差在外的企业员工需要访问公司内部系统
  • 分公司、合作商需要安全的访问指定企业内部系统
  • 专线网络费用高昂而且不灵活
  • 远程访问安全性欠缺

虚拟专用网络(VPN——Virtual Private Network)

  • 基于并不安全的网络线路,通过加密技术构建安全的信息通道
  • VPN用户获得如同在内网一样的访问使用体验

和代理相比

  • VPN更加安全、成本高、部署难度大
  • VPN一旦部署完成后 使用就简单了
  • 代理属于一种中间层的代理,VPN更接近路由(对应用透明,无需设置代理)
  • VPN有更完善的认证、加密、授权控制

VPN类型

  • PPTP
  • L2TP
  • IPSec
  • SSL

OpenVPN

  • 全特性的开源SSL VPN
  • 跨平台,全平台的解决方案

OpenVPN

  • 通过
  • 出差员工访问企业内部系统
  • 伪装为国外地址,规避地理限制个审核
  • 需要独立的证书颁发机构CA,完成PKI架构(Public Key Infrastructure,公钥基础设施)

环境准备

两台服务器,一台部署VPN,一台部署CA服务器

使用桥接模式

  • VPN 服务器 192.168.0.106 openserver
  • CA服务器 192.168.0.107 ca

安装OpenVPN

在openserver机器上安装OpenVPN

1
sudo apt install openvpn

在ca机器和openserver上都安装EasyRSA

1
2
3
4
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz

# 解压
tar xvf EasyRSA-unix-v3.0.6.tgz

在ca服务器上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cd EasyRSA-v3.0.6/
cp vars.example vars
vi vars

set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Shanghai"
set_var EASYRSA_REQ_CITY "SH"
set_var EASYRSA_REQ_ORG "LAB"
set_var EASYRSA_REQ_EMAIL "admin@lab.com"
set_var EASYRSA_REQ_OU "IT"

# 初始化PKI目录
./easyrsa init-pki


# 创建证书办法机构,生成CA公私钥
./easyrsa build-ca nopass # 不使用保护证书私钥密码

# ca.crt:公钥证书,用于验证CA签名的其他证书(C/S都需要)
# ca.key:CA的私钥,用于签名所有的C/S证书(应该私密保护)
# 证书服务器在不使用的时候,建议关机

在openserver服务器上

1
2
3
4
5
6
7
8
9
10
11
12
cd EasyRSA-v3.0.6/

./easyrsa init-pki

# 生成证书文件的请求文件
./easyrsa gen-req vpnserver nopass

# 将私钥文件拷贝到vpn的目录下
sudo cp pki/private/vpnserver.key /etc/openvpn/

# 将证书请求文件传输至CA签发
scp pki/reqs/vpnserver.req cwz@192.168.0.107:/tmp

在CA服务器上

1
2
3
4
5
6
7
# 导入并签发VPN服务器证书
./easyrsa import-req /tmp/vpnserver.req vpnserver
./easyrsa sign-req server vpnserver

# 将证书回传至vpnserver
scp pki/issued/vpnserver.crt cwz@192.168.0.106:/tmp # vpnserver证书
scp pki/ca.crt cwz@192.168.0.106:/tmp # CA公钥证书

在vpnserver服务器上

1
2
3
4
5
6
7
8
9
# 拷贝证书文件
sudo cp /tmp/{vpnserver.crt,ca.crt} /etc/openvpn/

# 生成Diffie-Hellman密钥(密钥交换)
./easyrsa gen-dh # 生成HMAC签名(TLS完整性校验)
openvpn --genkey --secret ta.key # 生成安全密钥

sudo cp ta.key /etc/openvpn/
sudo cp pki/dh.pem /etc/openvpn/

服务端证书设置全部完成

OpenVPN客户端

  • 在VPN服务器上自动生成客户端证书
  • 使用脚本批量自动生成客户端配置文件
  • 生成客户端证书密钥 / 请求文件
1
2
3
4
5
6
7
mkdir -p ~/client-configs/keys   # 证书文件目录
chmod -R 700 ~/client-configs # 配置文件目录权限

./easyrsa gen-req client1 nopass # client1

cp pki/private/client1.key ~/client-configs/keys/
scp pki/reqs/client1.req cwz@192.168.0.107:/tmp

在CA服务器

1
2
3
4
5
6
# 导入并签发证书
./easyrsa import-req /tmp/client1.req client1
./easyrsa sign-req client client1

scp pki/issued/client1.crt cwz@192.168.0.106:/tmp

在vpnserver上

1
2
3
4
# 复制证书文件
cp /tmp/client1.crt ~/client-configs/keys
cp ~/EasyRSA-v3.0.6/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/

客户端证书文件准备完毕

配置OpenVPN服务

服务器配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/

cd /etc/openvpn
sudo gzip -d /etc/openvpn/server.conf.gz

sudo vi /etc/openvpn/server.conf
# 修改配置
tls-auth ta.key 0
key-direction 0
cipher AES-256-CBC
auth SHA256
dh dh.pem
user nobody
group nogroup
# 强制客户端所有流量路由只tun0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 202.106.8.20"
push "dhcp-option DNS 8.8.8.8"
# 协议端口(可选)
port 443
proto tcp
explicit-exit-notify 0
# 指定服务器证书文件
cert vpnserver.crt
key vpnserver.key

启动服务器路由功能

1
2
3
sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1
sudo sysctl -p

确定默认路由网卡名称

1
2
ip route | grep default
default via 192.168.0.1 dev enp0s3 proto dhcp src 192.168.0.106 metric 100

修改防火墙规则实现NAT

1
2
3
4
5
6
7
8
sudo vi /etc/ufw/before.rules       # 优先级高于普通UFW规则
# 加上配置
# START OPENVPN RULES
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o enp0s3 -j MASQUERADE
COMMIT
# END OPENVPN RULES

防火墙默认开启转发包

1
2
sudo vi /etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"

启动防火墙及规则

1
2
3
4
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
sudo ufw disable
sudo ufw enable

启动OpenVPN服务

1
2
3
4
sudo systemctl start openvpn@server
sudo systemctl status openvpn@server
sudo systemctl enable openvpn@server
ip addr show tun0

客户端配置脚本

配置文件模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mkdir -p ~/client-configs/files       # 配置文件存放目录
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

vi ~/client-configs/base.conf
# 在最后增加
# script-security 2 # 仅针对Linux客户端,Windows不需要
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
# 修改配置
remote vpnserver_ip 1194
proto udp
user nobody
group nobody
#ca ca.crt # 注释掉
#cert client.crt
#key client.key
#tls-auth ta.key 1
cipher AES-256-CBC
auth SHA256
key-direction 1

客户端配置脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vi ~/client-configs/make_config.sh      # 脚本参数为客户端标识名
#!/bin/bash
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${1}.ovpn
1
2
3
chmod 700 ~/client-configs/make_config.sh  # 权限
cd ~/client-configs
sudo ./make_config.sh client1

分别为每个客户端生成相应证书,然后运行脚本生成配置文件

.ovpn配置文件拷贝至客户端

linux客户端安装

使用命令行

1
2
3
4
5
6
7
8
9
# 在linux客户端
scp cwz@192.168.0.106:~/client-configs/files/client1.ovpn .

# 由于客户端是linux,把client1.ovpn的三行注释去掉

sudo apt install openvpn # 安装

# 建立VPN连接
sudo openvpn --config client1.ovpn > /dev/null 2>&1 &

图形化linux VPN客户端

1
2
3
sudo apt install network-manager-openvpn-gnome
sudo systemctl restart network-manager
# 网络设置导入文件创建VPN连接

其他VPN客户端

  • Cisco Concentrator network-manager-vpnc
  • Cisco OpenConnect network-manager-openconnect
  • PPTP (Microsoft VPN) network-manager-pptp
  • strongSwan (for some IPsec VPNs) network-manager-strongswan

Windows客户端

IOS

  • App Store 搜索 OpenVPN Connect

Android

  • OpenVPN Connect

MacOS

撤销客户端证书

CA Server

1
2
3
4
5
cd EasyRSA-3.0.6
./easyrsa revoke client1
./easyrsa gen-crl # 证书吊销列表
scp /pki/crl.pem cwz@vpnserver_ip:/tmp

VPN Server

1
2
3
4
5
6
sudo cp /tmp/crl.pem /etc/openvpn
sudo vi /etc/openvpn/server.conf
# 增加证书吊销指令
crl-verify crl.pem

sudo systemctl restart openvpn@server