Được cho:
- Tôi có một dịch vụ được đóng gói để gửi các gói UDP tới danh sách các thành phần mạng (máy chủ chìm nhật ký hệ thống của bên thứ 3).
- Mỗi phần tử mạng mục tiêu được chỉ định bởi địa chỉ IP, số cổng của nó là không đổi, giống nhau cho mỗi nút.
Tôi cần tạo một môi trường thử nghiệm đơn giản - như trong biểu đồ bên dưới. Dịch vụ chính phát ra các thông báo nhật ký hệ thống, trên biểu đồ, nó được đặt tên NHÀ SẢN XUẤT CONTAINER
.
THỬ NGHIỆM CONTAINER
có thể dễ dàng sinh ra các thùng chứa docker, vì vậy tôi đã chọn sinh sản núi cao/socat: mới nhất
.
Câu hỏi là:
- Tôi phải chuyển đến những đối số nào
socat
để thiết lập hoạt động?
- Tôi cần quan tâm đến điều gì nữa?
Tôi đã thử nhiều sự kết hợp của socat
args cho đến nay, nhưng không có may mắn.
Với socat UDP-RECV:514 UDP-SENDTO:172.25.0.2:65354,bind=:1234
Tôi nhận được tin nhắn trong vùng chứa proxy nhưng không nhận được gì trong vùng chứa thử nghiệm.
Có vẻ như tôi thiếu kiến thức tổng thể. Bất cứ ai có thể giải thích làm thế nào nó được cho là được thực hiện?
Mã tôi sử dụng trong vùng chứa thử nghiệm trông giống như vậy:
nhập hệ điều hành
nền tảng nhập khẩu
nhập luồng
từ ổ cắm nhập ổ cắm
docker nhập khẩu
từ docker nhập DockerClient
từ docker.models.containers nhập Container
từ docker.models.networks nhập Mạng
chắc chắn tạo_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)) # liên kết với cổng cục bộ ngẫu nhiên
_, 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(
'núi cao/socat: mới nhất',
socat_args,
tên='udp_proxy_container',
mạng=test_network.name,
tách ra = Đúng,
xóa = Đúng,
)
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)) # liên kết với cổng cục bộ ngẫu nhiên
socket_.connect((proxy_ip, proxy_port))
socket_.settimeout(1)
def get_loop (hàng đợi):
trong khi Đúng:
cố gắng:
tin nhắn = socket_.recv(1024)
nếu b'STOP IT' trong tin nhắn:
nghỉ
queue.append(tin nhắn)
ngoại trừ socket.timeout như e:
log.error(f"{type(e).__name__} trong vòng lặp nhận của sơ khai Syslog: {e}")
msg_queue = []
get_thread = threading.Thread(đích=receive_loop, args=(msg_queue,))
get_thread.daemon = Đúng
get_thread.start()
# ... một số mã khác