0%

openvpn原理入门

2019年12月21日 上午11:26

2.1.1.2.1 OpenVPN原理与实现浅析 · suhao/awesome Wiki · GitHub

openvpn简易原理:两个关键词(虚拟网卡上建立的虚拟的局域网络)

  1. 虚拟网卡
    1. 在Linux2.4版本之上,操作系统支持一个名为tun的设备,驱动程序中包含一个字符设备驱动和一个网卡驱动。
      • 网卡驱动可以把从TCP/IP协议栈收到的数据包结构转发到tun设备读取列表,用户进程通过调用read可获取完整的IP数据包传递给用户
      • 字符驱动的write可以把用户数据传入TCP/IP协议栈
      • 设备以字符设备形式被读写,能够配置IP地址和路由
    2. OpenVPN实现SSLVPN,虚拟网卡是关键
  2. 虚拟的局域网络
    1. OpenVPN服务器一般需要配置一个虚拟IP地址池和一个自用的静态虚拟IP地址(静态地址和地址池必须在同一个子网中),然后为每一个成功建立SSL连接的客户端动态分配一个虚拟IP地址池中未分配的地址。
    2. 从而将物理网络中的客户端和OpenVPN服务器就连接成一个虚拟网络上的星型结构局域网, OpenVPN服务器成为每个客户端在虚拟网络上的网关
    3. OpenVPN服务器同时提供对客户端虚拟网卡的路由管理。
    4. 当客户端对OpenVPN服务器后端的应用服务器的任何访问时,数据包都会经过路由流经虚拟网卡, OpenVPN程序在虚拟网卡上截获数据IP报文,然后使用SSL协议将这些IP报文封装起来,再经过物理网卡发送出去
    5. OpenVPN的服务器和客户端在虚拟网卡之上建立起一个虚拟的局域网络 ,这个虚拟的局域网对系统的用户来说是透明的

使用openvpn的场景:

  1. 首先,有两台服务器:A,B,这两台本身就是可以ping通的。
  2. 那么,既然A,B之间本身就是可以建立连接的,eg:ssh,为什么还需要使用openvpn?
    1. 当A希望访问C时,并且不希望让C知道是A在访问时(当A无法之间访问C,需要通过B来间接访问),这时就需要对C来说,需要让B来代理A,代替A来访问C
    2. 当A,B之间需要指定自定义的局域网网段地址时,这时就需要虚拟一个网卡,在这个网卡上建立自定义的局域网网段地址。

服务端参数讲解:

这部分摘自openvpn简易安装脚本-江哥架构师笔记的中.sh源码!!

  1. 扩展配置:
    1. 是否需要设置客户端默认路由走openvpn网络?
    2. 是否需要给客户端推送静态路由,访问指定的网络号时走openvpn网络?
      • push \"route ${intranet_route_info} vpn_gateway \"
    3. 是否需要开启客户端密码认证?
      • auth-user-pass-verify ../checkpsw.sh via-env #使用密码文件认证
      • username-as-common-name #暂不明,和auth-user-pass-verify 一起使用
  2. 标准配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Local $IP     #指定监听的本机IP(因为有些计算机具备多个IP地址),该命令是可选的,默认监听所有IP地址。
    port 1194 #指定监听的本机端口号
    proto udp #指定采用的传输协议,可以选择tcp或udp
    dev tun #指定创建的通信隧道类型,可选tun或tap
    ca ca.crt #指定CA证书的文件路径
    cert server.crt #指定服务器端的证书文件路径
    key server.key #指定服务器端的私钥文件路径
    dh dh1024.pem #指定迪菲赫尔曼参数的文件路径
    server $NETMASK #指定虚拟局域网占用的IP地址段和子网掩码,此处配置的服务器自身占用10.0.0.1。
    ifconfig-pool-persist ipp.txt #服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
    tls-auth ta.key 0 #开启TLS-auth,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。
    keepalive 10 120 #每10秒ping一次,连接超时时间设为120秒。
    comp-lzo #开启VPN连接压缩,如果服务器端开启,客户端也必须开启
    client-to-client #允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
    persist-key
    persist-tun #持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。
    status openvpn-status.log #指定记录OpenVPN状态的日志文件路径
    verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
    duplicate-cn #允许一个客户端证书同时被多个终端使用
    max-clients 1000 #客户端链接最大数量
    script-security 3 # 开启配置文件中自定义脚本
  3. 其他:
    • 配置iptables转发设置
      • iptables -t nat -A POSTROUTING -s 172.16.98.0/24 -o eth1 -j MASQUERADE
      • 不指定外网网卡的话,客户端可以连接内网!如果是为了拨入内网,去掉-o eth1即可
    • push