利用WireGuard建立IPv6隧道

2020-10-16 09:41:11 浏览数 (1)

WireGuard本身就是一个可以组网的东西,之前我自己还写了个一键安装脚本来着,后来发现这货还支持IPv6,正好我本地没有IPv6,就想着看能不能用这个搞个隧道让本机也能用上IPv6。

能用是能用,但也有问题,全部搞完才发现TunSafe这玩意强制你必须配置一个IPv4才能正常连接,这样一来的话IPv6隧道的意义就不大了。。我是想本地的IPv4还是走本地网络,只有IPv6才走WireGuard,但是现在貌似不能这样。。。

蛋疼的一批,还是把过程记录一下吧。。其实和普通的配置没多大区别。。原理无非就是先通过WireGuard建一个虚拟局域网,然后在这个局域网内WireGuard会分配给我们一个内网的v4和v6。连接上之后再把流量转发到外网。

Debian9安装:

代码语言:javascript复制
echo "deb http://deb.debian.org/debian/ unstable main"   /etc/apt/sources.list.d/unstable.list
apt -y update
apt -y install linux-headers-$(uname -r)
apt -y install openresolv
apt -y install resolvconf
apt -y install wireguard

CentOS7:

代码语言:javascript复制
curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
yum -y install epel-release
yum -y install kernel-headers-$(uname -r) kernel-devel-$(uname -r)
yum -y install wireguard-dkms wireguard-tools

开IPv4和v6的转发:

代码语言:javascript复制
echo "net.ipv4.ip_forward = 1"    /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1"    /etc/sysctl.conf
sysctl -p

CentOS7要自己手动新建一个配置文件存放目录,Debian不需要:

代码语言:javascript复制
mkdir -p /etc/wireguard

然后生成服务端的私钥/公钥

代码语言:javascript复制
wg genkey | tee /etc/wireguard/privatekey | wg pubkey   /etc/wireguard/publickey

接着是客户端的私钥/公钥:

代码语言:javascript复制
wg genkey | tee /etc/wireguard/clientprivatekey | wg pubkey   /etc/wireguard/clientpublickey

然后新建服务端的配置文件:

代码语言:javascript复制
nano /etc/wireguard/wg0.conf

Debian9的配置如下:

代码语言:javascript复制
[Interface]
PrivateKey = 服务端私钥
Address = 192.168.0.1/24, 2001:20:2333::1/28
ListenPort = 23333
DNS = 8.8.8.8, 2001:4860:4860::8888
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o ens18 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens18 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o ens18 -j MASQUERADE
SaveConfig = true

[Peer]
PublicKey = 客户端公钥
AllowedIPs = 192.168.0.0/24, 2001:20:2333::1/28

因为WireGuard在配置文件内支持这种PostUp/PostDown的语法,所以我们可以直接把iptables的转发规则写在配置文件内,这样每次开机只要WireGuard运行都会自动加载iptables配置。

如果是CentOS7,配置文件就这样写:

代码语言:javascript复制
[Interface]
PrivateKey = 服务端私钥
Address = 192.168.0.1/24, 2001:20:2333::1/28
ListenPort = 23333
DNS = 8.8.8.8, 2001:4860:4860::8888

[Peer]
PublicKey = 客户端公钥
AllowedIPs = 192.168.0.0/24, 2001:20:2333::1/28

然后我们自己用firewall做转发:

代码语言:javascript复制
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i wg0 -o eth0 -j ACCEPT
firewall-cmd --permanent --add-rich-rule='rule family=ipv6 source address=2001:20:2333::1/28 masquerade'
firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD 0 -i wg0 -o eth0 -j ACCEPT
firewall-cmd --permanent --add-port=23333/udp
firewall-cmd --reload

属实无论是iptables还是firewalld这些防火墙真的难用的一批,我一般情况下,不是必须用到它的功能,我都是直接关闭的,或者自己装一个ufw。

还有我他妈前段时间在Proxmox上配防火墙把全端口封了(我把我自己强了),还好那机器有各种救援系统,登进去搞了几个小时算是恢复了,不然要出事。。。算了不扯这些没用的了。。

现在启动WireGuard:

代码语言:javascript复制
wg-quick up wg0

没问题的话设置开机启动:

代码语言:javascript复制
systemctl enable wg-quick@wg0

接下来就是客户端配置文件了,这个通用:

代码语言:javascript复制
[Interface]
PrivateKey = 客户端私钥
Address = 192.168.0.2/24, 2001:20:2333::666/28
DNS = 8.8.8.8, 2001:4860:4860::8888

[Peer]
PublicKey = 服务端公钥
Endpoint = 服务端公网IP:23333
AllowedIPs = 0.0.0.0/0, ::0/0
PersistentKeepalive = 25

配置到TunSafe之后连接,你本地应该就可以用上服务器内的IPv6了,而且我发现走IPv6的流量没干扰,比如访问Google,用WireGuard走IPv4各种阻断,IPv6就畅通无阻。。。

烦躁的一批,想用个IPv6就这么难!还有那些公共的免费隧道,比如HE的那个,延迟太高了,没什么卵用。

0 人点赞