Как включить многоадресную передачу между подсетями через брандмауэр Пало-Альто
У меня есть две подсети, которые подключены через брандмауэр 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()
Никто из нас не знает, что мы делаем. Может кто-то пролить свет на это?