Linux 计算机与 NAT 提供商后面的 Mikrotik 之间的 IPIP IPsec VPN 隧道

Linux的: Ubuntu 18.04.4 LTS(GNU/Linux 4.15.0-91-通用 x86_64)

  • Eth0 1.1.1.1/32 外部IP
  • ipip-ipsec0 192.168.0.1/30 将是我们的隧道

米克托伊克: CCR 1009、路由器操作系统 6.46.5

  • Eth0 10.0.0.2/30 来自提供商的内部 IP。 提供商的外部 NAT IP 是动态的。
  • ipip-ipsec0 192.168.0.2/30 将是我们的隧道

我们将使用 racoon 在 Linux 计算机上创建 IPsec 隧道。 具体的我就不描述了,有一个很好的 文章 у 维波洛斯金.

安装必要的软件包:

sudo install racoon ipsec-tools

我们配置racoon,它将有条件地充当ipsec服务器。 由于主模式下的 mikrotik 无法传输额外的客户端标识符,并且它连接到 Linux 的外部 IP 地址是动态的,因此使用预共享密钥(密码授权)将不起作用,因为密码必须与以下 IP 地址匹配:连接主机,或带有标识符。

我们将使用 RSA 密钥进行授权。

racoon 守护进程使用 RSA 格式的密钥,mikrotik 使用 PEM 格式。 如果您使用 racoon 附带的 plainrsa-gen 实用程序生成密钥,那么您将无法在其帮助下将 Mikrotika 的公钥转换为 PEM 格式 - 它仅向一个方向转换:PEM 到 RSA。 openssl 和 ssh-keygen 都无法读取 plainrsa-gen 生成的密钥,因此也无法使用它们执行转换。

我们将使用 openssl 生成一个 PEM 密钥,然后使用 plainrsa-gen 将其转换为 racoon:

#  Генерируем ключ
openssl genrsa -out server-name.pem 1024
# Извлекаем публичный ключ
openssl rsa -in server-name.pem -pubout > server-name.pub.pem
# Конвертируем
plainrsa-gen -i server-name.pem -f server-name.privet.key
plainrsa-gen -i server-name.pub.pem -f server-name.pub.key

我们将收到的密钥放在文件夹中:/etc/racoon/certs/server。 不要忘记将启动 racoon 守护进程的用户(通常是 root)的所有者设置为 600 权限。

我将描述通过 WinBox 连接时的 mikrotik 设置。

将 server-name.pub.pem 密钥上传到 mikrotik:菜单“文件”-“上传”。

打开“IP”部分 - “IP sec” - “密钥”选项卡。 现在我们生成密钥 - “Generate Key”按钮,然后导出 mikrotika 公钥“Expor Pub. Key”,您可以从“文件”部分下载它,右键单击该文件 - “下载”。

我们导入 racoon 公钥,“导入”,在“文件名”字段的下拉列表中查找我们之前下载的 server-name.pub.pem。

mikrotik公钥需要转换

plainrsa-gen -i mikrotik.pub.pem -f mikrotik.pub.key

并将其放入 /etc/racoon/certs 文件夹中,不要忘记所有者和权限。

带有注释的 racoon 配置:/etc/racoon/racoon.conf

log info; # Уровень логирования, при отладке используем Debug или Debug2.

listen {

    isakmp 1.1.1.1 [500]; # Адрес и порт, на котором будет слушать демон.
    isakmp_natt 1.1.1.1 [4500]; # Адрес и порт, на котором будет слушать демон для клиентов за NAT.
    strict_address; # Выполнять обязательную проверку привязки к указанным выше IP.
}

path certificate "/etc/racoon/certs"; # Путь до папки с сертификатами.

remote anonymous { # Секция, задающая параметры для работы демона с ISAKMP и согласования режимов с подключающимися хостами. Так как IP, с которого подключается Mikrotik, динамический, то используем anonymous, что разрешает подключение с любого адреса. Если IP у хостов статический, то можно указать конкретный адрес и порт.

    passive on; # Задает "серверный" режим работы демона, он не будет пытаться инициировать подключения.
    nat_traversal on; # Включает использование режима NAT-T для клиентов, если они за NAT. 
    exchange_mode main; # Режим обмена параметрами подключения, в данном случае ---согласование.
    my_identifier address 1.1.1.1; # Идентифицируем наш linux хост по его ip адресу.
    certificate_type plain_rsa "server/server-name.priv.key"; # Приватный ключ сервера.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Публичный ключ Mikrotik.

    proposal_check claim; # Режим согласования параметров ISAKMP туннеля. Racoon будет использовать значения подключающегося хоста (инициатора) для срока действия сессии                   и длины ключа, если его срок действия сессии больше, или длина его ключа короче, чем у инициатора. Если срок действия сессии короче, чем у инициатора, racoon использует собственное значение срока действия сессии и будет отправлять сообщение RESPONDER-LIFETIME.
    proposal { # Параметры ISAKMP туннеля.

        encryption_algorithm aes; # Метод шифрования ISAKMP туннеля.
        hash_algorithm sha512; # Алгоритм хеширования, используемый для ISAKMP туннеля.
        authentication_method rsasig; # Режим аутентификации для ISAKMP туннеля - по RSA ключам.
        dh_group modp2048; # Длина ключа для алгоритма Диффи-Хеллмана при согласовании ISAKMP туннеля.
        lifetime time 86400 sec; Время действия сессии.
    }

    generate_policy on; # Автоматическое создание ESP туннелей из запроса, пришедшего от подключающегося хоста.
}

sainfo anonymous { # Параметры ESP туннелей, anonymous - указанные параметры будут использованы как параметры по умолчанию. Для разных клиентов, портов, протоколов можно              задавать разные параметры, сопоставление происходит по ip адресам, портам, протоколам.

    pfs_group modp2048; # Длина ключа для алгоритма Диффи-Хеллмана для ESP туннелей.
    lifetime time 28800 sec; # Срок действия ESP туннелей.
    encryption_algorithm aes; # Метод шифрования ESP туннелей.
    authentication_algorithm hmac_sha512; # Алгоритм хеширования, используемый для аутентификации ESP туннелей.
    compression_algorithm deflate; # Сжимать передаваемые данные, алгоритм сжатия предлагается только один.
}

微控制器配置

返回“IP”部分 - “IPsec”

“个人资料”选项卡
参数

名字
由您自行决定(默认默认)

哈希算法
sha512

加密算法
AES-128

DH集团
模组p2048

提案检查
要求

寿命
1 天 00:00:00

NAT穿越
正确(选中该框)

DPD
120

DPD 最大故障
5

同行选项卡
参数

名字
由您自行决定(以下简称 MyPeer)

地址
1.1.1.1(IP Linux 机器)

本地地址
10.0.0.2(IP WAN 接口 mikrotik)

本人简介
默认

交换方式

被动
false

发送 INITIAL_CONTACT
true

提案选项卡
参数

名字
由您自行决定(以下简称 MyPeerProposal)

授权。 算法
sha512

恩克里。 算法
aes-128-CBC

寿命
08:00:00

PFS集团
模组p2048

“身份”选项卡
参数

窥视
我的同行

阿图。 方法
RSA密钥


mikrotik.privet.key

遥控钥匙
服务器名称.pub.pem

策略模板组
默认

诺轨道链
是空的

我的身份证类型
汽车

远程 ID 类型
汽车

匹配依据
远程ID

模式配置
是空的

生成策略
没有

选项卡“策略 - 常规”
参数

窥视
我的同行

隧道
true

来源。 地址
192.168.0.0/30

目的地。 地址
192.168.0.0/30

协议
255(全部)

模板
false

选项卡“策略 - 操作”
参数

操作
加密

Level
要求

IPsec 协议
ESP

提案
我的同行提案

最有可能的是,像我一样,您在 WAN 接口上配置了 snat/masquerade;需要调整此规则,以便传出 ipsec 数据包进入我们的隧道:
转到“IP”-“防火墙”部分。
“NAT”选项卡,打开我们的 snat/masquerade 规则。

高级选项卡
参数

IPsec 策略
输出:无

重启浣熊恶魔

sudo systemctl restart racoon

如果 racoon 在重新启动时未启动,则配置中存在错误;在 syslog 中,racoon 显示有关检测到错误的行号的信息。

当操作系统启动时,racoon 守护进程在网络接口启动之前启动,并且我们在监听部分指定了 strict_address 选项;您需要将 racoon 单元添加到 systemd 文件中
/lib/systemd/system/racoon.service,在 [Unit] 部分中,行 After=network.target。

现在我们的 ipsec 隧道应该已启动,请查看输出:

sudo ip xfrm policy

src 192.168.255.0/30 dst 192.168.255.0/30 
    dir out priority 2147483648 
    tmpl src 1.1.1.1 dst "IP NAT через который подключается mikrotik"
        proto esp reqid 0 mode tunnel
src 192.168.255.0/30 dst 192.168.255.0/30 
    dir fwd priority 2147483648 
    tmpl src "IP NAT через который подключается mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel
src 192.168.255.0/30 dst 192.168.255.0/30 
    dir in priority 2147483648 
    tmpl src "IP NAT через который подключается mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

如果隧道未启动,请查看系统日志或journalctl -u racoon。

现在您需要配置 L3 接口以便可以路由流量。 有不同的选择,我们将使用 IPIP,因为 mikrotik 支持它,我会使用 vti,但不幸的是,它尚未在 mikrotik 中实现。 它与IPIP的不同之处在于它可以额外封装组播并在数据包上放置fwmarks,通过这些数据包可以在iptables和iproute2(基于策略的路由)中进行过滤。 如果您需要最大程度的功能,那么可以选择 GRE。 但不要忘记,我们为额外的功能付出了巨大的开销。

可以看一篇很好的隧道接口评论的翻译 这里.

在 Linux 上:

# Создаем интерфейс
sudo ip tunnel add ipip-ipsec0 local 192.168.255.1 remote 192.168.255.2 mode ipip
# Активируем
sudo ip link set ipip-ipsec0 up
# Назначаем адрес
sudo ip addr add 192.168.255.1/30 dev ipip-ipsec0

现在您可以为 mikrotik 后面的网络添加路由

sudo ip route add A.B.C.D/Prefix via 192.168.255.2

为了使我们的接口和路由在重新启动后能够启动,我们需要在 /etc/network/interfaces 中描述接口并在后期添加路由,或者将所有内容写入一个文件中,例如 /etc/ ipip-ipsec0.conf 并通过 post-up 拉取它,不要忘记文件所有者、权限并使其可执行。

下面是一个示例文件

#!/bin/bash
ip tunnel add ipip-ipsec0 local 192.168.255.1 remote 192.168.255.2 mode ipip
ip link set ipip-ipsec0 up
ip addr add 192.168.255.1/30 dev ipip-ipsec0

ip route add A.B.C.D/Prefix via 192.168.255.2

关于米克罗蒂克:

在“Interfaces”部分,添加一个新接口“IPtunnel”:

选项卡“IP 隧道”-“常规”
参数

名字
由您自行决定(以下简称 IPIP-IPsec0)

MTU
1480(如果未指定,mikrotik 开始将 mtu 削减到 68)

本地地址
192.168.0.2

远程地址
192.168.0.1

IPsec 秘密
停用该字段(否则将创建一个新的对等点)

活着
停用该字段(否则界面将不断关闭,因为 mikrotika 对于这些软件包有自己的格式,并且不适用于 Linux)

数据中心
继承

不要碎片化
没有

钳位 TCP MSS
true

允许快速路径
true

“IP”-“地址”部分,添加地址:

参数

地址
192.168.0.2/30

接口
IPIP-IPsec0

现在您可以添加到 Linux 机器后面的网络的路由;添加路由时,网关将是我们的 IPIP-IPsec0 接口。

PS

由于我们的 Linux 服务器是可传递的,因此为其上的 ipip 接口设置 Clamp TCP MSS 参数是有意义的:

创建包含以下内容的文件 /etc/iptables.conf:

*mangle
-A POSTROUTING -o ipip+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
COMMIT

和 /etc/network/interfaces 中
后期 iptables-restore < /etc/iptables.conf

我在 mikrotik (ip 10.10.10.1) 后面的网络上运行 nginx,使其可以从互联网访问,将其添加到 /etc/iptables.conf:

*nat
-A PREROUTING -d 1.1.1.1/32 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.10.10.1
#На mikrotik, в таблице mangle, надо добавить правило route с назначением 192.168.0.1 для пакетов с адресом источника 10.10.10.1 и портов 80, 443.

# Так же на linux работает OpenVPN сервер 172.16.0.1/24, для клиентов которые используют подключение к нему в качестве шлюза даем доступ в интернет
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
COMMIT 

如果启用了数据包过滤器,请不要忘记向 iptables 添加适当的权限。

身体健康!

来源: habr.com

添加评论