NAT 공급자 뒤의 Linux 시스템과 Mikrotik 간의 IPIP IPsec VPN 터널

Linux : 우분투 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, 라우터OS 6.46.5

  • Eth0 10.0.0.2/30 공급자의 내부 IP입니다. 공급자의 외부 NAT IP는 동적입니다.
  • ipip-ipsec0 192.168.0.2/30이 터널이 됩니다.

racoon을 사용하여 Linux 시스템에 IPsec 터널을 생성하겠습니다. 자세한 내용은 설명하지 않겠습니다. 좋은 것이 있습니다. 기사 у vvpoloskin.

필요한 패키지를 설치합니다.

sudo install racoon ipsec-tools

racoon을 구성하면 조건부로 ipsec 서버로 작동합니다. 기본 모드의 mikrotik은 추가 클라이언트 식별자를 전송할 수 없고 Linux에 연결하는 데 사용되는 외부 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 데몬이 실행되는 이름(보통 루트)의 사용자 소유자를 600 권한으로 설정하는 것을 잊지 마세요.

WinBox를 통해 연결할 때 mikrotik 설정에 대해 설명하겠습니다.

server-name.pub.pem 키를 mikrotik에 업로드합니다: 메뉴 "파일" - "업로드".

"IP" 섹션 - "IP sec" - "키" 탭을 엽니다. 이제 "키 생성" 버튼을 눌러 키를 생성한 다음 mikrotika 공개 키 "Expor Pub. 키"의 경우 "파일" 섹션에서 다운로드할 수 있습니다. 파일을 마우스 오른쪽 버튼으로 클릭한 후 "다운로드"를 클릭하세요.

"파일 이름" 필드의 드롭다운 목록에서 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-그룹
모드2048

제안_확인
청구

수명
1일 00:00:00

NAT 순회
사실(확인란을 선택하세요)

DPD
120

DPD 최대 실패
5

피어 탭
매개 변수
가치

성함
귀하의 재량에 따라(이하 MyPeer라 함)

주소
1.1.1.1(IP Linux 머신)

현지 주소
10.0.0.2(IP WAN 인터페이스 mikrotik)

프로필
디폴트 값

교환 모드
본관

수동
그릇된

INITIAL_CONTACT 보내기
참된

제안 탭
매개 변수
가치

성함
귀하의 재량에 따라(이하 MyPeerProposal이라 함)

인증 알고리즘
sha512

암호화 알고리즘
aes-128-cbc

수명
08:00:00

피에프에스그룹
모드2048

"ID" 탭
매개 변수
가치


마이피어

아투. 방법
rsa 키


mikrotik.privet.key

원격 키
서버 이름.pub.pem

정책 템플릿 그룹
디폴트 값

노트랙 체인
비어 있는

내 아이디 유형
자동

원격 ID 유형
자동

일치 기준
원격 ID

모드 구성
비어 있는

정책 생성
아니

탭 "정책 - 일반"
매개 변수
가치


마이피어

터널
참된

원본 주소
192.168.0.0/30

목적지 주소
192.168.0.0/30

프로토콜
255(전체)

주형
그릇된

탭 "정책 - 조치"
매개 변수
가치

동작
암호화

레벨
필요하다

IPsec 프로토콜
ESP

신청
MyPeerProposal

저처럼 WAN 인터페이스에 snat/masquerade가 구성되어 있을 가능성이 높으며, 나가는 IPsec 패킷이 터널로 들어가도록 이 규칙을 조정해야 합니다.
"IP" - "방화벽" 섹션으로 이동합니다.
"NAT" 탭에서 snat/masquerade 규칙을 엽니다.

고급 탭
매개 변수
가치

IPsec 정책
아웃: 없음

너구리 악마 다시 시작하기

sudo systemctl restart racoon

racoon이 재시작 시 시작되지 않으면 구성에 오류가 있는 것입니다. syslog에서 racoon은 오류가 감지된 줄 번호에 대한 정보를 표시합니다.

OS가 부팅되면 네트워크 인터페이스가 시작되기 전에 racoon 데몬이 시작되며 수신 섹션에 strict_address 옵션을 지정했습니다. systemd 파일에 racoon 장치를 추가해야 합니다.
/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

터널이 작동하지 않으면 syslog 또는 Journalctl -u racoon을 살펴보세요.

이제 트래픽이 라우팅될 수 있도록 L3 인터페이스를 구성해야 합니다. 다양한 옵션이 있습니다. 우리는 IPIP를 사용할 것입니다. mikrotik이 지원하기 때문에 저는 vti를 사용할 것입니다. 하지만 불행히도 mikrotik에서는 아직 구현되지 않았습니다. 이는 멀티캐스트를 추가로 캡슐화하고 패킷에 fwmark를 넣을 수 있다는 점에서 IPIP와 다릅니다. 이를 통해 패킷은 iptables 및 iproute2(정책 기반 라우팅)에서 필터링될 수 있습니다. 최대 기능이 필요한 경우 예를 들어 GRE가 있습니다. 그러나 우리는 큰 오버헤드 헤드로 인해 추가 기능에 대한 비용을 지불한다는 사실을 잊지 마십시오.

터널 인터페이스에 대한 좋은 개요의 번역을 볼 수 있습니다. 여기에.

리눅스의 경우:

# Создаем интерфейс
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를 다운로드하고 포스트업을 통해 가져오세요. 파일 소유자, 권한을 잊지 말고 실행 가능하게 만드세요.

아래는 예시 파일입니다

#!/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

Mikrotik에서:

"인터페이스" 섹션에 새 인터페이스 "IP 터널"을 추가합니다.

탭 "IP 터널" - "일반"
매개 변수
가치

성함
귀하의 재량에 따라(이하 IPIP-IPsec0이라 함)

MTU
1480(지정되지 않은 경우 mikrotik은 mtu를 68로 자르기 시작합니다)

현지 주소
192.168.0.2

원격 주소
192.168.0.1

IPsec 비밀
필드를 비활성화합니다. 그렇지 않으면 새 피어가 생성됩니다.

살아 유지
필드를 비활성화합니다. 그렇지 않으면 mikrotika가 이러한 패키지에 대한 자체 형식을 가지고 있고 Linux에서 작동하지 않기 때문에 인터페이스가 계속 꺼집니다.

DSCP
상속하다

조각화하지 마십시오
아니

클램프 TCP MSS
참된

빠른 경로 허용
참된

섹션 "IP" - "주소"에 주소를 추가합니다.

매개 변수
가치

주소
192.168.0.2/30

인터페이스
IPIP-IPsec0

이제 Linux 시스템 뒤에 있는 네트워크에 경로를 추가할 수 있습니다. 경로를 추가하면 게이트웨이가 IPIP-IPsec0 인터페이스가 됩니다.

PS

Linux 서버는 전이적이므로 ipip 인터페이스에 대한 클램프 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

코멘트를 추가