Dat:
- Am un serviciu containerizat care trimite pachete UDP către o listă de elemente de rețea (servere syslog sink terțe).
- Fiecare element de rețea țintă este specificat de adresa IP, numărul său de port este constant, același pentru fiecare nod.
Trebuie să creez un mediu de testare simplu - ca în graficul de mai jos. Serviciul principal emite mesaje syslog, pe grafic este numit PRODUCATOR CONTAINER
.
CONTAINER DE TESTARE
poate genera cu ușurință containere docker, așa că am ales reproducerea alpin/socat:latest
.
Întrebarea este:
- La ce argumente trebuie să trec
socat
pentru ca setarea să funcționeze?
- De ce altceva trebuie să-mi pese?
Am încercat multe combinații de socat
argumente până acum, dar fără noroc.
Cu socat UDP-RECV:514 UDP-SENDTO:172.25.0.2:65354,bind=:1234
Primesc mesaje în containerele proxy, dar nu se primește nimic în containerul de testare.
Se pare că îmi lipsesc cunoștințele generale. Poate cineva să explice cum ar trebui să se facă?
Codul pe care îl folosesc în containerul de testare arată mai mult, mai puțin așa:
import os
platforma de import
import threading
din socket import socket
docker de import
din docker import DockerClient
din docker.models.containers import Container
din docker.models.networks import Network
def create_proxy():
docker_client: DockerClient = docker.from_env()
test_network: Network = docker_client.networks.create(f'test_network_{os.environ.get("HOSTNAME")}')
testrunner_container: Container = docker_client.containers.get(platform.node())
testrunner_container.reload()
test_container_ip = testrunner_container.attrs['NetworkSettings']['Networks'][test_network.name]['IPAddress']
socket_ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_.bind(('', 0)) # se leagă la portul local aleatoriu
_, test_container_port = socket_.getsockname()
proxy_port = 1234
socat_args = [
'-d', '-d', f'UDP-RECV:514', f'UDP-SENDTO:{test_container_ip}:{test_container_port},bind=:{proxy_port}',
]
proxy_container: Container = docker_client.containers.run(
„alpin/socat:latest”,
socat_args,
name='udp_proxy_container',
network=test_network.name,
detașează=Adevărat,
remove=Adevărat,
)
proxy_container.reload()
proxy_ip = proxy_container.attrs['NetworkSettings']['Networks'][test_network.name]['IPAddress']
socket_ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_.bind(('', 0)) # se leagă la portul local aleatoriu
socket_.connect((proxy_ip, proxy_port))
socket_.settimeout(1)
def receive_loop(coada):
în timp ce este adevărat:
încerca:
mesaj = socket_.recv(1024)
dacă b'OPRITĂ-L' în mesaj:
pauză
queue.append(mesaj)
cu excepția socket.timeout ca e:
log.error(f"{type(e).__name__} în bucla de primire a stub-ului Syslog: {e}")
msg_queue = []
receive_thread = threading.Thread(target=receive_loop, args=(msg_queue,))
receive_thread.daemon = Adevărat
receive_thread.start()
# ... alt cod