文章介绍:本篇主要内容如下:

①云上Vultr安装Vyos作为服务器端;

②本地VMware ESXi安装Vyos作为客户端;

③云上Vultr中的Vyos运行GoBGP给本地VMware ESXi中的Vyos下发路由,实现路由分流;

④本地VMware ESXi中的Vyos运行SmartDNS,实现DNS分流,规避DNS污染。

一、上传镜像至Vultr

vultr注册登录这里不做介绍,vultr支持支付宝付款,对国内用户比较友好,但是据说口碑很差,服务器IP大多被封禁,本篇只作为演示,没有引导消费的意思,博主也不经常使用vultr,如果长期使用请谨慎选择。

yydy_2024-05-03_21-04-16

https://github.com/hcuk94/vyos-autobuild/releases/download/1.4.0-epa2/vyos-1.4.0-epa2-amd64.iso

yydy_2024-05-03_21-05-08

yydy_2024-05-03_21-08-32

yydy_2024-05-03_21-08-56

二、创建实例

2.1、点击:Products

yydy_2024-05-03_22-21-48

2.2、Deploy New Instance

yydy_2024-05-03_22-25-16

2.3、关闭备份

yydy_2024-05-03_22-28-56

2.4、取消自定义数据

yydy_2024-05-03_22-31-21

2.5、启动完成:Running

yydy_2024-05-03_22-33-18

2.6、查看服务器

yydy_2024-05-03_22-33-51

2.7、配置vyos

yydy_2024-05-03_22-36-37

2.8、进入vyos

yydy_2024-05-03_22-38-14

2.9、安装vyos

install image

yydy_2024-05-03_22-49-25

2.10、移除ISO

yydy_2024-05-03_22-52-09

yydy_2024-05-03_22-52-33

2.11、连接vyos

yydy_2024-05-03_22-53-20

2.12、进入vyos

yydy_2024-05-03_22-54-15

2.13、查看接口IP

show int

yydy_2024-05-03_22-55-05

2.14、配置接口

yydy_2024-05-03_22-56-49

2.15、配置SSH登录

yydy_2024-05-03_22-58-33

2.16、退出系统

yydy_2024-05-03_22-59-10

三、vyos-pe基础配置

3.1、登录Vyos

yydy_2024-05-03_23-12-09

yydy_2024-05-03_23-12-45

3.2、修改账户密码

configure #进入配置模式
set system login user yydy authentication plaintext-password yydy@vyos #新建账号:yydy,密码:yydy@vyos
commit #应用配置
save #保存配置

3.3、修改hostname

set system host-name vyos-pe
commit
save

3.4、禁用默认账户vyos

先退出vyos账户登录,然后使用刚刚创建的yydy账户登录,才能禁用默认账户。

configure 
set system login user vyos disable #禁用vyos账户登录
commit
save

3.5、vyos-pe安全加固

Vyos官方配置 Firewall 直达

这些配置是针对防火墙全局选项的设置,每个选项的作用如下:

  1. set firewall global-options all-ping 'disable': 允许 ICMP echo-request(ping)到所有地址。
  2. set firewall global-options broadcast-ping 'disable': 禁用 ICMP echo-request 到广播地址的回应。
  3. set firewall global-options ip-src-route 'disable': 禁用 IP 源路由选项。
  4. set firewall global-options ipv6-source-validation 'disable': 禁用 IPv6 源地址验证。
  5. set firewall global-options ipv6-src-route 'disable': 禁用 IPv6 源路由选项。
  6. set firewall global-options log-martians 'enable': 启用记录未知源 IP 或无效 TTL 的数据包。
  7. set firewall global-options receive-redirects 'disable': 禁用接收 ICMP 重定向消息。
  8. set firewall global-options send-redirects 'enable': 启用发送 ICMP 重定向消息。
  9. set firewall global-options source-validation 'disable': 禁用源地址验证。
  10. set firewall global-options syn-cookies 'enable': 启用 SYN cookies 以防止 SYN 洪泛攻击。
  11. set firewall global-options twa-hazards-protection 'disable': 禁用 TWA(TCP Window Adjustment) 危险保护。
  12. set firewall group network-group firewall-whitelist network '10.255.255.2/32': 创建一个网络组,允许只有 10.255.255.2/32 这个 IP 地址的流量通过。
  13. set firewall ipv4 input filter default-action 'accept': 默认情况下,允许所有 IPv4 输入流量通过。
  14. set firewall ipv4 input filter rule 100 action 'accept': 允许特定规则的 IPv4 输入流量通过。
  15. set firewall ipv4 input filter rule 100 source group network-group 'firewall-whitelist': 允许网络组 firewall-whitelist 中定义的地址通过。
  16. set firewall ipv4 input filter rule 200 action 'drop': 将未匹配到其他规则的 IPv4 输入流量丢弃。
  17. set firewall ipv4 input filter rule 200 destination port '22,179,53': 针对特定端口的流量进行处理。
  18. set firewall ipv4 input filter rule 200 protocol 'tcp_udp': 仅针对 TCP 和 UDP 流量进行处理。
  19. set firewall ipv4 input filter rule 300 action 'drop'': 将未匹配到其他规则的 IPv4 输入流量丢弃。
  20. set firewall ipv4 input filter rule 300 protocol 'icmp'': 仅针协议是 ICMP 流量进行处理。
set firewall global-options all-ping  'enable'
set firewall global-options broadcast-ping 'disable'
set firewall global-options ip-src-route 'disable'
set firewall global-options ipv6-source-validation 'disable'
set firewall global-options ipv6-src-route 'disable'
set firewall global-options log-martians 'enable'
set firewall global-options receive-redirects 'disable'
set firewall global-options send-redirects 'enable'
set firewall global-options source-validation 'disable'
set firewall global-options syn-cookies 'enable'
set firewall global-options twa-hazards-protection 'disable'
set firewall group network-group firewall-whitelist network '10.255.255.2/32'
set firewall ipv4 input filter default-action 'accept'
set firewall ipv4 input filter rule 100 action 'accept'
set firewall ipv4 input filter rule 100 source group network-group 'firewall-whitelist'
set firewall ipv4 input filter rule 200 action 'drop'
set firewall ipv4 input filter rule 200 destination port '22,179,53'
set firewall ipv4 input filter rule 200 protocol 'tcp_udp'
set firewall ipv4 input filter rule 300 action 'drop'
set firewall ipv4 input filter rule 300 protocol 'icmp'
commit
save

四、VMware ESXi 安装 Vyos

4.1、安装

参考:【Vyos-开源篇-1】- VMware安装vyos虚拟机

4.2、配置vyos

客户端CE的其他配置请参考上面的教程,下面修改主机名方便稍后区分配置。

configure 
set system host-name vyos-ce #修改主机名
commit
save

五、配置虚拟隧道WireGuard

Vyos官方配置 WireGuard Site to Site VPN 直达

5.1、生成密钥对

generate pki wireguard key-pair

5.1.1、vyos-pe

把生成的Private key和Public key复制到记事本,稍后要用。

yydy@vyos-pe:~$ generate pki wireguard key-pair
Private key: MEUnSrblAhPuXiFBe+JAtPqFQN+PU7s3mq5pYq/3dnQ=
Public key: vPVCN+MqUz5ljTYMY99NvOHQeQlYZoeAPQ9cj+taVSo=

yydy@vyos-pe:~$

5.1.2、vyos-ce

同理,把生成的Private key和Public key复制到记事本,稍后要用。

vyos@vyos-ce:~$ generate pki wireguard key-pair
Private key: EH37HTk2+YD1/YYvwmKhswzuZ4za2VjjM8GjhDw423Q=
Public key: 5RP73V1r+HDYorMyDnbvLXd9Uw0mIdrL2z6J53hRiAA=

vyos@vyos-ce:~$

5.2、创建wg0接口

5.2.1、vyos-pe

配置 WireGuard VPN 接口的详细命令含义如下:

  1. set interfaces wireguard wg0 address '10.255.255.1/30': 这条命令设置了WireGuard接口的本地IP地址和子网掩码。
  2. set interfaces wireguard wg0 description 'to-vyos-ce': 这条命令为WireGuard接口设置了描述,用于标识接口的用途或描述信息。
  3. set interfaces wireguard wg0 peer vyos-ce allowed-ips '0.0.0.0/0': 这条命令设置了允许流量从远程对等点进入的IP地址范围。在这种情况下,允许所有IP地址。
  4. set interfaces wireguard wg0 peer vyos-ce public-key '5RP73V1r+HDYorMyDnbvLXd9Uw0mIdrL2z6J53hRiAA=': 这条命令设置了远程对等点的公钥,用于加密通信。
  5. set interfaces wireguard wg0 port '64430': 这条命令设置了本地WireGuard接口的端口号。
  6. set interfaces wireguard wg0 private-key 'MEUnSrblAhPuXiFBe+JAtPqFQN+PU7s3mq5pYq/3dnQ=': 这条命令设置了本地WireGuard接口的私钥,用于加密通信。
set interfaces wireguard wg0 address '10.255.255.1/30'
set interfaces wireguard wg0 description 'to-vyos-ce'
set interfaces wireguard wg0 peer vyos-ce allowed-ips '0.0.0.0/0'
set interfaces wireguard wg0 peer vyos-ce public-key '5RP73V1r+HDYorMyDnbvLXd9Uw0mIdrL2z6J53hRiAA='
set interfaces wireguard wg0 port '64430'
set interfaces wireguard wg0 private-key 'MEUnSrblAhPuXiFBe+JAtPqFQN+PU7s3mq5pYq/3dnQ='
commit
save

5.2.2、vyos-ce

set interfaces wireguard wg0 address '10.255.255.2/30'
set interfaces wireguard wg0 description 'to-vyos-pe'
set interfaces wireguard wg0 peer vyos-pe address '45.76.198.130'
set interfaces wireguard wg0 peer vyos-pe allowed-ips '0.0.0.0/0'
set interfaces wireguard wg0 peer vyos-pe port '64430'
set interfaces wireguard wg0 peer vyos-pe public-key 'vPVCN+MqUz5ljTYMY99NvOHQeQlYZoeAPQ9cj+taVSo='
set interfaces wireguard wg0 private-key 'EH37HTk2+YD1/YYvwmKhswzuZ4za2VjjM8GjhDw423Q='
commit
save

5.3、连通信测试

因为我们服务器端开了禁ping,所以客户端ce ping不通pe,那我们就用pe ping ce,ping 1000个包,1024个字节,1毫秒1回显,网络质量良好,平均延迟:84ms

sudo ping -i 0.01 -c 1000 -s 1024 10.255.255.2

yydy_2024-05-04_01-08-06

5.4、mtu测试不分片

显示1420可以过,直接在俩端配置wg0接口mtu为1420

sudo ping -M do -s 1400 10.255.255.2

yydy_2024-05-04_01-12-15

5.4.1、配置mtu

set interfaces wireguard wg0 mtu '1420'
commit
save

5.5、配置tcp mss

在俩端同时配置下面的配置

set interfaces wireguard wg0 ip adjust-mss '1300'
commit
save

六、配置完善

6.1、vyos-ce

6.1.1、全局默认路由

最终效果是要PC客户端通过vyos-pe上网,所以如果是全局模式,那么vyos-ce的默认路由需要指向vyos-pe的wg0接口ip10.255.255.1 ,并且,为了保证隧道建立正常,需要指定去pe的公网IP走本地网关,默认路由配置distance 230,为什么是230不是什么2,3,4之类的,请继续往下看。

set protocols static route 45.76.198.130/32 next-hop 10.225.97.1
set protocols static route 0.0.0.0/0 next-hop 10.255.255.1 distance '230'
commit
save

拓展完善默认路由配置缺陷,为了防止wg0隧道断线,影响用户国内上网,所以需要删除上面的默认路由,改成下面的配置方式,wg0默认路由优先级是metric 230,当vyos-ce去ping vyos-pe的wg0接口IP不通时,自动把默认路由切到本地eth0网关。

Vyos官方配置 Failover 直达

下面这些命令配置使用故障转移(failover)策略,用于在主要路由不可用时切换到备用路由,以下是每条命令的详细解释:

  1. set protocols failover route 0.0.0.0/0 next-hop 10.255.255.1 check target '10.255.255.1'

    • 配置了默认路由 0.0.0.0/0 的下一跳地址为 10.255.255.1
    • 使用 ICMP 目标检查功能,以确保下一跳地址 10.255.255.1 的连通性。
  2. set protocols failover route 0.0.0.0/0 next-hop 10.255.255.1 check timeout '5'

    • 设置 ICMP 目标检查的超时时间为 5 秒。
  3. set protocols failover route 0.0.0.0/0 next-hop 10.255.255.1 check type 'icmp'

    • 指定 ICMP 类型的目标检查,用于检查下一跳地址 10.255.255.1 的连通性。
  4. set protocols failover route 0.0.0.0/0 next-hop 10.255.255.1 interface 'wg0'

    • 指定下一跳地址 10.255.255.1 的接口为 wg0,表示该路由通过接口 wg0 发送。
  5. set protocols failover route 0.0.0.0/0 next-hop 10.255.255.1 metric '230'

    • 配置默认路由 0.0.0.0/0 到达目标的优先级(metric)为 230,优先级较低,表示备选路由。
  6. set protocols failover route 0.0.0.0/0 next-hop 10.225.97.1 check target '10.225.97.1'

    • 配置了另一条默认路由 0.0.0.0/0 的下一跳地址为 10.225.97.1
    • 使用 ICMP 目标检查功能,以确保下一跳地址 10.225.97.1 的连通性。
  7. set protocols failover route 0.0.0.0/0 next-hop 10.225.97.1 check timeout '5'

    • 设置 ICMP 目标检查的超时时间为 5 秒。
  8. set protocols failover route 0.0.0.0/0 next-hop 10.225.97.1 check type 'icmp'

    • 指定 ICMP 类型的目标检查,用于检查下一跳地址 10.225.97.1 的连通性。
  9. set protocols failover route 0.0.0.0/0 next-hop 10.225.97.1 interface 'eth0'

    • 指定下一跳地址 10.225.97.1 的接口为 eth0,表示该路由通过接口 eth0 发送。
  10. set protocols failover route 0.0.0.0/0 next-hop 10.225.97.1 metric '240'

    • 配置默认路由 0.0.0.0/0 到达目标的优先级(metric)为 240,优先级较高,表示首选路由。

这些命令的目的是为默认路由 0.0.0.0/0 配置两个备选路由,并设置检查目标和超时时间以确保备选路由的连通性。通过配置不同的优先级(metric),可以定义主要路由和备用路由的优先级。

set protocols failover route 0.0.0.0/0 next-hop 10.255.255.1 check target '10.255.255.1'
set protocols failover route 0.0.0.0/0 next-hop 10.255.255.1 check timeout '5'
set protocols failover route 0.0.0.0/0 next-hop 10.255.255.1 check type 'icmp'
set protocols failover route 0.0.0.0/0 next-hop 10.255.255.1 interface 'wg0'
set protocols failover route 0.0.0.0/0 next-hop 10.255.255.1 metric '230'
set protocols failover route 0.0.0.0/0 next-hop 10.225.97.1 check target '10.225.97.1'
set protocols failover route 0.0.0.0/0 next-hop 10.225.97.1 check timeout '5'
set protocols failover route 0.0.0.0/0 next-hop 10.225.97.1 check type 'icmp'
set protocols failover route 0.0.0.0/0 next-hop 10.225.97.1 interface 'eth0'
set protocols failover route 0.0.0.0/0 next-hop 10.225.97.1 metric '240'

6.1.2、SNAT配置

从wg0接口出去的流量,全部nat成出接口地址,这里则是:10.255.255.2。

set nat source rule 100 outbound-interface name 'wg0'
set nat source rule 100 translation address 'masquerade'
commit
save

6.1.3、DNS配置

需要vyos-ce能正常解析域名,便于后面下载smartdns程序,但是等后面下载完smartdns程序安装包之后,还需要删除dns配置,否则53端口被vyos占用,将导致smartdns启动失败。

set system name-server 223.5.5.5
set system name-server 223.6.6.6
commit
save

6.2、vyos-pe

6.2.1、SNAT配置

需要把wg0接口进来的流量,全部nat成vyos-pe的eth0出接口地址上网。

set nat source rule 100 outbound-interface name 'eth0'
set nat source rule 100 translation address 'masquerade'
commit
save

6.2.2、DNS配置

需要vyos-pe能正常解析域名,便于后面下载gobgp程序。

set system name-server 8.8.8.8
set system name-server 8.8.4.4
commit
save

七、全局模式测试

7.1、PC测试

把电脑网关改成vyos-ce的eth0口ip,dns改成8.8.8.8,因为还未配置smartdns,所以为了防止dns污染,先用谷歌dns解析域名测试。。

ip.skk.moe
www.yalala.com
whoer.net

yydy_2024-05-04_01-29-57

yydy_2024-05-04_01-31-35

yydy_2024-05-04_01-31-53

7.2、路径和解析

到这里如果不需要智能分流就可以结束了。

tracert -d -w 1 8.8.8.8
nslookup www.youtube.com

yydy_2024-05-04_01-32-45

八、路由分流配置

gobgp具体搭建运行需要看gobgp的官方github说明,这里是用gobgp+geoip实现通过AS号归属地+区域缩写(CN,HK,US)获取动态的ip路由表。

yangpin97/BGPServer

8.1、下载GoBGP程序

以下操作都是在Vultr云上的vyos-pe中执行。

sudo -i
mkdir bgp
cd bgp
wget https://github.com/yangpin97/BGPServer/releases/download/0.5/bgp
wget https://github.com/yangpin97/BGPServer/releases/download/0.5/ChinaBGPZip.gob
wget https://github.com/yangpin97/BGPServer/releases/download/0.5/config.ini
wget https://github.com/yangpin97/BGPServer/releases/download/0.5/map.json.gz

8.2、赋予权限

sudo chmod +x bgp

8.3、修改config.ini

sudo nano config.ini
[server]
RouterId = 10.255.255.1
ASN = 65000
NextHop = 10.225.97.1
UpdateSource = 10.255.255.1

[peer]
IP = 10.255.255.2
ASN = 65000
  1. [server] 部分说明:

    • RouterId = 10.255.255.1:指定本地路由器的 BGP 路由器ID。路由器ID 用于标识路由器的唯一性,是 BGP 运行所必需的。
    • ASN = 65000:指定本地路由器的自治系统号(ASN)。ASN 是用于识别网络中的唯一自治系统的数字标识符。
    • NextHop = 10.225.97.1:指定在生成更新消息时使用的下一跳地址。在 BGP 中,Next Hop 属性指定了到达目的网络的下一跳路由器的 IP 地址,因为我们下面学习的是国内BGP路由信息,所以这里写vyos-ce的eth0接口网关。
    • UpdateSource = 10.255.255.1:指定用于向对等方发送 BGP 更新消息的源 IP 地址。这个参数用于多点连接的情况,确保更新消息从正确的接口发送出去。
  2. [peer] 部分说明:

    • IP = 10.255.255.2:指定对等方的 IP 地址。这个对等方是本地路由器将要建立 BGP 邻居关系的对等方。
    • ASN = 65000:指定对等方的自治系统号(ASN)。这个对等方的 ASN 应该与对等方配置的 ASN 相匹配,以确保 BGP 邻居关系的正确建立。

8.4、运行程序

以下命令是学习国内路由表,如果要学习非国内路由表,请修改相应配置。

sudo screen -S bgp_session -d -m ./bgp -c ./config.ini -l CN

8.5、vyos-ce配置bgp邻居

set protocols bgp parameters router-id 10.255.255.2
set protocols bgp neighbor 10.255.255.1 remote-as 65000
set protocols bgp neighbor 10.255.255.1 update-source 10.255.255.2
set protocols bgp neighbor 10.255.255.1 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp system-as 65000
set protocols bgp timers holdtime '60'
set protocols bgp timers keepalive '20'
commit
save

8.6、查看邻居建立状态

8.6.1、vyos-pe

sudo screen -r

yydy_2024-05-04_23-02-26

8.6..2、vyos-ce

show bgp summary

yydy_2024-05-04_23-02-52

8.7、路由查询

查询国内阿里云DNS 223.5.5.5,学习ebgp路由走eth0网关到国内。
这里可以看出通过ebgp学习的路由distance是200,所以上面的默认路由需要设置distance为230,根据路由匹配原则,优先匹配distance小的。

show ip route 223.5.5.5

yydy_2024-05-04_23-07-12

查询国外谷歌DNS 8.8.8.8,默认路由走wg0隧道。

show ip route 8.8.8.8

yydy_2024-05-04_23-13-15

8.8、路由分流测试

跟第七步操作步骤一样,需要修改电脑网关。

8.8.1、tracert阿里云dns

tracert -d -w 1 223.5.5.5

yydy_2024-05-04_23-30-11

8.8.2、tracert谷歌dns

tracert -d -w 1 8.8.8.8

yydy_2024-05-04_23-28-14

九、SmartDNS配置

以下配置是在vyos-ce中执行。

9.1、下载smartdns

如果国内网络连接github下载异常,请使用博主提供的下载连接,博主提供的是当前时间2024年5月4日最新版本,如果超过这个时间很久,版本可能有所更新。

sudo -i
curl -k -O https://github.com/pymumu/smartdns/releases/download/Release45/smartdns.1.2024.02.08-0828.x86_64-debian-all.deb
curl -k -O  https://alist.yydy.link:2023/d/🧩Share---共享文件/smartdns/smartdns.1.2024.02.08-0828.x86_64-debian-all.deb

9.2、安装smartdns

dpkg -i smartdns.1.2024.02.08-0828.x86_64-debian-all.deb

9.3、删除vyos的dns

9.3.1、退出root

exit

9.3.2、进入配置模式

conf
delete system name-server
commit
save

9.3.3、进入root

exit
sudo -i

9.4、修改配置文件

nano /etc/smartdns/smartdns.conf
# 开启ipv6-ipv4-dns服务
bind [::]:53 #默认开启

# 国内上游服务器(上海电信DNS)
server 202.96.209.133
server 202.96.209.5
server 180.168.255.118
server 116.228.111.118

# 国外上游服务器
server 8.8.8.8
server 8.8.4.4
server 208.67.222.222
server 208.67.220.220

# 缓存配置
cache-size 32768
cache-persist yes
prefetch-domain yes
cache-file /etc/smartdns/dnscache

# 测速模式
speed-check-mode ping,tcp:80,tcp:443

# 其他
force-qtype-SOA 65 #默认开启
log-level info #默认开启

9.5、启动smartdns

sudo systemctl start smartdns
sudo systemctl enable smartdns

9.6、dns分流测试

跟第七步操作步骤一样,需要修改电脑网关,其次dns不能在使用8.8.8.8,要使用vyos-ce的eth0口IP地址。

yydy_2024-05-05_00-25-06

十、带宽测试

10.1、iperf打流

家里带宽是100兆下行,60兆上行,基本可以跑满。

10.1.1、ce打流pe模拟上传

yydy_2024-05-05_00-53-56

10.1.2、pe打流ce模拟下载

yydy_2024-05-05_00-55-29

10.2、speedtest测速

yydy_2024-05-05_01-03-52

其他

为了方便gobgp程序可以开机自启,我们可以添加为系统服务,添加为系统服务前,需要先使用:sudo screen -r进入刚刚运行的服务,然后Ctrl+C结束会话,然后在进行下面的操作。

创建gobgp服务。

sudo nano /etc/systemd/system/bgp.service

填写下面的配置文件。

[Unit]
Description=BGP Service
After=network.target

[Service]
Type=simple
ExecStart=/root/bgp/bgp -c /root/bgp/config.ini -l CN
Restart=always

[Install]
WantedBy=multi-user.target

重新加载 Systemd 并启用服务。

sudo systemctl daemon-reload
sudo systemctl enable bgp.service

启动服务。

sudo systemctl start bgp.service

查看服务状态。

sudo systemctl status bgp.service

停止服务。

sudo systemctl stop bgp.service

查看服务日志。

sudo journalctl -u bgp.service

yydy_2024-05-05_01-24-52