树莓派搭建docker openV**以及ipv6隧道

2019-11-26 16:25:13 浏览数 (1)

本文由腾讯云 社区自动同步,原文地址 https://stackoverflow.club/article/openV**_pi_ipv6/

简介

openV**可以方便地穿越nat,是替代pptp的好工具。但是openV**也有配置证书的步骤繁多的难点,本文主要介绍几种安装openV**的方法,以及ipv6 in ipv4的方法(客户端通过openV**获取ipv6地址并上网)

本文介绍的方法同样适用于x86 amd64设备。

最简方法

最简单的方法当然是docker,在树莓派中先安装docker,然后下载openV**的镜像

代码语言:javascript复制
docker pull giggio/openV**-arm

设置一个本地存储

代码语言:javascript复制
OV**_DATA="/home/wenfeng/oV**-data"

生成ca

V**.SERVERNAME.COM是你的服务器域名或者ip地址

代码语言:javascript复制
docker run -v $OV**_DATA:/etc/openV** --rm giggio/openV**-arm oV**_genconfig -u udp://V**.SERVERNAME.COM
docker run -v $OV**_DATA:/etc/openV** --rm -it giggio/openV**-arm oV**_initpki nopass

运行服务进程

代码语言:javascript复制
docker run -v $OV**_DATA:/etc/openV** -d --name openV** -p 1194:1194/udp --cap-add=NET_ADMIN giggio/openV**-arm

为客户端生成证书

CLIENTNAME是自定义的客户端名称。

代码语言:javascript复制
docker run -v $OV**_DATA:/etc/openV** --rm -it giggio/openV**-arm easyrsa build-client-full CLIENTNAME nopass

将证书从container中取出

代码语言:javascript复制
docker run -v $OV**_DATA:/etc/openV** --rm giggio/openV**-arm oV**_getclient CLIENTNAME > CLIENTNAME.oV**

如果不出意外,openV**服务端已经搭建起来了

手工安装

手工安装即不借助docker,在裸机上安装openV**服务器。可以参考ubuntu安装openV**的方法,在树莓派上安装openV**(这篇文章中很多都在讲证书的生成,openV**的配置倒是很少)。

所以我们可以考虑使用docker openV**中生成的ca与证书,以及配置文件来启动本地的openV** server,可以省很多力气。

使用下面的脚本将docker的配置文件放到本地

代码语言:javascript复制
sudo rm /etc/openV**
sudo ln -s /home/wenfeng/oV**-data /etc/openV**

其实就是做了个软连接,配置文件通用。

系统启动时使用sudo systemctl start openV**@openV**的方法,这个@挺特别,后面跟着自己的配置文件名称(去除后缀)。这意味着我们可以有很多配置文件,通过@setting_name来选择。

如果出错,建议用sudo /usr/sbin/openV** --status /run/openV**/openV**.status 10 --cd /etc/openV** --config /etc/openV**/openV**.conf,观察输出log

增加ipv6支持

因为docker container中没有ipv6地址(应该没有),ipv6 in ipv4 只能在裸机上进行。

转发ipv6包

修改/etc/sysctl.conf文件

代码语言:javascript复制
net.ipv4.ip_forward=1  
    ...
net.ipv6.conf.all.forwarding=1  
net.ipv6.conf.all.proxy_ndp = 1

设置iptables

注意修改为你自己的ip地址

代码语言:javascript复制
iptables -t nat -A POSTROUTING -s 10.11.0.0/16 -j SNAT --to 172.16.8.1

修改openV**配置文件

代码语言:javascript复制
服务器端server.conf中的相关配置:
# Server mode and client subnets
server 10.8.0.0 255.255.255.0  
server-ipv6 aaaa:bbbb:cccc:dddd:80::/112  
topology subnet
# IPv6 routes
push "route-ipv6 aaaa:bbbb:cccc:dddd::/64"  
push "route-ipv6 2000::/3"

修改aaaa:bbbb:cccc:dddd为你的真实网址前缀。

为客户端增加proxy

ipv4包由iptables 进行nat,ipv6包是proxy。

先在客户端查看ipv6地址,然后运行下面命令。

代码语言:javascript复制
sudo /sbin/ip -6 neigh add proxy aaaa:bbbb:cccc:dddd:80::1002  dev eth0

aaaa:bbbb:cccc:dddd:80::1002修改为你自己的ip地址,eth0修改为你自己的网卡。

测试ipv6

客户端ping通openV**服务器网关

代码语言:javascript复制
ping6 aaaa:bbbb:cccc:dddd:80::1

用curl测试ipv6网站

代码语言:javascript复制
curl -g -6 https://www.google.com.hk

自动添加ipv6 proxy

服务器端server.conf配置

代码语言:javascript复制
# Run client-specific script on connection and disconnection
script-security 2  
client-connect "/etc/openV**/up.sh"  
client-disconnect "/etc/openV**/down.sh"

这里的script-security 2很重要,不设置会出现WARNING: External program may not be called unless '--script-security 2' or higher is enabled.

这里的up.shdown.sh可以在这里找到,但是我试了之后缺少环境变量,所以目前仍是手工设置ipv6 proxy,研究中。

排错方法

系统一般提示通过journalctl -xe或者systemctl status来排错,但是这两项并不能给出有效信息。

server端无法启动服务,又找不到出错信息

启动服务时出现错误:

代码语言:javascript复制
pi@raspberrypi:~ $ sudo service openV**@server start
Job for openV**@server.service failed because the control process exited with error code.
See "systemctl status openV**@server.service" and "journalctl -xe" for details.

journalctl -xe返回的结果

代码语言:javascript复制
<pre>- The unit openV**@server.service has entered the &apos;failed&apos; state with result &apos;exit-code&apos;.
Jul 26 17:27:15 raspberrypi systemd[1]: <font color="#EF2929"><b>Failed to start OpenV** connection to server.</b></font>
-- Subject: A start job for unit openV**@server.service has failed
</pre>

systemctl status openV**@server.service返回的结果,都没有有效的错误信息,只是告诉你出错了。

代码语言:javascript复制
● openV**@server.service - OpenV** connection to server
   Loaded: loaded (/lib/systemd/system/openV**@.service; disabled; vendor preset: enabled)
   Active: activating (auto-restart) (Result: exit-code) since Fri 2019-07-26 17:28:21 CST; 509ms ago
     Docs: man:openV**(8)
           https://community.openV**.net/openV**/wiki/OpenV**24ManPage
           https://community.openV**.net/openV**/wiki/HOWTO
  Process: 13082 ExecStart=/usr/sbin/openV** --daemon oV**-server --status /run/openV**/server.status 10 --cd /etc/openv
 Main PID: 13082 (code=exited, status=1/FAILURE)

所以我想可以将后台程序变成前台方式,来查看log排错。

将下面命令中的--config换为自己的配置文件即可

代码语言:javascript复制
sudo /usr/sbin/openV** --status /run/openV**/openV**.status 10 --cd /etc/openV** --config /etc/openV**/openV**.conf

错误1:no such openssl.h

发现在./build-ca时报错

代码语言:javascript复制
no such openssl.cnf

查看脚本发现,easy-rsa自己带了三个不同版本的openssl.cnf,唯独没有系统中的1.1.0版本的,无奈打算将树莓派的openssl降级到1.0.0

使用apt-cache madison openssl发现没有低版本的,只能自己手动编译。

树莓派编译openssl, 源码下载地址下载地址

错误2:客户端无法上网

现象:

客户端正常连接服务端,并且两者互相可以ping通,客户端甚至可以请求服务端自己的http服务数据,但就是无法请求其他数据,例如www.baidu.com

测试1: 使用下面的命令请求数据:

代码语言:javascript复制
curl www.baidu.com --interface tun0

会在很长时间后显示time out

测试2: 使用下面的命令ping外网主机

代码语言:javascript复制
ping 220.181.38.149 -I tun0

没有响应,100% loss

用下面的命令对tun0抓包(客户端运行)

代码语言:javascript复制
sudo tcpdump -v  -i tun0

抓包结果如下:

代码语言:javascript复制
22:28:14.638190 IP (tos 0x0, ttl 64, id 35007, offset 0, flags [DF], proto ICMP (1), length 84)
    10.8.0.6 > 220.181.38.149: ICMP echo request, id 18716, seq 1, length 64
22:28:14.645933 IP (tos 0x0, ttl 52, id 35007, offset 0, flags [DF], proto ICMP (1), length 84)
    220.181.38.149 > 10.8.0.6: ICMP echo reply, id 18716, seq 1, length 64
22:28:15.643038 IP (tos 0x0, ttl 64, id 35227, offset 0, flags [DF], proto ICMP (1), length 84)
    10.8.0.6 > 220.181.38.149: ICMP echo request, id 18716, seq 2, length 64
22:28:15.650823 IP (tos 0x0, ttl 52, id 35227, offset 0, flags [DF], proto ICMP (1), length 84)
    220.181.38.149 > 10.8.0.6: ICMP echo reply, id 18716, seq 2, length 64
22:28:16.667028 IP (tos 0x0, ttl 64, id 35436, offset 0, flags [DF], proto ICMP (1), length 84)
    10.8.0.6 > 220.181.38.149: ICMP echo request, id 18716, seq 3, length 64
22:28:16.677797 IP (tos 0x0, ttl 52, id 35436, offset 0, flags [DF], proto ICMP (1), length 84)
    220.181.38.149 > 10.8.0.6: ICMP echo reply, id 18716, seq 3, length 64
22:28:17.691232 IP (tos 0x0, ttl 64, id 35689, offset 0, flags [DF], proto ICMP (1), length 84)
    10.8.0.6 > 220.181.38.149: ICMP echo request, id 18716, seq 4, length 64
22:28:17.701566 IP (tos 0x0, ttl 52, id 35689, offset 0, flags [DF], proto ICMP (1), length 84)
    220.181.38.149 > 10.8.0.6: ICMP echo reply, id 18716, seq 4, length 64
22:28:18.715232 IP (tos 0x0, ttl 64, id 35725, offset 0, flags [DF], proto ICMP (1), length 84)
    10.8.0.6 > 220.181.38.149: ICMP echo request, id 18716, seq 5, length 64
22:28:18.723667 IP (tos 0x0, ttl 52, id 35725, offset 0, flags [DF], proto ICMP (1), length 84)
    220.181.38.149 > 10.8.0.6: ICMP echo reply, id 18716, seq 5, length 64
22:28:19.716722 IP (tos 0x0, ttl 64, id 35833, offset 0, flags [DF], proto ICMP (1), length 84)
    10.8.0.6 > 220.181.38.149: ICMP echo request, id 18716, seq 6, length 64
22:28:19.731483 IP (tos 0x0, ttl 52, id 35833, offset 0, flags [DF], proto ICMP (1), length 84)
    220.181.38.149 > 10.8.0.6: ICMP echo reply, id 18716, seq 6, length 64

可知对方主机正常响应,openV**服务器正常,但是客户端主机自己不正常,无法将网络层的数据反馈到应用层。怀疑是iptables有误,全部清空后错误照常。

使用命令ip route show查看网关

修改前的网关

代码语言:javascript复制
default via 10.135.0.1 dev wlp4s0b1  proto static  metric 600
10.8.0.1 via 10.8.0.5 dev tun0
10.8.0.5 dev tun0  proto kernel  scope link  src 10.8.0.6
10.134.118.131 via 10.135.0.1 dev wlp4s0b1  src 10.135.80.126
10.135.0.0/16 dev wlp4s0b1  proto kernel  scope link  src 10.135.80.126  metric 600
169.254.0.0/16 dev wlp4s0b1  scope link  metric 1000
192.168.19.0/24 dev enp3s0  proto kernel  scope link  src 192.168.19.1  metric 100
192.168.194.0/24 dev ztyourshd4  scope link
192.168.194.0/24 dev ztyourshd4  proto kernel  scope link  src 192.168.194.5

查看tun0配置 ifconfig

代码语言:javascript复制
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255
          inet6 addr: fe80::15d6:6be6:afbd:cb5/64 Scope:Link
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:625 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3293 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:114339 (114.3 KB)  TX bytes:445127 (445.1 KB)

新增网关

代码语言:javascript复制
sudo route add default gw 10.8.0.5

这里不能用10.8.0.1做网关,如果添加该地址为网关,会有如下错误:

代码语言:javascript复制
SIOCADDRT: Network is unreachable

(可选)如果域名服务不正常,需要手动更改

修改这个文件即改即用

代码语言:javascript复制
vim /etc/resolv.conf
cat /etc/resolv.conf

修改后

代码语言:javascript复制
nameserver 8.8.8.8

参考https://blog.csdn.net/u012732259/article/details/76502231

设置好默认网关后,ping正常,网络访问正常。

参考

  • 配置一个提供 IPv6 tunnel over IPv4的OpenV**服务器
  • docker hub openV**
  • ubuntu手工安装openV**

0 人点赞