This article describes a simple method of carrying sFlow datagrams over an encrypted ssh connection which can be useful in situations where a VPN is not available, for example, sending sFlow to an analyzer in the public cloud, or to an external consultant.
The diagram shows the elements of the solution. A collector on the site receives sFlow datagrams from the network devices and uses the sflow_fwd.py script to convert the datagrams into line delimited hexadecimal strings that are sent over an ssh connection to another instance of sflow_fwd.py running on the analyzer that converts the hexadecimal strings back to sFlow datagrams.
The following sflow_fwd.py Python script accomplishes the task:
#!/usr/bin/python import socket import sys import argparse parser = argparse.ArgumentParser(description='Serialize/deserialize sFlow') parser.add_argument('-c', '--collector', default='') parser.add_argument('-s', '--server') parser.add_argument('-p', '--port', type=int, default=6343) args = parser.parse_args() sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) if(args.server != None): while True: line = sys.stdin.readline() if not line: break buf = bytearray.fromhex(line[:-1]) sock.sendto(buf, (args.server, args.port)) else: sock.bind((args.collector,args.port)) while True: buf = sock.recv(2048) if not buf: break print buf.encode('hex') sys.stdout.flush()Create a user account on both the collector and analyzer machines, in this example the user is pp. Next copy the script to both machines.
If you log into the collector machine, following command will send sFlow to the analyzer machine:
./sflow_fwd.py | ssh pp@analyzer './sflow_fwd.py -s 127.0.0.1'If you log into the analyzer machine, the following command will retrieve sFlow from the collector machine:
ssh pp@collector './sflow_fwd.py' | ./sflow_fwd.py -s 127.0.0.1If a permanent connection is required, it is relatively straightforward to create a daemon using systemd. In this example, the service is being installed on the collector machine by performing the following steps:
First log into the collector generate an ssh key:
ssh-keygenNext, install the key on the analyzer system:
ssh-copy-id pp@analyzerNow create the systemd service file, /etc/systemd/system/sflow-tunnel.service:
[Unit] Description=sFlow tunnel After=network.target [Service] Type=simple User=pp ExecStart=/bin/sh -c "/home/pp/sflow_fwd.py | /usr/bin/ssh pp@analyzer './sflow_fwd.py -s 127.0.0.1'" Restart=on-failure RestartSec=30 [Install] WantedBy=multi-user.targetFinally, use the systemctl command to enable and start the daemon:
sudo systemctl enable sflow-tunnel.service sudo systemctl start sflow-tunnel.serviceA simple way to confirm that sFlow is arriving on the analyzer machine is to use sflowtool.
There are numerous articles on this blog describing how the sFlow-RT analytics software can be used to integrate sFlow telemetry with popular metrics and SIEM (security information and event management) tools.