导读 OpenVPN是一款高度可扩展的VPN软件,除了既有的将应用客户端安全接入服务器这一传统功能外,还可以让你无缝的接入一个远程的局域网,正如你身在该局域网一样,如果你不用OpenVPN,你将很难做到这一点。当然,你可以选择像IPSec这样的重量级VPN,但是你的生活从此将不再简单,你也可以使用拨号,连接到远程,但是你永远无法体验完全接入这种身临其境的感觉。这就是OpenVPN的桥接功能,有了该功能,你将可以无限扩展局域网,你甚至可以将全世界连接在一个局域网内,每一个OpenVPN服务器都可以作为一个以太网桥存在,将局域网直接拉到很远的地方,距离再也不是问题。
一、使用证书认证的OpenVPN 服务端

网桥模式的 OpenVPN 适用场景为公网对内网的融合,比如在公网上访问内网的 windows 磁盘共享,共享打印机等,好处是桥接模式使用的是二层协议,具有arp穿透性,可以通过 arp 穿透 netbios 协议。当然事物永远是两面的,如果不能正当的保存好登录凭证,有给内网带来集中爆破的危险。

警告:
请不要通过远程来配置桥接模式的OpenVPN服务器,否则会使管理员处于脱机的尴尬境地,切记!
1、 安装FreeBSD

略......,调整时区:
方法1、
#bsdconfig
timezone ->NO ->Asia ->OK ->ENTER ->china ->Beijing Time ->OK

方法2、推荐
#cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
设置并更新时间:
#date 201710210907
#ntpdate time.windows.com21 Oct 09:07:50 ntpdate[2186]: step time server 13.65.88.161 offset 79.088716 sec

2、 安装openvpn

#pkg install –y openvpn

3、 创建openvpn所需目录

#mkdir /usr/local/etc/openvpn

4、 拷贝openvpn所需配置文件

#cd /usr/local/etc/openvpn/
#cp /usr/local/share/examples/openvpn/sample-config-files/server.conf ./openvpn.conf

5、 制作openvpn所需证书,需要依赖easy-rsa包,安装openvpn的时候自动装上了。

#cd /usr/local/share/easy-rsa/
修改 vars 为FreeBSD 所用,去掉 vars #注释内容大致得到如下信息
#cat vars
export EASY_RSA="`pwd`"
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
export KEY_DIR="$EASY_RSA/keys"
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
export KEY_SIZE=1024
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_EMAIL=mail@host.domain
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=changeme
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

拷贝 vars 文件成 freebsd-vars 进行修改成适合csh执行的格式
#cp vars freebsd-vars
setenv EASY_RSA `pwd`
setenv OPENSSL openssl
setenv PKCS11TOOL pkcs11-tool
setenv GREP grep
setenv KEY_CONFIG /usr/local/share/easy-rsa/openssl-1.0.0.cnf #使用最高版本
setenv KEY_DIR /usr/local/etc /keys #证书生成目录
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
setenv PKCS11_MODULE_PATH dummy
setenv PKCS11_PIN dummy
setenv KEY_SIZE 1024 #指定密钥长度
setenv CA_EXPIRE 3650
setenv KEY_EXPIRE 3650
setenv KEY_COUNTRY CN #国家代码
setenv KEY_PROVINCE CA #省级代码
setenv KEY_CITY ErDos #城市简称
setenv KEY_ORG dongsheng #证书组织
#setenv KEY_EMAIL gqh95@163.com #邮箱地址
setenv KEY_EMAIL gqh95@163.com
setenv KEY_CN iceage #以下随意
setenv KEY_NAME iceage
setenv KEY_OU iceage
setenv PKCS11_MODULE_PATH iceage
setenv PKCS11_PIN iceage

6、 使证书所需环境生效,以后每次生成客户端证书的时候都需要执行一次此步骤

#source ./freebsd-vars

7、 生成服务器ca证书

#./clean-all 1
#mkdir /usr/local/etc/keys 2
#./build-ca 3

    1. 1 更新keys目录文件,清除垃圾

 

    1. 2 创建证书目录

 

    3 可以一路回车不要输入短语密码
8、 生成服务器密钥

#./build-key-server server

9、生成客户端密钥对,也可以以后生成

#./build-key client1
需要输入两个 y 来确认生成,其余回车。

10、生成服务器所需dh文件

#./ build-dh

11、拷贝服务器所需文件到配置目录

#cd /usr/local/etc/keys
#cp ca.crt ca.key dh1024.pem server.crt server.key ../openvpn
#cd ../openvpn
#ls
dh1024.pem server.crt ca.crt openvpn.conf server.key ca.key

注意:这里应该是6个文件

12、配置文件

A、配置 /etc/rc.conf
cloned_interfaces="bridge0 tap0"
ifconfig_em0="up"
ifconifg_tap0="up"
ifconfig_bridge0="addm em0 addm tap0 up"
ifconfig_tap0="inet 10.1.74.90/24"
defaultrouter="10.1.74.254"

注意:参数一定按当前的顺序书写,请保持参数现有的位置否则网络会建立失败!

B、配置/etc/rc.conf.local 大致格式如下:
hostname="openvpn.org"
sshd_enable="YES"
openvpn_enable="YES"
gateway_enable="YES"

建立好此文件可以使用如下脚本命令使网络环境立即生效
# /etc/netstart
这里服务地址需要绑定在虚拟网卡 tap0上、创建openvpn 所需的tap 设备,并且使物理网卡 em0 与虚拟网卡 tap0 做成桥接模式。经实测网关模式可有可无,因为我们用的是桥接模式,建议加上吧,如果以后想用路由模式省的改了。

13、调整openvpn配置文件

去掉注释大概如下所示
#vi /usr/local/etc/openvpn.conf
port 1194
;proto tcp
proto udp
dev tap0 #使用tap虚拟网卡,并明确指定对应虚拟接口tap0
;dev tun
;dev-node MyTap
#######以下四行指定了服务器所需文件,默认即可#####
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
###################################################
;topology subnet
ifconfig-pool-persist ipp.txt
#以下1行指定了网桥发送给客户端的地址范围,建议和服务器同网段但不要和服务器
#所在的网段IP所在的DHCP所分配地址重合,并且务必设置74.90为虚拟网关,不要设置成内网的
#真实网关,这个虚拟网关地址应该和虚拟网卡tap0地址一致。
server-bridge 10.1.74.90 255.255.255.0 10.1.74.100 10.1.74.200
;push "route 10.1.74.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;ifconfig-push 10.9.0.1 10.9.0.2
;learn-address ./script
;push "redirect-gateway def1 bypass-dhcp bypass-dns"
;push "redirect-gateway" #推送重定向默认路由,如果希望客户端所有流量都走vpn请
#使用此选项,如果只是内网某些网段,请使用 push “roué 选项
;push "dhcp-option DNS 208.67.222.222" #此选项为重定向客户端 DNS
;push "dhcp-option DNS 208.67.220.220"
client-to-client #使用此项则客户端之间可见
duplicate-cn
keepalive 10 120
;tls-auth ta.key 0 # This file is secret
;cipher BF-CBC # Blowfish (default)
;cipher AES-128-CBC # AES
;cipher DES-EDE3-CBC # Triple-DES
comp-lzo #此项为使用数据压缩,需要comp-lzo支持,安装openvpn时为依赖安装
;max-clients 100
;user nobody
;group nobody
persist-key
persist-tun
status openvpn-status.log
;log openvpn.log
log-append openvpn.log
verb 3
;mute 20

14、启动服务器

#service openvpn start
至此、OpenVPN 服务器桥接证书验证模式完成,客户端调试,略....

二、使用用户名密码方式认证的OpenVPN 服务端
1、安装服务器同上!
2、增加服务端配置参数

#cat/usr/local/etc/openvpn/openvpn.conf
#增加如下内容
plugin /usr/local/lib/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
client-cert-not-required
username-as-common-name

    1. 定义openvpn 使用认证库,调用/etc/pam.d/下的openvpn文件中认证方式

 

    1. 定义取消使用证书认证

 

    定义使用用户名密码认证
3、安装pam_pwdfile 认证模块

此模块是调用文件中的用户名密码认证,与数据库方式类似。
#pkg install –y pam_pwdfile

4、配置pam 认证文件

#touch /etc/pam.d/openvpn
#vi /etc/pam.d/openvpn
#增加如下内容
auth required /usr/local/lib/pam_pwdfile.so pwdfile=/usr/local/etc/openvpn/passwd
account sufficient pam_permit.so

    1. 定义openvpn使用pam_pwdfile认证库,认证文件为 passwd

 

    这行定义认证行为库
5、创建密码文件

#touch /usr/local/etc/openvpn/passwd

6、使用下面的perl脚本生成密码

# vi /usr/local/etc/add_ftp_user.pl
#! /usr/bin/perl -w
#filename: md5pwd.pl
use strict;
#
print "#example: user:passwd\n";
while () {
exit if ($_ =~/^\n/);
chomp;
(my $user, my $pass) = split /:/, $_, 2;
my $crypt = crypt $pass, '$1$' . gensalt(8);
print "$user:$crypt\n";
}
sub gensalt {
my $count = shift;
my @salt = ('.', '/', 0 .. 9, 'A' .. 'Z', 'a' .. 'z');
my $s;
$s .= $salt[rand @salt] for (1 .. $count);
return $s;
}

重要:
以上脚本来自于网路,社区内有更高级的 C 语言版多算法密码生成器,如想获得请加社区联系

为脚本添加执行权限
# chmod +x /usr/local/etc/add_ftp_user.pl
使用如下格式生成密码 格式 [用户名:密码]
# /usr/local/etc/add_ftp_user.pl
user:$1$gLAEihTV$jQnPZDk4C8TZSrc.L7gLm/

将生成的user:$1$gLAEihTV$jQnPZDk4C8TZSrc.L7gLm/ 添加到 /usr/local/etc/openvpn/passwd 。并将 user 修改为要使用的用户名。以后每增加一个用户则在此文件中增加一条密码记录即可。

至此、OpenVPN 服务器桥接密码验证模式完成,客户端调试,略....

原文来自:https://www.chinafreebsd.cn/article/59eb13ae93157

本文地址:https://www.linuxprobe.com/openvpn-bridge-mode.html编辑:冯振华,审核员:逄增宝

本文原创地址:https://www.linuxprobe.com/openvpn-bridge-mode.html编辑:public,审核员:暂无