在 Gentoo 上成功部署了 OpenConnect ,来分享一下 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
bolasblack
V2EX    分享创造

在 Gentoo 上成功部署了 OpenConnect ,来分享一下

  •  1
     
  •   bolasblack
    bolasblack 2015-01-31 12:14:38 +08:00 3569 次点击
    这是一个创建于 3910 天前的主题,其中的信息可能已经有所发展或是发生改变。

    终于忍受不了 iOS 上翻墙的蛋疼劲了,VPN 一锁屏就断。和废掉完全没区别。所以,查查资料,我们来装 ocserv 吧。

    安装 GnuTLS

    ocserv 最让人头疼的事情在于他依赖 GnuTLS 3.x ,Gentoo 的源里目前它还是 2.x 的状态,所以没办法,只能自己编译。

    cd ~ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.3/gnutls-3.3.12.tar.xz tar xvf gnutls-3.3.12.tar.xz cd gnutls-3.3.12 ./configure --enable-shared make -j2 && sudo make install 

    编译完成后使用 sudo gnutls-cli -v 看看打印出来的版本号:

    gnutls-cli 3.3.12 Copyright (C) 2000-2015 Free Software Foundation, and others, all rights reserved. This is free software. It is licensed for use, modification and redistribution under the terms of the GNU General Public License, version 3 or later <http://gnu.org/licenses/gpl.html> 

    如果提示:

    gnutls-cli: error while loading shared libraries: libgnutls-dane.so.0: cannot open shared object file: No such file or directory 

    类似的错误,就给 /root/.bashrc 加一行:

    export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib 

    至此,GnuTLS 就装的差不多了。

    安装 ocserv

    这个教程一抓一大吧,而且问题似乎都不大。

    cd ~ 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 PKG_CONFIG_PATH=~/gnutls-3.3.12/lib/ ./configure make -j2 && sudo make install 

    这样子就编译安装完成了。接下来配置 ocserv 。

    配置 ocserv

    先建证书:

    sudo mkdir -p /etc/ocserv/certificates cd /etc/ocserv/certificates 

    创建 ca.tmpl 模板,这里的 cnorganization 可以随便写:

    cn = "Your CA name" organization = "Your fancy name" serial = 1 expiration_days = 3650 ca signing_key cert_signing_key crl_signing_key 

    创建 server.tmpl 模板,这里的 cn 必须对应最终提供服务的 hostname 或 IP :

    cn = "Your hostname or IP" organization = "Your fancy name" expiration_days = 3650 signing_key encryption_key tls_www_server 

    然后来建证书:

    sudo certtool --generate-privkey --outfile ca-key.pem sudo certtool --generate-privkey --outfile server-key.pem sudo 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 

    然后来改配置:

    sudo cp ~/ocserv-0.9.0/doc/sample.config /etc/ocserv/ocserv.conf sudo vim /etc/ocserv/ocserv.conf 

    文件内容:

    # 登陆方式,目前先用密码登录 auth = "plain[/etc/ocserv/ocpasswd]" # 允许同时连接的客户端数量 max-clients = 4 # 限制同一客户端的并行登陆数量 max-same-clients = 2 # 服务监听的IP(服务器 IP ,可不设置) listen-host = 1.2.3.4 # 服务监听的 TCP/UDP 端口,这个自己看着办,客户端以 IP:PORT 的格式来连接 # 如果改了的话两个端口最好不同,我在使用时发现如果端口相同的话,会导致请求被阻塞的情况 tcp-port = 9000 udp-port = 9001 # 自动优化 VPN 的网络性能 try-mtu-discovery = true # 服务器证书与密钥 server-cert = /etc/ocserv/certificates/server-cert.pem server-key = /etc/ocserv/certificates/server-key.pem # 客户端连上 VPN 后使用的 DNS dns = 8.8.8.8 # 注释掉所有的 route ,让服务器成为 gateway #route = 192.168.1.0/255.255.255.0 # 启用 cisco 客户端兼容性支持 cisco-client-compat = true 
    Error: language "conf" is not supported

    最后生成帐号密码文件:

    sudo ocpasswd -c /etc/ocserv/ocpasswd username 

    其他配置

    Linode 的配置 为例,新建或修改 /etc/iptables.firewall.rules 文件:

    # 如果是新建文件才需要这行 *filter # 这里的端口填 ocserv 配置里的 tcp-port 和 udp-port -A INPUT -p tcp -m state --state NEW --dport 9000 -j ACCEPT -A INPUT -p udp -m state --state NEW --dport 9001 -j ACCEPT # 注释这行,允许转发 # -A FORWARD -j DROP # 如果是新建文件才需要这行 COMMIT #启用NAT *nat -A POSTROUTING -j MASQUERADE COMMIT 
    Error: language "iptables" is not supported

    完成之后导入新配置并检查配置正确:

    sudo iptables-restore < /etc/iptables.firewall.rules sudo iptables -L sudo iptables -t nat -L 

    接着打开 IPv4 的流量转发:

    sudo vim /etc/sysctl.conf 

    启用此项:

    net.ipv4.ip_forward=1 

    刷新配置:

    sudo sysctl -p /etc/sysctl.conf 

    测试一下

    sudo ocserv -f -d 1 

    如果运行成功,就下载一个 AnyConnect 客户端来测试一下。

    如果证书是自己签发的,那么 iOS 客户端在连接前先到 Settings 标签页关闭 Block Untrusted Servers

    Troubleshooting

    ocserv: error while loading shared libraries: libgnutls.so.28: cannot open shared object file: No such file or directory

    启动 ocserv 的命令改一下:

    sudo LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib ocserv -f -d 1 

    无法访问国内网站

    错误信息:

    ocserv[15995]: main: 客户端IP:1035: unexpected DTLS content type: 23; possibly a firewall disassociated a UDP session 

    /etc/ocserv/ocserv.conf 加两个路由:

    route = 0.0.0.0/128.0.0.0 route = 128.0.0.0/128.0.0.0 

    余话

    关于开机自动启动 ocserv ,开机自动载入 iptables 配置,客户端证书自动连接,这些东西我就不在这里写了,可以看下面的参考文章。

    我建了一个 Gist :Gentoo 的 ocserv 启动脚本: https://gist.github.com/bolasblack/9f53b048e46f538cf08d

    记得把 PIDFILE 的路径改成 /etc/ocserv/ocserv.conf 里配置的 pid-file 路径。

    最后,祝 GFW 早日被终结。

    原文地址: https://github.com/bolasblack/BlogPosts/blob/master/2015-01-30-Gentoo_%E4%B8%8A%E9%83%A8%E7%BD%B2_ocserv.md

    参考文章:

    11 条回复    2015-07-08 15:49:00 +08:00
    felixhsuneo
        1
    felixhsuneo  
       2015-01-31 12:25:49 +08:00 via iPhone
    我一直用原先国外上学时的学生账号登录学校vpn,貌似那个就是anyconnect的,问题是为啥没墙掉呢?
    tititake
        2
    tititake  
       2015-01-31 12:33:55 +08:00   1
    gnutls 的~x86分支已经是 3.3.12 版了, keyword
    Available versions: 2.12.23-r6 (~)3.3.10-r2 (~)3.3.12

    另外把 7.02的ebuild升级下,貌似更好一些
    http://gpo.zugaina.org/net-misc/openconnect
    halczy
        3
    halczy  
       2015-01-31 12:33:56 +08:00
    感谢楼主分享.

    教程里有个问题, TCP Port不是一定要设在443的吗? 楼主设在TCP 9000能链接吗?
    halczy
        4
    halczy  
       2015-01-31 12:36:44 +08:00
    @halczy 额...没事了. 忘记在客户端域名后加端口了.
    bolasblack
        5
    bolasblack  
    OP
       2015-01-31 12:46:14 +08:00
    @tititake 啊,非常感谢,我 `emerge -S gnutls` 的时候看到了这个,还以为源里还是 2.x 的呢:

    ```
    * net-libs/gnutls
    Latest version available: 2.12.23-r6
    Latest version installed: 2.12.23-r6
    Size of files: 7,109 KiB
    Homepage: http://www.gnutls.org/
    Description: A TLS 1.2 and SSL 3.0 implementation for the GNU project
    License: GPL-3 LGPL-2.1
    ```
    bolasblack
        6
    bolasblack  
    OP
       2015-01-31 12:47:30 +08:00
    @tititake 还有,http://gpo.zugaina.org/net-misc/openconnect 这里的好像是 ocserv 的客户端?我这个是服务端来着……
    tititake
        7
    tititake  
       2015-01-31 12:52:17 +08:00
    @bolasblack 是的,我看错了。我以为像OpenVPN那样,客户端和服务端一起的呢。
    不过看编译过程,没有什么特别的要求,改成ebuild应该比较容易,这样升级/卸载都很方便了。

    emerge -S 太慢,可以试试eix
    bolasblack
        8
    bolasblack  
    OP
       2015-01-31 12:54:15 +08:00
    @tititake 嗯,确实有打算写成 ebuild ,不过拖延症发作……稍微等等再写吧……
    isspy
        9
    isspy  
       2015-01-31 14:04:09 +08:00
    MARK
    kxmp
        10
    kxmp  
       2015-01-31 15:01:43 +08:00
    我用的大天鹅...
    lvii
        11
    lvii  
       2015-07-08 15:49:00 +08:00
    整了个 ebuild 在 openrc 下测试, OK systemd 木有测试。欢迎测试

    https://github.com/lvii/outman/blob/master/net-misc/ocserv/ocserv-0.10.6.ebuild
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3766 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 10:20 PVG 18:20 LAX 03:20 JFK 06:20
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86