рд╕рдмрдХреЗ рд▓рд┐рдП рджрд┐рди рдЕрдЪреНрдЫрд╛ рд╣реЛ! рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рдУрдкрдирд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдбреЙрдХ рд░рд╛рдЙрдЯрд░рдУрдПрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЗрд╕реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЧреНрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╕рдордп рдХреЗ рд╕рд╛рде, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░, рдХрдИ рд╕реБрдзрд╛рд░ рдЬреЛрдбрд╝реЗ рдЧрдП рдЬреЛ рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рд╕реАрдорд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рдореИрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдгреЛрдВ, рдЗрд╕рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдЬрд┐рдирдХрд╛ рдореБрдЭреЗ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдерд╛ред
рдХрдЯ рдХреЗ рдиреАрдЪреЗ рдЬрд╛рд░реА рд╣реИред
рдХрд┐рд╕ рд▓рд┐рдП?
рдФрд░ рдпрд╣ рд╕рд╣реА рд╕рд╡рд╛рд▓ рд╣реИ, рд╢рд╛рдпрдж рдпрд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╛рдЙрдЯрд░рдУрдПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ PHP рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХреА рдереА (рдпрджрд┐ рдЬрдирддрд╛ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреА рд╣реИ, рддреЛ PHP рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЕрднреНрдпрд╛рд╕, RouterOS рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕реНрдерд┐рд░ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред
рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд▓реЙрдЧрд┐рди рдпрд╛ рдбреЗрдЯрд╛ рд╕рд░рдгреА рдХрд╛ рд╕рд╣реА рдкрд╛рд░реНрд╕рд┐рдВрдЧ, рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд▓рд╛рдЗрд╡ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЙрддреНрддрд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрдгрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИред
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрд░реЗ рд╣реЛрдо рд░рд╛рдЙрдЯрд░ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдиреЗ рд░рд╛рдЙрдЯрд░ рдХреА рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдЕрдХреНрд╕рд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЗрдВрдЯрд░рдиреЗрдЯ рдФрд░ рдШрд░реЗрд▓реВ рдЕрд╕рдВрддреЛрд╖ рдкреИрджрд╛ рд╣реЛ рдЧрдпрд╛, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд░рд╛рдЙрдЯрд░рдУрдПрд╕ рдХреЗ рдПрдХ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдУрдПрд╕ рдХреЗ рдХрд╛рд░рдг рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЗрд╕ рдХрд╛ред
рдФрд░ рдПрдХ рджрд┐рди рдореИрдВ рдЗрд╕рд╕реЗ рдердХ рдЧрдпрд╛, рдФрд░ рдореИрдВрдиреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рдвреВрдВрдврдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред
рд╣рдо рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдХреНрд╖рдг рдерд╛ рдЬрдм рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ VirtualBox рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рдмрд╕ рдЧрдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рдХрд┐рдпрд╛, рдлрд┐рд░ рд╕реЗ рдХреБрдЫ рддреЛрдбрд╝рдиреЗ рдХреА рдзрдордХреА рдирд╣реАрдВ рджреАред
Cloud Hosted Router , Mikrotik. CHR, , - "" . , CHR VDI/VMDK/OVA/etc. , RouterOS, .
, , 6.42 ( 6.44).
, 6.43 RouterOS API, , , .
VirtualBox , .
?
, .
?
Travis-CI, , VirtualBox Travis-CI , Travis "" .
тАж Docker!
?
Docker , , .
, " RouterOS Docker ?", QEMU, PC .
QEMU // , headless , Docker .
RouterOS QEMU - , , API.
image, Alpine Linux.
Version 0
:
DockerfileFROM alpine:3.8
RUN mkdir /routeros
WORKDIR /routeros
ADD [".", "/routeros"]
RUN apk add --no-cache --update netcat-openbsd qemu-x86_64 qemu-system-x86_64 \
&& wget "https://download.mikrotik.com/routeros/6.42.7/chr-6.42.7.vdi"
ENTRYPOINT ["/routeros/entrypoint.sh"]
WORKDIR , mkdir .
Dockerfile , alpine 3.8, , Mikrotik.
entrypoint.sh#!/bin/sh
qemu-system-x86_64 \
-vnc 0.0.0.0:0 \
-m 256 \
-hda /routeros/chr-6.42.7.vdi \
-device e1000,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::22-:22,hostfwd=tcp::23-:23,hostfwd=tcp::8728-:8728,hostfwd=tcp::8729-:8729
Entrypoint , , 256 , VNC 5900 , , .
, Docker, , . , , QEMU, Docker .
hostfwd , Docker , , .
Version 1
, URL , .
DockerfileFROM alpine:3.8
ENV ROUTEROS_VERSON="6.42.7"
ENV ROUTEROS_IMAGE="chr-$ROUTEROS_VERSON.vdi"
ENV ROUTEROS_PATH="https://download.mikrotik.com/routeros/$ROUTEROS_VERSON/$ROUTEROS_IMAGE"
RUN mkdir /routeros
WORKDIR /routeros
ADD [".", "/routeros"]
RUN apk add --no-cache --update netcat-openbsd qemu-x86_64 qemu-system-x86_64 \
&& echo ">>> $ROUTEROS_PATH" \
&& if [ ! -e "$ROUTEROS_IMAGE" ]; then wget "$ROUTEROS_PATH"; fi
# For access via VNC
EXPOSE 5900
# Default ports of RouterOS
EXPOSE 21
EXPOSE 22
EXPOSE 23
EXPOSE 80
EXPOSE 443
EXPOSE 8291
EXPOSE 8728
EXPOSE 8729
ENTRYPOINT ["/routeros/entrypoint.sh"]
EXPOS , best practice .
Dockerfile, , GitHub Docker Hub.
, Dockerfile , crontab.
cron.sh#!/bin/bash
# Cron fix
cd "$(dirname $0)"
function getTarballs
{
curl https://mikrotik.com/download/archive -o - 2>/dev/null | \
grep -i vdi | \
awk -F\" '{print $2}' | \
sed 's:.*/::' | \
sort -V
}
function getTag
{
echo "$1" | sed -r 's/chr\-(.*)\.vdi/\1/gi'
}
function checkTag
{
git rev-list "$1" 2>/dev/null
}
getTarballs | while read line; do
tag=`getTag "$line"`
echo ">>> $line >>> $tag"
if [ "x$(checkTag "$tag")" == "x" ]
then
url="https://download.mikrotik.com/routeros/$tag/chr-$tag.vdi"
if curl --output /dev/null --silent --head --fail "$url"; then
echo ">>> URL exists: $url"
sed -r "s/(ROUTEROS_VERSON=\")(.*)(\")/\1$tag\3/g" -i Dockerfile
git commit -m "Release of RouterOS changed to $tag" -a
git push
git tag "$tag"
git push --tags
else
echo ">>> URL don't exist: $url"
fi
else
echo ">>> Tag $tag has been already created"
fi
done
, , .
Travis-CI, , GitHub.
Version 2
, , , , RouterOS ICMP ( ) .
hostfwd, .
Qemu Docker, TAP eth0.
Debian, Alpine, , multistage . KVM, QEMU, .
VPS KVM, - KVM in KVM, Docker RouterOS KVM QEMU .
Dockerfile :
DockerfileFROM alpine:3.11
# For access via VNC
EXPOSE 5900
# Default ports of RouterOS
EXPOSE 21 22 23 80 443 8291 8728 8729
# Different VPN services
EXPOSE 50 51 500/udp 4500/udp 1194/tcp 1194/udp 1701 1723
# Change work dir (it will also create this folder if is not exist)
WORKDIR /routeros
# Install dependencies
RUN set -xe \
&& apk add --no-cache --update \
netcat-openbsd qemu-x86_64 qemu-system-x86_64 \
busybox-extras iproute2 iputils \
bridge-utils iptables jq bash python3
# Environments which may be change
ENV ROUTEROS_VERSON="6.46.5"
ENV ROUTEROS_IMAGE="chr-$ROUTEROS_VERSON.vdi"
ENV ROUTEROS_PATH="https://download.mikrotik.com/routeros/$ROUTEROS_VERSON/$ROUTEROS_IMAGE"
# Download VDI image from remote site
RUN wget "$ROUTEROS_PATH" -O "/routeros/$ROUTEROS_IMAGE"
# Copy script to routeros folder
ADD ["./scripts", "/routeros"]
ENTRYPOINT ["/routeros/entrypoint.sh"]
best practice.
, , , , :
- python3 тАФ , udhcpd,
- jq тАФ
ip addr -json
- netcat-openbsd тАФ ,
entrypoint :
entrypoint.sh#!/bin/sh
###
### ,
### ,
### .
###
# Generate udhcpd configuration
/routeros/generate-dhcpd-conf.py $QEMU_BRIDGE > $DHCPD_CONF_FILE
# Get name of default interface
default=`ip -json route show | jq -r '.[] | select(.dst == "default") | .dev'`
# Finally, start udhcpd server
udhcpd -I $DUMMY_DHCPD_IP -f $DHCPD_CONF_FILE &
# And run the VM!
exec qemu-system-x86_64 \
-nographic -serial mon:stdio \
-vnc 0.0.0.0:0 \
-m 256 \
-nic tap,id=qemu0,script=$QEMU_IFUP,downscript=$QEMU_IFDOWN \
"$@" \
-hda $ROUTEROS_IMAGE
, , TAP . Docker RouterOS, RouterOS .
, udhcpd DNS ( 127.0.0.11) Docker Compose.
?
- RouterOS Docker
- , API Travis-CI
- images RouterOS
, , . Docker Host RouterOS.
- ( ).
?
, udhcpd python - , bash.
, .
VDI RouterOS, Docker . , , RouterOS Linux Kernel , RouterOS .
Docker Host , , .
, 2010 , , LOR ON^W^W^W . Docker RouterOS , read-only mode .
, , , , , .
, , .