Điểm:0

Tạo các bộ chuyển tiếp UDP bắt chước nhiều phần tử mạng sử dụng cùng một cổng

lá cờ de

Đượ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à:

  1. Tôi phải chuyển đến những đối số nào socat để thiết lập hoạt động?
  2. 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?

test_environment

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

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.