1

I am running a Debian server that hosts several Docker containers but also works as my router and internet gateway. I am having trouble getting SSH access from outside (specific ipaddresses) working on the host (not in the docker containers. All access to Docker containers works just fine.

I can see with an nmap from the inside of my network to the local IP and my external IP that the port is open although it seems to be open just by enabling ssh on that port. So if I set the SSH port in the sshd_config to be 5501 and restart the ssh daemon, an nmap to that port shows the port is open, if I change the port to 22 it shows that port is open although I haven't changed anything in my iptables script, so my worries besides not being able to reach the server from sepcific external IP's is that the script is to openly configured.

An iptables -L -a command doesn't list the port for SSH (5501), although it lists all other ports in the script. Is it because I don't have a table for the rules for the host itself? Searching around stackoverflow for similar questions dosen't seem to be requiring a table?

Below is my complete IP tables script.

PATH=/usr/sbin:/sbin:/usr/bin:/bin
#!/bin/sh
##################################################################################################
# General variables for this script                                                              #
##################################################################################################
SERVER_IP="192.168.0.1"
A="xxx.xxx.xxx.xxx"
B="xxx.xxx.xxx.xxx"
C="xxx.xxx.xxx.xxx"
D="xxx.xxx.xxx.xxx"
E="xxx.xxx.xxx.xxx"
InternalNet="192.168.0.1-192.168.0.100"

##################################################################################################
# Docker stop                                                                                    #
##################################################################################################
service docker stop

##################################################################################################
# Flushing all rules                                                                             #
##################################################################################################
iptables -F
iptables -X

##################################################################################################
# Setting default filter policy                                                                  #
##################################################################################################
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

##################################################################################################
# Allow unlimited traffic on loopback                                                            #
##################################################################################################
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

##################################################################################################
# Allow unlimited traffic to eth1 (homeserver internal)                                          #
##################################################################################################
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT

##################################################################################################
# Allow all traffic form internal to all outbound                                                #
# And all related and established traffic from the internet                                      #
##################################################################################################
iptables -A OUTPUT -o eth0 -j ACCEPT 
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

##################################################################################################
# Start Docker                                                                                   #
##################################################################################################
service docker start

##################################################################################################
# Create a PRE_DOCKER table                                                                      #
##################################################################################################
iptables -N PRE_DOCKER

##################################################################################################
# Insert this as the first table on the FORWARD chain.                                           #
##################################################################################################
iptables -I FORWARD -o docker0 -j PRE_DOCKER

#################################################################################################
# Docker internal use                                                                            #
##################################################################################################
iptables -A PRE_DOCKER -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A PRE_DOCKER -i docker0 ! -o docker0 -j ACCEPT
iptables -A PRE_DOCKER -m state --state RELATED -j ACCEPT
iptables -A PRE_DOCKER -i docker0 -o docker0 -j ACCEPT

##################################################################################################
#  Allow specific trafic from specific ips                                                       #
##################################################################################################
iptables -I PRE_DOCKER -p tcp -s $A,$B,$C,$D,$E -d $SERVER_IP --dport 19999 -m state --state NEW,ESTABLISHED -j ACCEPT #Netdata
iptables -I PRE_DOCKER -p tcp -s $SERVER_IP -d A,$B,$C,$D,$E t --sport 19999 -m state --state ESTABLISHED -j ACCEPT #Netdata

iptables -I PRE_DOCKER -p tcp -s A,$B,$C,$D,$E -d $SERVER_IP --dport 8080 -m state --state NEW,ESTABLISHED -j ACCEPT #Tomcat
iptables -I PRE_DOCKER -p tcp -s $SERVER_IP -d A,$B,$C,$D,$E --sport 8080 -m state --state ESTABLISHED -j ACCEPT #Tomcat

iptables -I PRE_DOCKER -p tcp -s A,$B,$C,$D,$E -d $SERVER_IP --dport 8081 -m state --state NEW,ESTABLISHED -j ACCEPT #Phabricator
iptables -I PRE_DOCKER -p tcp -s $SERVER_IP -d A,$B,$C,$D,$E --sport 8081 -m state --state ESTABLISHED -j ACCEPT #Phabricator
##################################################################################################
# Allow access from internet                                                                     #
##################################################################################################

#HTTPS(443) from internet to docker apache
iptables -A INPUT -p tcp -d $SERVER_IP --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s $SERVER_IP --sport 443 -m state --state ESTABLISHED -j ACCEPT

iptables -I PRE_DOCKER -p tcp -d $SERVER_IP --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT #Apache
iptables -I PRE_DOCKER -p tcp -s $SERVER_IP --sport 443 -m state --state ESTABLISHED -j ACCEPT #Apache

##################################################################################################
# Allow specific traffic from specific ips to homeserver                                         #
##################################################################################################

#SSH(on port 5501) from known IPs
iptables -A INPUT -p tcp -s A,$B,$C,$D,$E -d $SERVER_IP --dport 5501 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s $SERVER_IP -d A,$B,$C,$D,$E --sport 5501 -m state --state RELATED,ESTABLISHED -j ACCEPT

#Netdata(on port 19999) from known IPS
iptables -A INPUT -p tcp -s A,$B,$C,$D,$E -d $SERVER_IP --dport 19999 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s $SERVER_IP -d A,$B,$C,$D,$E --sport 19999 -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -t nat -A PREROUTING -i eth1 -d $SERVER_IP -p tcp --dport 5501 -j  DNAT --to-destination 192.168.0.1:5501
  • Enable logging thegeekstuff.com/2012/08/iptables-log-packets and that should help you understand where are the packets going to – Purefan Jun 14 '16 at 6:47
  • Thanks, what helped me alot, I godt it working. I mistakenly used 192.168.0.1 as destination for the ssh instead of the public ip address. The docker containers worked fine with the local ip though, maybe because of NAT? – Tony Jun 14 '16 at 18:28
  • If you put an answer I will mark it as a solution. – Tony Jun 14 '16 at 18:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.