Я хочу внутренне опубликовать SMTP-сервер (IP 10.0.0.10), который находится за VPN-туннелем на моем внутреннем сервере (192.168.0.12), используя strongswan
. Мой strongswan
работает в контейнере docker.
Для этого я хочу, чтобы мой внутренний сервер 192.168.0.12
слушал свой 25 порт и направлял трафик на туннелированный сервер на тот же порт 10.0.0.10:25
.
До сих пор я пытался использовать iptables, но безуспешно.
net.ipv4.ip_forward
включен как на хосте, так и в докер-контейнере!
мой iptables-save
на 192.168.0.12
после подключения strongswan к туннелю: (и да, я могу пинговать 10.0.0.10 с 192.168.0.12)
# Generated by iptables-save v1.8.4 on Fri Jul 23 09:55:05 2021
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -s 10.0.0.0/16 -d 192.168.0.10/32 -i eth0 -m policy --dir in --pol ipsec --reqid 1 --proto esp -j ACCEPT
-A OUTPUT -s 192.168.0.10/32 -d 10.0.0.0/16 -o eth0 -m policy --dir out --pol ipsec --reqid 1 --proto esp -j ACCEPT
COMMIT
# Completed on Fri Jul 23 09:55:05 2021
# Generated by iptables-save v1.8.4 on Fri Jul 23 09:55:05 2021
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [2:1600]
:POSTROUTING ACCEPT [2:1600]
:DOCKER_OUTPUT - [0:0]
:DOCKER_POSTROUTING - [0:0]
-A OUTPUT -d 127.0.0.11/32 -j DOCKER_OUTPUT
-A POSTROUTING -d 127.0.0.11/32 -j DOCKER_POSTROUTING
-A DOCKER_OUTPUT -d 127.0.0.11/32 -p tcp -m tcp --dport 53 -j DNAT --to-destination 127.0.0.11:45165
-A DOCKER_OUTPUT -d 127.0.0.11/32 -p udp -m udp --dport 53 -j DNAT --to-destination 127.0.0.11:53306
-A DOCKER_POSTROUTING -s 127.0.0.11/32 -p tcp -m tcp --sport 45165 -j SNAT --to-source :53
-A DOCKER_POSTROUTING -s 127.0.0.11/32 -p udp -m udp --sport 53306 -j SNAT --to-source :53
COMMIT
команда ip r
выход:
default via 192.168.16.1 dev eth0
192.168.16.0/20 dev eth0 proto kernel scope link src 192.168.16.10 # this is a docker internal network for my services
192.168.0.10/30 dev eth1 proto kernel scope link src 192.168.0.12
Я пробовал различные команды, такие как эти:
iptables -t nat -A PREROUTING -p tcp --dport 25 -j DNAT --to-destination 10.0.0.10:25
iptables -t nat -A POSTROUTING -p tcp -d 10.0.0.10 --dport 25 -j SNAT --to-source 192.168.0.12
но без успеха.
Я не могу предоставить никакой информации ни о ip r
хоста, ни о iptables-save
.
Что я делаю не так?
Я решил свою проблему с помощью traefik
.
Я установил traefik на хост (192.168.0.12
), который имеет туннель strongswan
, и использовал маршрутизатор TCP
для перенаправления всего трафика в туннель.
traefik
установка:
wget -O /traefik.tar.gz https://github.com/traefik/traefik/releases/download/v2.4.12/traefik_v2.4.12_linux_amd64.tar.gz \
&& tar -zxvf /traefik.tar.gz \
&& ln -s /traefik /usr/bin/traefik
traefik.yaml
:
entryPoints:
smtp:
address: ":1025"
accessLog: {}
providers:
file:
directory: /traefik-conf/dynamic/
watch: true
api:
dashboard: true
insecure: true
мой /traefik-conf/dynamic/dynamic.yaml
:
tcp:
routers:
smtp-router:
rule: "HostSNI(`*`)"
entryPoints:
- smtp
service: smtp-service
services:
smtp-service:
loadBalancer:
servers:
- address: 10.0.0.10:25
Выполнить traefik
(я не знаю, как правильно запустить его в качестве фонового демона):
traefik --configfile /traefik-conf/traefik.yml &
Теперь я могу подключиться к туннелированному smtp-серверу
из любой точки моей сети, используя 192.168.0.12:1025
.
Я создал пример с помощью docker здесь, на github