I'm writing a script that will check/open ports/protocols in the event any are blocked. What I have so far is below. The port/protocol names look strange to me. I would have expected IP addresses, but I've never done this before. Would the host be IP address of the DSLAM? Also, can I run nc without specifying host if it's the current machine? Otherwise, does this script do what is needed?
#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
echo -e "############################nnnPresent ports opened on this machine are
$(iptables -nL INPUT | grep ACCEPT | grep dpt)
nCompleted listing...nnn#########################"
#these look funny to me
PORTS=( 123 161 69 "UDP" 80 443 22 8443 8080 23 25 3307 "TCP" "HTTPS" "SNMP" "SFTP" "TFTP")
#modified ip's for public sharing
HOSTS=( "10.x.x.x" "10.x.x.x" "10.x.x.x" "10.x.x.x" "10.x.x.x")
for HOST in "${HOSTS[@]}"
  do
    for PORT in "${PORTS[@]}"
      do
        #see which ones need opening...0 is pass (open), 1 fail, 5 timeout; need host still
        #alternatively try nmap
        nc -z -v -w5 ${HOST} ${PORT}
        #if it's not open, then open it
        if [ "$?" ne 0 ]; then #shellcheck err this line: Couldn't parse this test expression.
          iptables -A INPUT -m tcp -p tcp --dport "$PORT" -j ACCEPT && 
          { service iptables save;
          service iptables restart; 
          echo -e "Ports opened through iptables are n$(iptables -nL INPUT | grep ACCEPT | grep dpt)"; }
        else
          echo "Port $PORT already open"
        fi
    done
done
I've been referring to test if port is open, and also open port.
 
    