未越狱的iOS不能使用SS,而PPTP、L2TP等已经完全被破解根本无法使用,为了科学上网操碎了心。在CENTOS 7上安装OCSERV很简单,可以通过yum安装,也有一键安装包可用。但是试验多次都没能安装成功,只好回到CENTOS 6一步步手动安装。
首先准备编译环境
$ yum install pam-devel readline-devel http-parser-devel unbound gmp-devel
$ yum install tar gzip xz wget gcc make autoconf
然后安装ocserv的相关依赖
注意不要安装其他更新版本,否则会出错需要手动配置
安装nettle
$ wget ftp://ftp.gnu.org/gnu/nettle/nettle-2.7.1.tar.gz
$ tar zxvf nettle-2.7.1.tar.gz
$ cd nettle-2.7.1/
$ ./configure --prefix=/usr/local/nettle
$ make && make install
$ echo '/usr/local/nettle/lib64/' > /etc/ld.so.conf.d/nettle.conf
$ ldconfig
安装unbound
$ yum install expat-devel
$ wget http://unbound.nlnetlabs.nl/downloads/unbound-1.4.22.tar.gz
$ tar zxf unbound-1.4.22.tar.gz && cd unbound-1.4.22
$ ./configure --prefix=/usr --sysconfdir=/etc && make && make install
$ cd ..
$ echo '/usr/local/lib' > /etc/ld.so.conf.d/local-libraries.conf && ldconfig
$ unbound-anchor -a "/etc/unbound/root.key"</code>
安装gnutls
$ export NETTLE_CFLAGS="-I/usr/local/nettle/include/"
$ export NETTLE_LIBS="-L/usr/local/nettle/lib64/ -lnettle"
$ export HOGWEED_LIBS="-L/usr/local/nettle/lib64/ -lhogweed"
$ export HOGWEED_CFLAGS="-I/usr/local/nettle/include"
$ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.3/gnutls-3.3.9.tar.xz
$ tar xvf gnutls-3.3.9.tar.xz
$ cd gnutls-3.3.9/
$ ./configure --prefix=/usr/local/gnutls
$ make && make install
$ ln -s /usr/local/gnutls/bin/certtool /usr/bin/certtool
$ echo '/usr/local/gnutls/lib/' > /etc/ld.so.conf.d/gnutls.conf
$ ldconfig
安装libnl
$ yum install bison flex
$ wget http://www.carisma.slowglass.com/~tgr/libnl/files/libnl-3.2.24.tar.gz
$ tar xvf libnl-3.2.24.tar.gz
$ cd libnl-3.2.24
$ ./configure --prefix=/usr/local/libnl
$ make && make install
$ echo '/usr/local/libnl/lib/' > /etc/ld.so.conf.d/libnl.conf
$ ldconfig
安装ocserv
$ export LIBNL3_CFLAGS="-I/usr/local/libnl/include/libnl3"
$ export LIBNL3_LIBS="-L//usr/local/libnl/lib/ -lnl-3 -lnl-route-3"
$ export LIBGNUTLS_LIBS="-L/usr/local/gnutls/lib/ -lgnutls"
$ export LIBGNUTLS_CFLAGS="-I/usr/local/gnutls/include/"
$ wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.9.0.1.tar.xz
$ tar xvf ocserv-0.9.0.1.tar.xz
$ cd ocserv-0.9.0
$ ./configure --prefix=/usr/local/ocserv
$ make && make install
$ echo 'export PATH=$PATH://usr/local/ocserv/sbin/:/usr/local/ocserv/bin/' >> $HOME/.bashrc
$ source $HOME/.bashrc
准备自签证书
$ mkdir cert
$ cd cert
CA证书生成
创建CA模板 cn 与 organization 随便填写
$ vi ca.tmpl
填入以下内容
cn = "Your CA name"
organization = "Your fancy name"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key
$ certtool --generate-privkey --outfile ca-key.pem
$ certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem
服务器证书生成
cn必须填写自己服务器的ip或指向该ip的域名
$ vi server.tmpl
填入以下内容
cn = "Your hostname or IP"
organization = "Your fancy name"
expiration_days = 3650
signing_key
encryption_key
tls_www_server
$ certtool --generate-privkey --outfile server-key.pem
$ certtool --generate-certificate --load-privkey server-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template server.tmpl --outfile server-cert.pem
客户端(ios)证书生成
$ vi user.tmpl
填入以下内容
cn = "some random name"
unit = "some random unit"
expiration_days = 365
signing_key
tls_www_client
$ certtool --generate-privkey --outfile user-key.pem
$ certtool --generate-certificate --load-privkey user-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template user.tmpl --outfile user-cert.pem
将用户证书转换为ios上的p12证书
$ openssl pkcs12 -export -inkey user-key.pem -in user-cert.pem -certfile ca-cert.pem -out user.p12
复制证书到以下文件夹
$ cp ca-cert.pem /etc/ssl/certs/my-ca-cert.pem
$ cp server-cert.pem /etc/ssl/certs/my-server-cert.pem
$ cp server-key.pem /etc/ssl/private/my-server-key.pem
配置ocserv
$ mkdir /etc/ocserv
$ cp doc/sample.config /etc/ocserv/ocserv.conf
编辑ocserv.conf文件按以下内容进行配置,注意参数末尾不要加空格
$ vim /etc/ocserv/ocserv.conf
登陆方式,目前先用密码登录
auth = "plain[/etc/ocserv/ocpasswd]"
max-clients = 10
限制同一客户端的并行登陆数量
max-same-clients = 10
服务监听的IP(服务器IP,可不设置)
#listen-host = 1.2.3.4
服务监听的TCP/UDP端口
tcp-port = 9200
udp-port = 9201
自动优化VPN的网络性能
try-mtu-discovery = true
确保服务器正确读取用户证书(后面会用到用户证书)
#cert-user-oid = 2.5.4.3
服务器证书与密钥
server-cert = /etc/ssl/certs/server-cert.pem
server-key = /etc/ssl/private/server-key.pem
客户端连上vpn后使用的dns
dns = 8.8.8.8
dns = 8.8.4.4
注释掉所有的route,让服务器成为gateway
#route = 192.168.1.0/255.255.255.0
启用cisco客户端兼容性支持
cisco-client-compat = true
开着这个会报错:error: ‘isolate-workers’ is set to true, but not compiled with seccomp or Linux namespaces support
好像是内核不支持,反正自己看着办
#isolate-workers = false
device = vpns
session-control = true
keepalive = 32400
dpd = 90
auth-timeout = 40
cookie-timeout = 300
deny-roaming = false
rekey-time = 172800
rekey-method = ssl
use-utmp = true
use-occtl = true
pid-file = /var/run/ocserv.pid
socket-file = /var/run/ocserv-socket
run-as-user = nobody
run-as-group = nobody
predictable-ips = true
ipv4-network = 192.168.10.0
ipv4-netmask = 255.255.255.0
ping-leases = false
创建一个登陆用的用户名与密码
$ ocpasswd -c /etc/ocserv/ocpasswd username
如报错: -bash: ocpasswd: command not found,则
$ cd /usr/local/src/ocserv-0.9.0.1/src
$ cp ocpasswd /usr/bin
再运行
$ ocpasswd -c /etc/ocserv/ocpasswd username
修改系统配置,允许转发
$ vim /etc/sysctl.conf
#修改这行
net.ipv4.ip_forward = 1</code>
保存退出
$ sysctl -p
其他行的报错不用管
防火墙设置
$ iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o venet0 -j MASQUERADE
$ iptables -A FORWARD -s 192.168.10.0/24 -j ACCEPT
$ iptables -A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT
$ iptables -A INPUT -p udp -m state --state NEW --dport 443 -j ACCEPT
$ service iptables save
IP段和venet0接口要根据自己的情况修改
最后运行服务
$ ocserv -c /etc/ocserv/ocserv.conf
测试OCserv
在服务器端启动OpenConnect Server。
$ ocserv -f -d 1
如果服务没错误退出,是时候来测测客户端了。假设你使用iOS,下载Cisco AnyConnect。
在Connections下加入新的VPN配置,在服务器地址栏目上填入对应的IP/Hostname和TCP端口
然后到设置标签页下暂时禁用“阻止不信任的服务器”选项。首次连接,AnyConnect会提示你这是不信任证书,如果你之前的服务器证书模板的cn没写错的话,你可以接受并导入该证书(可在诊断标签页的证书菜单里的服务器证书列表看到)。以后即便启用“阻止不信任的服务器”选项,也不会报错了(和SSH首次登陆类似)。
确定VPN连接正常并可以科学上网后,我们可以接着提高网络生活质量。
自动化OCserv
配置开机启动
$ vi /etc/rc.d/rc.local
添加:
/usr/local/sbin/ocserv -c /usr/local/etc/ocserv/ocserv.conf
注意修改安装路径
然后我们要通过URL将客户端证书user.p12文件导入AnyConnect,具体位置在诊断标签页的证书栏目下。如果你的服务器已经有Nginx/Apache服务,只要传到一个可以访问的URL路径下即可。如果没有,请参照Nginx官网或Linode的Nginx入门教程。
导入成功之后,将对应的VPN设置的高级设置部分的证书栏目,改为导入的这张证书。
最后我们要调整下OCserv的配置——
$ vim /etc/ocserv/ocserv.conf
修改以下内容
改为证书登陆,注释掉原来的登陆模式
auth = "certificate"
证书认证不支持这个选项,注释掉这行
#listen-clear-file = /var/run/ocserv-conn.socket
启用证书验证
ca-cert = /etc/ssl/certs/my-ca-cert.pem
证书方式下需要设置为false,如报错可注释掉
isolate-workers = false
重启OCserv服务,确认VPN无需密码就可以正常登陆。
参考文章
Centos6上搭建翻墙服务 CentOS6配置AnyConnec 在 CentOS 6.7 上配置 Cisco AnyConnect VPN
评论
本文评论功能已关闭。