最近在折腾 Wireguard 组网(以下简称 wg),期间遇到了大大小小的坑,写个小笔记记录一下。

首先使用 wg 组网要有一台具有公网IP的机器,并且带宽不要太低,不然用来做流量中转网速比较慢,还不如不组网使用,话不多说直接开始。

机器介绍

本人共有四台服务器,分别为一台 NAS(Ubuntu 20.04),一台辽宁鞍山(Centos7.6),两台阿里云机器(Centos7.8),在wg中没有客户端与服务端的概念,每台机器都是节点,谁被连接就可以理解为客户端。这里我们以这台辽宁机器作为中转机,即服务端,剩下三台机器为客户端。

虽然三台机器都有公网 IP,但是为了安全考虑和自身应用,还是需要使用内网访问部分服务,最终要实现的目标是:如NAS在 8888 端口部署了一个私人服务,并使用 nginx 反代域名到 8443 端口并使用 https,但又不希望在除内网IP可以访问的前提下,无法再通过 8443 端口访问服务,所以进行了如下配置。

WG 安装与配置

这里推荐Github上面一个比较好用的一键安装脚本,傻瓜式配置,只需要运行命令行即可。

WireGuard一键安装脚本

这里只对部分参数进行说明,在Centos7.6运行安装后可能会出现如下报错,这是内核问题,升级即可

Unable to access interface: Protocol not supported

内核升级

# 查看当前内核版本
uname --kernel-release

# 安装必要工具,卸载旧的内核源码包
yum -y install epel-release curl
sed -i "0,/enabled=0/s//enabled=1/" /etc/yum.repos.d/epel.repo
yum remove -y kernel-devel

# 导入公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 升级安装 elrepo
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
# 安装新版本工具包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum -y --enablerepo=elrepo-kernel install kernel-ml
# 设置默认启动
sed -i "s/GRUB_DEFAULT=saved/GRUB_DEFAULT=0/" /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-devel-5.15.10-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-ml-devel-5.15.10-1.el7.elrepo.x86_64.rpm
yum -y --enablerepo=elrepo-kernel install kernel-ml-devel

# 重启
reboot

# 查看升级后的内核版本
uname --kernel-release

部分参数说明

image

Address:即本机在内网中的IP地址

DNS地址

AllowedIPs:注意后面,如若没有ipv6,请将后面的删除,并不要开放全路由,不然可能会没网哦!

# 常用wg命令
1.wg-quick down/up wg0 # 关闭/开启一个 wg0
2.wg show              # 查看 wg 信息

如若只需要内网段的主机通过 wg 访问,可以将其设置为10.7.0.0/24

iptables 配置

在 Centos7 机器上安装使用 iptables 时遇到了一些问题,Centos7 已经不在将 iptables 作为默认防火墙,而是 Filewalld ,这里有一篇文章讲解如何安装 iptables 并进行简单的使用,这里就不进行赘述。如何在CentOS7系统中使用iptables

我将我使用的命令整理如下:

  1. 默认 22 端口不对外暴露,只能通过内网连接。
  2. 只开放 80 和 443 端口对外暴露网络服务。
  3. 给内网 IP 添加放行白名单,允许通过所有端口进行 TCP连接。
#检查是否安装了iptables
whereis iptables
#安装iptables
apt-get install iptables
#查看iptables现有规则
iptables -L -n
#先允许所有,不然有可能会杯具
iptables -P INPUT ACCEPT
#清空所有默认规则
iptables -F
#清空所有自定义规则
iptables -X
#所有计数器归0
iptables -Z
#允许来自于lo接口的数据包(本地访问)
iptables -A INPUT -i lo -j ACCEPT
#开放22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#开放21端口(FTP)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#开放80端口(HTTP)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#开放443端口(HTTPS)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#允许ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#允许接受本机请求之后的返回数据 RELATED,是为FTP设置的
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#其他入站一律丢弃
iptables -P INPUT DROP
#所有出站一律绿灯
iptables -P OUTPUT ACCEPT
#所有转发一律丢弃
#iptables -P FORWARD DROP

#如果要添加内网ip信任(接受其所有TCP请求)
iptables -A INPUT -p tcp -s 10.7.0.1 -j ACCEPT
#过滤所有非以上规则的请求
iptables -P INPUT DROP
#要封停一个IP,使用下面这条命令:
iptables -I INPUT -s ***.***.***.*** -j DROP
#要解封一个IP,使用下面这条命令:
iptables -D INPUT -s ***.***.***.*** -j DROP

#保存上述规则
service iptables save

最终效果如下:

image

image

image

最后修改:2023 年 12 月 04 日
如果觉得我的文章对你有用,请随意赞赏