青云主机添加ipv6支持

先前在青云下挂了台主机,提供openvpn给自己不同地方的设备互联。现打算加入ipv6,一来有个ipv6地址感觉很厉害的样子,这样在连接需要ipv6地址资源的时候就可以直接vpn连上并访问了。

通过TunnelBroker接入ipv6

网上已经有很多教程了就不详细记录了,主要是需要设置一下防火墙。

控制台防火墙配置

在控制台设置对应主机的防火墙,放行6in4协议。即图中的ipv6。源IP设为6in4隧道end point的ip地址。

firewall

另外,在创建隧道时,需要开放ICMP的echo request。

主机防火墙配置

ip6tables.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# Generated by ip6tables-save v1.6.0
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:ICMPv6 - [0:0]
:TCP - [0:0]
:UDP - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p ipv6-icmp -j ICMPv6
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p udp -j REJECT --reject-with icmp6-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp6-port-unreachable
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 用以vpn访问外网
#-A FORWARD -i tun0 -j ACCEPT
# ICMPv6
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 128 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 1 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 2 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 3 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 4 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 133 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 134 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 135 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 136 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 137 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 141 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 142 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 148 -j ACCEPT
-A ICMPv6 -p ipv6-icmp -m icmp6 --icmpv6-type 149 -j ACCEPT
-A ICMPv6 -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 130 -j ACCEPT
-A ICMPv6 -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 131 -j ACCEPT
-A ICMPv6 -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 132 -j ACCEPT
-A ICMPv6 -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 143 -j ACCEPT
-A ICMPv6 -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 151 -j ACCEPT
-A ICMPv6 -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 152 -j ACCEPT
-A ICMPv6 -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 153 -j ACCEPT
-A ICMPv6 -j RETURN
-A TCP -i tun0 -j ACCEPT
-A UDP -i tun0 -j ACCEPT
COMMIT
# Completed
# Generated by ip6tables-save v1.6.0
*nat
:PREROUTING ACCEPT [320:43404]
:INPUT ACCEPT [117:9932]
:OUTPUT ACCEPT [7:602]
:POSTROUTING ACCEPT [7:602]
COMMIT
# Completed

INPUT链主要是参照ArchWiki中的Simple stateful firewall - ArchWiki修改而来的。

其中有关ICMPv6的防火墙配置则是根据CentOS / RHEL IPv6 ip6tables 防火墙配置简介 | 水景一页添加的。

iptables.conf

1
-A INPUT -p ipv6 -s <end-point-ip>/32 -j ACCEPT

为了安全起见,不公布,只提一下,如果要允许vpn中的设备允许外网设备主动发起请求,除了要配置ip6tables以外还要加上iptables里的这一句。

如果只需要vpn内设备能访问外网的话,只需要有下面这句即可。

1
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

设置主机允许路由转发

编辑/etc/sysctl.conf,找到net.ipv6.conf.all.forwarding=1,去掉注释。然后再执行

1
sysctl -p

配置OpenVPN支持双栈

本人用的是tun模式,只需在原来的配置文件上加入以下这行即可。可以与server 10.0.0.0 255.255.255.0配置同时存在(具体IP因情况而异)

1
server-ipv6 2001:db8:0:123::/64

上述中的ipv6地址抄自OpenVPN的wiki,请使用TunnelBroker中的提供的地址段。

tunnelbroker

注:如果以前OpenVPN中使用了client-config-dir,并且给某个Client设置了ifconfig-push选项,那么Server将不会为其分配ipv6地址,需手动添加ifconfig-ipv6-push选项设定。

参考资料

Simple stateful firewall - ArchWiki

CentOS / RHEL IPv6 ip6tables 防火墙配置简介 | 水景一页

IPv6 – OpenVPN Community