ubuntu搭建wireguard

ubuntu搭建wireguard

简介

wireguard是一款VPN软件, 可以用来异地组网
wireguard搭建非常简单,但它的缺点是客户端与客户端之间不能直连,只能通过服务器来中转

1. 安装


apt install wireguard  # 安装wireguard
apt install openresolv  # 安装相关的依赖包

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf  # 开启linux内核转发功能
# echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf  # 开启ipv6转发,可选
sysctl -p  # 使配置生效

2. 配置服务端

# 进入配置目录
    cd /etc/wireguard/  # 如果不存在这个目录,则先创建这个目录, 默认情况下wireguard会读取这个目录下的配置文件

# 生成公钥和私钥
    umask 077  # 设置权限
    wg genkey > privatekey  # 生成私钥key
    wg pubkey < privatekey > publickey  # 从私钥导出公钥

    # wg genkey | tee privatekey | wg pubkey > publickey  # 或者直接一次性生成公钥和私钥

# 服务器配置
    vim wg0.conf  # 创建配置文件 wg0.conf, 并写入以下内容
        [Interface]
        Address = 10.100.1.1/24  # 在VPN中本机ip
        DNS = 8.8.8.8  # NDS地址
        # SaveConfig = true  # 自动保存配置,不建议开启,因为有时候当连接出现问题时会自动删除一些配置项

        # 启动和停止服务时在路由表里设置的转发规则,其中eth0是网卡名
        # 网卡名可以通过 ip route list default 来查看, dev后面的字符串就是网卡名
        PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
        PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

        ListenPort = 8502  # 服务器端口号
        PrivateKey = 0I3pQ1p13xknL5p9eMxVAEh9g79/PkHRWqJV+IHbHmE=  # 服务器(本机)生成的 privatekey

        [Peer]
        PublicKey =yKYOQGmP/nNKi2z50btY2hKo2lNMFbCqCqvT5ruhByY=    #对端(客户端)的 Publickey
        AllowedIPs = 10.100.1.2/32     # 对端虚拟IP地址
        PersistentKeepalive = 120        # 心跳,每隔多少秒自动连接一次服务器,一般不需要开启

        # 如果需要多台设备连接到服务器,则继续增加peer即可
        [Peer]
        # linux客户端
        PublicKey = acvAcZQkKJdrdCKy0ghsdQoYKf9Aoh9d9eF59CSnJSU=  # 客户端公钥
        AllowedIPs = 10.100.1.3/32  # 客户端ip
        PersistentKeepalive = 120

3. 启动服务端

# linxu下相关命令
wg-quick up wg0  # 启动
wg-quick down wg0  # 停止
wg  # 查看wg的运行状态
systemctl enable wg-quick@wg0  # 设置开机启动

4. 客户端配置

客户端下载
    官网下载地址 https://www.wireguard.com/install/

win系统
    win系统在新建隧道的时候会自动生成publickey和privatekey
    假设我这里自动生成的privatekey和publickey是
        publickey: yKYOQGmP/nNKi2z50btY2hKo2lNMFbCqCqvT5ruhByY=
        privatekey: +GCWhaO6w50VmvscAGCQZXQf7n8WK4Kit/pt8AsKaVw=
        

    则配置文件文件为:
    
        [Interface]
        PrivateKey = +GCWhaO6w50VmvscAGCQZXQf7n8WK4Kit/pt8AsKaVw=  # win系统自动生成
        Address = 10.100.1.2/32  # 在VPN中的ip地址
        DNS = 8.8.8.8  # DNS地址, 必须要填,否则上不了网
    
        [Peer]
        PublicKey = hRtkgLuxK8coZbimv3TfjDgoXKdPrkje9D+h3V16gWQ=  # 服务端publickey
        AllowedIPs = 0.0.0.0/0  # 要进行流量转发的网段, 0.0.0.0/0表示所有网段
        Endpoint = 157.255.219.143:8502  # 服务器的公网ip和端口
        #PersistentKeepalive = 120  # 心跳,每个多少秒自动连接一次服务器

linux系统
    首先也要安装这两个包
        apt install wireguard  # 安装包
        apt install openresolv  # 安装相关的依赖包

    linux系统客户端和win系统的配置差不多, 只是多了一步生成公钥publickey和私钥privatekey
        wg genkey > privatekey  # 生成私钥key
        wg pubkey < privatekey > publickey  # 从私钥导出公钥

    假设我这里生成的 公钥publickey 和 私钥privatekey 是
        publickey: acvAcZQkKJdrdCKy0ghsdQoYKf9Aoh9d9eF59CSnJSU=
        privatekey: eOwccK1QtZvxFa17TGIQx22PbUBDWcSlBdi+TqtWbVQ=


    则我这里的配置应该为
    vim wg0.conf
    
        [Interface]
        PrivateKey = eOwccK1QtZvxFa17TGIQx22PbUBDWcSlBdi+TqtWbVQ=  # win系统自动生成
        Address = 10.100.1.3/32
        DNS = 8.8.8.8  # DNS地址, 必须要填,否则上不了网
    
        [Peer]
        PublicKey = hRtkgLuxK8coZbimv3TfjDgoXKdPrkje9D+h3V16gWQ=  # 服务端publickey
        AllowedIPs = 0.0.0.0/0  # 要进行流量转发的网断, 0.0.0.0/0表示所有网断
        Endpoint = 157.255.219.143:8502  # 服务器的公网ip和端口
        #PersistentKeepalive = 120  # 心跳,每个多少秒自动连接一次服务器

5. 排除部分网段不走服务器(按需设置)

wg目前默认没有排除某个网段的设置, 不过我们可以通过代码来计算出排除某些网段后的网段

# python代码

    from ipaddress import ip_network

    start = '0.0.0.0/0'
    # 需要排除的ip或者ip段, 这些网段或ip的流量不走服务器
    exclude = ['10.0.0.0/8', '172.16.0.0/32']

    result = [ip_network(start)]
    for x in exclude:
        n = ip_network(x)
        new = []
        for y in result:
            if y.overlaps(n):
                new.extend(y.address_exclude(n))
            else:
                new.append(y)
        result = new

    print(','.join(str(x) for x in sorted(result)))

之后在客户端的配置里修改 AllowedIPs的值即可
    [Interface]
    PrivateKey = +GCWhaO6w50VmvscAGCQZXQf7n8WK4Kit/pt8AsKaVw=
    Address = 10.100.1.2/32
    DNS = 8.8.8.8

    [Peer]
    PublicKey = hRtkgLuxK8coZbimv3TfjDgoXKdPrkje9D+h3V16gWQ=
    # 要进行流量转发的网断, 把这个值修改为计算出来的值即可
    AllowedIPs = 0.0.0.0/5,8.0.0.0/7,11.0.0.0/8,12.0.0.0/6,...  
    Endpoint = 157.255.219.143:8502  # 服务器的公网ip和端口
    #PersistentKeepalive = 120  # 心跳,每个多少秒自动连接一次服务器

使用

搭建好后, 各个节点之间可以通过虚拟ip像访问局域网里的机器一样访问彼此了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值