Как включить многоадресную передачу между подсетями через брандмауэр Пало-Альто

У меня есть две подсети, которые подключены через брандмауэр Palo Alto 850.

Я работал с моим сетевым парнем, и он говорит, что он "установил статический RP, включил IGMP PIM на интерфейсах, а разрешенный сосед PIM установлен в любое".

Тем не менее, простому многоадресному серверу в одной подсети не удается передать данные тривиальному клиенту в другой. Тот же тривиальный клиент работает в той же подсети, что и сервер. Клиент и Сервер работают под управлением CentOS 7; firewalld отключен на обоих; сервер работает в VMware VM. Рабочий клиент (в той же подсети) - это другая виртуальная машина VMware, но клиент в другой подсети - это отдельная рабочая станция.

Тривиальный клиент:

#! /usr/bin/python

from __future__ import print_function

import socket
import struct
import time

def Log(*args, **kw):
    print(time.strftime("%H:%M:%S"), *args, **kw)

class Monitor(object):

    def __init__(self, name="Client", args=(), kwargs={}):
        self.args = args
        self.kwargs = kwargs

    def start(self):
        self._run(*(self.args), **(self.kwargs))

    def _run(self, *args, **kw):
        group = kw["mgroup"]
        port  = kw["mport"]

        Log("mcast group", group, "port", port)
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.bind((group, port))

        sock.settimeout(5)

        mreq = struct.pack("4sl", socket.inet_aton(group), socket.INADDR_ANY)
        sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

        count = 0
        while True:
            try:
                packet = sock.recv(8192)
                count += 1
            except socket.timeout:
                Log("mcast timeout")
            finally:
                if count > 0 and count % 10 == 0:
                    Log("mcast received", count, "packets")

def main(kw):
    client = Monitor(kwargs=kw)
    client.start()

if __name__ == "__main__":
    kw = { "mgroup" : "239.1.2.49", "mport" : 20000,
           }
    main(kw)

Тривиальный сервер:

#! /usr/bin/python

from __future__ import print_function

import socket
import time

def_mgroup = "239.1.2.49"
def_mport  = 20000
def_rate   = 2

def usage():
    import sys
    print("Usage:", sys.argv[0],
          "[multicast group address [multicast port [rate]]]")
    print()
    print("    multicast group address - default", def_mgroup)
    print("    multicast port          - default", def_mport)
    print("    rate                    - default", def_rate)

def main(**kw):

    mgroup = kw.get("mgroup", def_mgroup)
    mport  = kw.get("mport",  def_mport)
    rate   = kw.get("rate",   def_rate)

    sleepdur = 1.0 / rate               # divide by zero if you ask for it

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 10)

    npackets = 0
    while True:
        sock.sendto("robot", (mgroup, mport))
        npackets += 1
        if npackets % 10 == 0: print(time.strftime("%H:%M:%S"), "sent", npackets)
        time.sleep(sleepdur)

if __name__ == "__main__":
    args = {}

    import sys
    try:
        if len(sys.argv) > 1:
            args["mgroup"] = sys.argv[1]

        if len(sys.argv) > 2:
            args["mport"] = int(sys.argv[2])

        if len(sys.argv) > 3:
            args["rate"] = int(sys.argv[3])

        main(**args)

    except Exception as e:
        print(e)
        usage()

Никто из нас не знает, что мы делаем. Может кто-то пролить свет на это?

0 ответов

Другие вопросы по тегам