====== Ubuntu - iptables - Basic commands ====== ===== Install iptables. ===== sudo apt-get install iptables ---- ===== Policy Chain Default Behavior. ===== iptables --policy INPUT DROP iptables --policy OUTPUT DROP iptables --policy FORWARD DROP ---- ===== Accept all traffic on your loopback interface. ===== iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT ---- ===== Allow Established and Related Incoming Connections. ===== iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT ---- ===== Allow Established Outgoing Connections ===== iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT ---- ===== Allow Internal to External ===== iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT ---- ===== Drop Invalid Packets ===== iptables -A INPUT -m conntrack --ctstate INVALID -j DROP ---- ===== Block all connections from the IP address 10.10.10.10. ===== iptables -A INPUT -s 10.10.10.10 -j DROP ---- ===== Block all of the IP addresses in the 10.10.10.0/24 network range. ===== iptables -A INPUT -s 10.10.10.0/24 -j DROP or iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP ---- ===== Block Connections to a Network Interface ===== iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP ---- ===== Allow All Incoming SSH ===== iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow Incoming SSH from Specific IP address or subnet ===== iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Block SSH connections from 10.10.10.10. ===== iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP ---- ===== Block SSH connections from any IP address. ===== iptables -A INPUT -p tcp --dport ssh -j DROP ---- ===== Allow Outgoing SSH ===== iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow Incoming Rsync from Specific IP Address or Subnet ===== iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow All Incoming HTTP ===== iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow All Incoming HTTPS ===== iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow All Incoming HTTP and HTTPS ===== iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow MySQL from Specific IP Address or Subnet ===== iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow MySQL to Specific Network Interface ===== iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow PostgreSQL from Specific IP Address or Subnet ===== iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow PostgreSQL to Specific Network Interface ===== iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow All Incoming SMTP ===== iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Block Outgoing SMTP Mail ===== iptables -A OUTPUT -p tcp --dport 25 -j REJECT ---- ===== Allow All Incoming IMAP ===== iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow All Incoming IMAPS ===== iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow All Incoming POP3 ===== iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow All Incoming POP3S ===== iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT ---- ===== Allow Forwarding ===== iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT ---- ===== Adding the NAT Rules to Direct Packets Correctly ===== iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15 ---- ===== References ===== https://www.digitalocean.com/community/tutorials/how-to-forward-ports-through-a-linux-gateway-with-iptables