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的那个,延迟太高了,没什么卵用。