客户端 - 服务器纯 IP 网络配置指南
1. 特殊路由与 VPN 网关
vpn_gateway
是一个特殊的网关,代表着 VPN 网关地址。若要添加一条路由,明确地将特定子网的流量通过 VPN 隧道传输,覆盖任何本地路由,可以添加如下选项:
route 10.198.0.0 255.255.0.0 vpn_gateway
2. 重定向 IPv6 默认网关
随着 IPv6 网络的出现,设置一个能同时保护 IPv4 和 IPv6 流量的 VPN 变得愈发重要。若仅通过 VPN 隧道保护 IPv4 流量,那么 IPv6 流量仍可能泄露。下面介绍如何设置 OpenVPN 来保护所有 IPv6 流量,此功能从 OpenVPN 2.4 版本开始支持。
-
准备工作
- 网络布局与服务器端路由配置的布局相同。
- 使用本章第一个配置创建的 PKI 文件。
- 在两台计算机上安装 OpenVPN 2.4 或更高版本,并确保它们通过网络连接。例如,服务器计算机运行 CentOS 6 Linux 和 OpenVPN 2.4,客户端运行 Fedora 20 Linux 和 OpenVPN 2.4。
- 服务器准备好添加 IPv6 支持配置中的
example2 - 4 - server.conf
文件;客户端准备好服务器端路由配置中的
basic - udp - client.conf
文件。
-
操作步骤
1. 在
example2 - 4 - server.conf
文件中添加一行内容来创建服务器配置文件:
push "redirect - gateway ipv6 !ipv4"
保存为
example2 - 8 - server.conf
。
2. 启动服务器:
[root@server]# openvpn --config example2 - 8 - server.conf
3. 在另一个服务器终端中,启用 IP 流量转发:
[root@server]# sysctl -w net.ipv6.conf.all.forwarding = 1
4. 启动客户端:
[root@client]# openvpn --config basic - udp - client.conf
客户端会输出如下内容:
add_route_ipv6(::/3 -> 2001:db8:100::1 metric -1) dev tun1
add_route_ipv6(2000::/4 -> 2001:db8:100::1 metric -1) dev tun1
add_route_ipv6(3000::/4 -> 2001:db8:100::1 metric -1) dev tun1
add_route_ipv6(fc00::/7 -> 2001:db8:100::1 metric -1) dev tun1
Initialization Sequence Completed
-
工作原理
当客户端连接到 OpenVPN 服务器时,服务器会向客户端推送一条特殊的重定向语句:
push "redirect - gateway ipv6 !ipv4"
其中,
ipv6
标志告知 OpenVPN 客户端通过向客户端操作系统添加三条路由,将所有 IPv6 流量重定向到隧道:
2000::/4
3000::/4
fc00::/4
这样就有效地将所有 IPv6 流量重定向到 VPN 隧道。而
!ipv4
标志则告知 OpenVPN 客户端不要重定向 IPv4 流量,此示例添加该标志是为了展示仅重定向 IPv6 流量的可能性。
-
其他方法
也可以通过在服务器配置文件中添加以下行来实现相同的效果:
push "route - ipv6 2000::/4"
push "route - ipv6 3000::/4"
push "route - ipv6 fc00::/4"
此方法在 OpenVPN 2.3 中也支持。但需要注意的是,如果服务器的 IPv6 地址与上述任何地址处于同一范围,那么此设置将会失败,因为所有上述 IPv6 网络的流量都将被重定向到隧道。为解决此问题,OpenVPN 2.4 引入了
ipv6
标志。
3. 使用 ifconfig - pool 块
此方法用于将普通 VPN 客户端与管理型 VPN 客户端分开,这样便于为管理用户设置不同的防火墙规则。
-
准备工作
- 使用本章第一个配置创建的 PKI 文件。
- 在两台计算机上安装 OpenVPN 2.3.9 或更高版本,并确保它们通过网络连接。例如,服务器计算机运行 CentOS 6 Linux 和 OpenVPN 2.3.9,普通 VPN 客户端运行 Windows 7 64 位和 OpenVPN 2.3.11,被分配到
192.168.200.0
网络;管理型 VPN 客户端运行 Fedora 20 Linux 和 OpenVPN 2.3.9,位于
192.168.202.0
网络。
- 准备好服务器端路由配置中的
basic - udp - client.conf
文件。
-
操作步骤
1. 创建服务器配置文件:
proto udp
port 1194
dev tun
mode server
ifconfig 192.168.200.1 255.255.255.0
ifconfig - pool 192.168.200.100 192.168.200.120
route 192.168.200.0 255.255.248.0 192.168.200.1
push "route 192.168.200.1"
push "route 192.168.200.0 255.255.248.0"
ca /etc/openvpn/cookbook/ca.crt
cert /etc/openvpn/cookbook/server.crt
key /etc/openvpn/cookbook/server.key
dh /etc/openvpn/cookbook/dh2048.pem
tls - auth /etc/openvpn/cookbook/ta.key 0
persist - key
persist - tun
keepalive 10 60
topology subnet
push "topology subnet"
user nobody
group nobody # use "group nogroup" on some distros
daemon
log - append /var/log/openvpn.log
client - config - dir /etc/openvpn/cookbook/clients
保存为
example2 - 9 - server.conf
。
2. 启动服务器:
[root@server]# openvpn --config example2 - 9 - server.conf
3. 使用客户端配置文件为管理型 VPN 客户端分配一个特殊的 IP 地址:
[root@server]# mkdir -m 755 /etc/openvpn/cookbook/clients
[root@server]# cd /etc/openvpn/cookbook/clients
[root@server]# echo "ifconfig - push 192.168.202.6 192.168.202.6" \
> client1
注意,客户端 VPN 地址列出了两次,这并非拼写错误。
4. 由于 OpenVPN 服务器进程启动后将以
nobody
用户身份运行,所以
clients
目录需要是全局可读的。
5. 使用之前配置的文件启动 Linux 客户端:
[root@AdminClient]# openvpn --config basic - udp - client.conf
客户端会输出如下内容:
[openvpnserver] Peer Connection Initiated with openvpnserver:1194
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6 = 0, tt->did_ifconfig_ipv6_setup = 0
/usr/sbin/ip link set dev tun0 up mtu 1500
/usr/sbin/ip addr add dev tun0 192.168.202.6/24 broadcast 192.168.200.255
Initialization Sequence Completed
这里高亮显示了分配给管理型客户端的 IP 地址。
6. 为 Windows 客户端创建配置文件:
client
proto udp
remote openvpnserver.example.com
port 1194
dev tun
nobind
ca "c:/program files/openvpn/config/ca.crt"
cert "c:/program files/openvpn/config/client2.crt"
key "c:/program files/openvpn/config/client2.key"
tls - auth "c:/program files/openvpn/config/ta.key" 1
remote - cert - tls server
保存为
basic - udp - client.ovpn
。注意使用正斜杠
/
,它比反斜杠
\
更易于使用,因为反斜杠每次都需要重复两次。
7. 使用安全通道(如
winscp
或 PuTTY 的
pscp
命令行工具)将
ca.crt
、
client2.crt
和
client2.key
文件以及
tls - auth
密钥文件
ta.key
传输到 Windows 机器上。
8. 使用 OpenVPN GUI 启动 Windows 客户端。记得此客户端的私钥文件受密码或密码短语保护。
9. 两台客户端连接后,验证它们可以相互 ping 通以及与服务器 ping 通(假设没有防火墙阻止访问):
- 在管理型客户端上:
[AdminClient]$ ping 192.168.200.1
[AdminClient]$ ping 192.168.200.102
- 在普通客户端上:
[WinClient]C:> ping 192.168.200.1
[WinClient]C:> ping 192.168.202.6
-
工作原理
服务器配置文件通常使用以下指令为客户端配置一系列 IP 地址:
server 192.168.200.0 255.255.255.0
该指令在内部会扩展为:
mode server
tls - server
ifconfig 192.168.200.1 192.168.200.2
ifconfig - pool 192.168.200.4 192.168.200.251
route 192.168.200.0 255.255.255.0
push "route 192.168.200.1"
if (topology == subnet) push "topology subnet"
因此,不使用
server
指令,而是指定自己的
ifconfig - pool
范围,就可以覆盖默认行为。然后使用 CCD 文件为管理型客户端分配一个超出
ifconfig - pool
范围的 IP 地址。通过使用适当的
route
和
push "route"
语句,确保所有客户端能够相互 ping 通。需要注意的是,在这种情况下,还需要显式推送拓扑结构,因为
server
指令不再自动完成此操作。
-
其他细节
- Windows 上的配置文件 :Windows 上的 OpenVPN GUI 应用程序总是从以下目录启动:
C:\Program Files\OpenVPN\config
或者在 64 位 Windows 系统上使用 32 位版本的 OpenVPN 时,从以下目录启动:
C:\Program Files(x86)\...
因此,
basic - udp - client.ovpn
配置文件中的目录路径可以省略:
ca ca.crt
cert client2.crt
key client2.key
tls - auth ta.key 1
- **客户端到客户端的访问**:通过此设置,即使在服务器端配置中未使用 `client - to - client` 指令,VPN 客户端也可以相互连接。这是由于服务器配置文件中的 `route` 和 `push "route"` 语句实现的。不使用 `client - to - client` 的优点是,仍然可以使用 `iptables` 或其他防火墙解决方案过滤不需要的流量。如果管理型客户端不需要连接到普通 VPN 客户端(反之亦然),则可以将子网掩码调整为:
route 192.168.200.0 255.255.255.0
push "route 192.168.200.0 255.255.255.0"
这样,网络就完全分开了。
-
使用 TCP 协议
:在上述示例中选择了 UDP 协议,客户端配置文件可以通过将以下行:
proto udp
更改为:
proto tcp
轻松转换为使用 TCP 协议。将此文件保存为
basic - tcp - client.ovpn
以备将来使用。
4. 使用状态文件
OpenVPN 提供了多种监控连接到服务器的客户端的选项,最常用的方法是使用状态文件。下面介绍如何使用和读取 OpenVPN 的状态文件。
-
准备工作
- 网络布局与服务器端路由配置的布局相同。
- 使用本章第一个配置创建的 PKI 文件。
- 在两台计算机上安装 OpenVPN 2.3.9 或更高版本,并确保它们通过网络连接。例如,服务器计算机运行 CentOS 6 Linux 和 OpenVPN 2.3.9,第一个客户端运行 Fedora 20 Linux 和 OpenVPN 2.3.9,第二个客户端运行 Windows 7 64 位和 OpenVPN 2.3.11。
- 服务器准备好服务器端路由配置中的
basic - udp - server.conf
文件;Linux 客户端准备好相同配置中的
basic - udp - client.conf
文件;Windows 客户端准备好之前配置中的
basic - udp - client.ovpn
文件。
-
操作步骤
1. 在
basic - udp - server.conf
文件中添加一行内容来创建服务器配置文件:
status /var/log/openvpn.status
保存为
example2 - 10 - server.conf
。
2. 启动服务器:
[root@server]# openvpn --config example2 - 10 - server.conf
3. 启动 Linux 客户端:
[root@client1]# openvpn --config basic - udp - client.conf
4. VPN 建立后,列出 `openvpn.status` 文件的内容:
[root@server]# cat /var/log/openvpn.status
5. 使用安全通道(如 `winscp` 或 PuTTY 的 `pscp` 命令行工具)将 `ca.crt`、`client2.crt` 和 `client2.key` 文件以及 `tls - auth` 密钥文件 `ta.key` 传输到 Windows 机器上。
6. 在命令行上启动 Windows 客户端:
[WinClient2]C:> cd \program files\openvpn\config
[WinClient2]C:> ..\bin\openvpn --config basic - udp - client.ovpn
记得此客户端的私钥文件受密码或密码短语保护。
7. 再次在服务器上列出状态文件的内容:
[root@server]# cat /var/log/openvpn.status
-
工作原理
每次客户端连接到 OpenVPN 服务器时,状态文件都会更新连接信息。OpenVPN 的CLIENTLIST和ROUTING TABLE表是最有用的,它们提供以下信息:- 哪些客户端已连接。
- 客户端从哪个 IP 地址连接。
- 每个客户端接收和传输的字节数。
-
客户端连接的时间。
此外,路由表还显示哪些网络被路由到每个客户端。
-
注意事项
-
状态参数
:
status指令接受两个参数:- 状态文件的文件名。
- 可选的状态文件更新刷新频率。大多数情况下,默认值 60 秒就足够了。
-
客户端断开连接
:当客户端断开连接时,状态文件不会立即更新。OpenVPN 首先会根据服务器配置文件中的
keepalive参数尝试重新连接客户端。此配置文件中使用的keepalive参数为:
-
状态参数
:
keepalive 10 60
这表示服务器将每 10 秒向客户端发送一次 ping 请求。如果在 60 秒 * 2 后仍未收到响应,则重新启动连接。OpenVPN 服务器会将第二个参数的值加倍。服务器还会告知客户端每 10 秒发送一次 ping 请求,并在 60 秒内未收到任何响应时重新启动连接。
-
显式退出通知
:OpenVPN 一个不太为人知的选项是以下指令:
explicit - exit - notify [N]
可以在客户端设置此指令,以便客户端断开连接时(如果可能)向服务器发送显式的
OCC_EXIT
消息。这将加快断开客户端的移除速度。可选参数
N
表示消息将发送的次数。默认情况下,只发送一条
OCC_EXIT
消息,由于 UDP 协议不保证数据包的传递,这可能会导致问题。
5. 管理接口
此部分介绍如何从服务器端使用管理接口管理 OpenVPN 客户端。
-
准备工作
- 网络布局与服务器端路由配置的布局相同。
- 使用本章第一个配置创建的 PKI 文件。
- 服务器计算机运行 CentOS 6 Linux 和 OpenVPN 2.3.9,客户端运行 Windows 7 64 位和 OpenVPN 2.3.10。
- 服务器准备好服务器端路由配置中的
basic - udp - server.conf
文件;Windows 客户端准备好之前配置中的
basic - udp - client.ovpn
文件。
-
操作步骤
1. 使用默认服务器配置文件启动服务器:
[root@server]# openvpn --config basic - udp - server.conf
2. 在 `basic - udp - client.ovpn` 文件中添加一行内容来为 Windows 客户端创建配置文件:
management tunnel 23000 stdin
保存为
example2 - 11.ovpn
。
3. 使用安全通道(如
winscp
或 PuTTY 的
pscp
命令行工具)将
ca.crt
、
client2.crt
和
client2.key
文件以及
tls - auth
密钥文件
ta.key
传输到 Windows 机器上。
4. 由于 OpenVPN GUI 不支持此管理接口的特定配置,因此在命令行上启动 Windows 客户端:
[WinClient]C:> cd \program files\openvpn\config
[WinClient]C:> ..\bin\openvpn --config example2 - 11.ovpn
OpenVPN 客户端会要求输入管理接口的密码,选择一个好的密码,之后会要求输入私钥密码短语。
5. VPN 建立后,在服务器上使用
telnet
程序连接到 OpenVPN 客户端的管理接口:
[server]$ telnet 10.200.0.3 23000
Trying 10.200.0.3...
Connected to 10.200.0.3.
Escape character is '^]'.
ENTER PASSWORD:
SUCCESS: password is correct
>INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
status
OpenVPN STATISTICS
Updated,Fri Feb 5 18:22:31 2016
TUN/TAP read bytes,21849
TUN/TAP write bytes,451
TCP/UDP read bytes,6571
TCP/UDP write bytes,30172
Auth read bytes,707
TAP - WIN32 driver status,"(null)"
END
signal SIGTERM
6. 使用 `Ctrl + ]` 或 `quit` 退出 `telnet` 程序。
-
工作原理
当 OpenVPN 客户端连接到服务器时,使用以下指令设置一个特殊的管理接口:
management tunnel 23000 stdin
它有以下参数:
-
tunnel
参数将管理接口绑定到 VPN 隧道本身,这对于测试目的和一些高级客户端设置很有用。在服务器端,最好始终为管理 IP 指定
127.0.0.1
。
- 管理接口将监听的端口
23000
。
- 最后一个参数是密码文件或特殊关键字
stdin
,表示管理接口密码将在 OpenVPN 启动时指定。注意,此密码与 OpenVPN 使用的私钥密码短语或任何其他用户管理密码完全无关。
管理接口启动后,服务器操作员可以使用
telnet
连接到它并查询客户端。客户端可以输入以下命令:
signal SIGTERM
这将使客户端像用户手动停止一样关闭,这显示了保护管理接口及其密码的重要性。
-
其他用途
管理接口也可以在 OpenVPN 服务器上运行,在这种情况下,可以列出已连接的客户端、断开它们的连接或执行各种其他 OpenVPN 管理任务。预计在未来版本的 OpenVPN 中,管理接口在客户端和服务器端都将变得更加重要,成为以编程方式与 OpenVPN 软件交互的首选方法。
6. 代理 ARP
此部分将使用 Linux 内核的代理 ARP 功能,使 VPN 客户端看起来像是服务器端局域网的一部分,这样就无需使用桥接,在大多数情况下这是更理想的选择。
-
准备工作
- 使用本章第一个配置创建的 PKI 文件。
- 服务器计算机运行 CentOS 6 Linux 和 OpenVPN 2.3.9,客户端运行 Windows 7 64 位和 OpenVPN 2.3.10。
- 服务器准备好服务器端路由配置中的
basic - udp - server.conf
文件;Windows 客户端准备好使用
ifconfig - pool
块配置中的
basic - udp - client.ovpn
文件。
客户端 - 服务器纯 IP 网络配置指南(续)
6. 代理 ARP(续)
-
操作步骤
-
服务器端配置
-
首先,编辑服务器的网络配置文件,开启 IP 转发功能。编辑
/etc/sysctl.conf文件,找到并修改或添加以下行:
-
首先,编辑服务器的网络配置文件,开启 IP 转发功能。编辑
-
服务器端配置
net.ipv4.ip_forward = 1
- 使配置生效,执行以下命令:
sysctl -p /etc/sysctl.conf
- 开启代理 ARP 功能,在服务器的网络接口上设置。假设服务器的外网接口为 `eth0`,VPN 接口为 `tun0`,执行以下命令:
echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/tun0/proxy_arp
- 为了让这些设置在系统重启后仍然生效,可以将上述命令添加到 `/etc/rc.local` 文件中。
2. **客户端连接**
- 客户端使用 `basic - udp - client.ovpn` 文件连接到服务器。连接成功后,客户端就可以像在服务器端局域网内一样进行通信。
-
工作原理
代理 ARP 是一种技术,当一个主机收到一个目的地址不是自己的 ARP 请求时,如果它知道如何到达该目的地址,就会以自己的 MAC 地址响应这个 ARP 请求。在这个场景中,服务器作为代理 ARP 设备,当局域网内的其他设备发送 ARP 请求查找 VPN 客户端的 MAC 地址时,服务器会以自己的 MAC 地址响应。这样,局域网内的设备就会认为 VPN 客户端和服务器在同一个局域网内,从而实现了 VPN 客户端看起来像是服务器端局域网的一部分的效果。
7. 总结与注意事项
-
配置总结
-
本文介绍了客户端 - 服务器纯 IP 网络配置的多个方面,包括特殊路由与 VPN 网关、重定向 IPv6 默认网关、使用
ifconfig - pool块、使用状态文件、管理接口和代理 ARP 等内容。 - 通过这些配置,可以实现不同类型客户端的区分管理、保护 IPv6 流量、监控客户端连接状态、远程管理客户端以及使 VPN 客户端融入服务器端局域网等功能。
-
本文介绍了客户端 - 服务器纯 IP 网络配置的多个方面,包括特殊路由与 VPN 网关、重定向 IPv6 默认网关、使用
-
注意事项
-
安全方面
- 管理接口的密码非常重要,需要妥善保护,避免被他人获取后对客户端或服务器进行恶意操作。
-
传输 PKI 文件和密钥文件时,要使用安全通道,如
winscp或 PuTTY 的pscp命令行工具,防止文件在传输过程中被窃取。
-
配置方面
-
在使用状态文件时,要注意客户端断开连接后状态文件不会立即更新,需要根据
keepalive参数等待一段时间。可以考虑使用explicit - exit - notify指令加快断开客户端的移除速度。 - 在配置服务器和客户端时,要确保各配置文件中的参数正确,特别是 IP 地址、端口号、密钥文件路径等。
-
对于 Windows 客户端,要注意配置文件中的路径格式,使用正斜杠
/更方便。
-
在使用状态文件时,要注意客户端断开连接后状态文件不会立即更新,需要根据
-
安全方面
流程图
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(准备工作):::process
B --> C{选择配置类型}:::decision
C -->|重定向 IPv6 默认网关| D(创建服务器配置文件):::process
C -->|使用 ifconfig - pool 块| E(创建服务器配置文件):::process
C -->|使用状态文件| F(创建服务器配置文件):::process
C -->|管理接口| G(创建客户端配置文件):::process
C -->|代理 ARP| H(服务器端配置):::process
D --> I(启动服务器):::process
E --> J(启动服务器):::process
F --> K(启动服务器):::process
G --> L(启动客户端):::process
H --> M(客户端连接):::process
I --> N(启动客户端):::process
J --> O(为管理型客户端分配 IP):::process
O --> P(启动客户端):::process
K --> Q(启动客户端):::process
N --> R(验证连接):::process
P --> R
Q --> R
L --> S(连接管理接口):::process
M --> R
S --> T(查询客户端):::process
R --> U([结束]):::startend
T --> U
表格总结
| 配置类型 | 主要作用 | 关键配置文件 | 注意事项 |
|---|---|---|---|
| 重定向 IPv6 默认网关 | 保护 IPv6 流量,防止流量泄露 |
example2 - 8 - server.conf
、
basic - udp - client.conf
| 服务器 IPv6 地址不能与重定向地址范围冲突 |
| 使用 ifconfig - pool 块 | 区分普通和管理型 VPN 客户端,便于设置防火墙规则 |
example2 - 9 - server.conf
、
basic - udp - client.conf
、
basic - udp - client.ovpn
| 客户端配置文件路径、客户端 IP 地址分配 |
| 使用状态文件 | 监控客户端连接状态 |
example2 - 10 - server.conf
、
basic - udp - client.conf
、
basic - udp - client.ovpn
| 客户端断开后状态文件更新延迟 |
| 管理接口 | 远程管理客户端 |
basic - udp - server.conf
、
example2 - 11.ovpn
| 管理接口密码保护 |
| 代理 ARP | 使 VPN 客户端融入服务器端局域网 |
basic - udp - server.conf
、
basic - udp - client.ovpn
| 服务器端 IP 转发和代理 ARP 开启 |
通过以上配置和操作,你可以根据自己的需求构建一个安全、高效的客户端 - 服务器纯 IP 网络环境。在实际应用中,要根据具体情况进行调整和优化,确保网络的稳定运行。

683

被折叠的 条评论
为什么被折叠?



