Configuring the Firewall for Remote SSH Administration
You want to SSH into your firewall to do remote administration. You might want to log in from over the Internet, or you might want to restrict SSH to LAN access only. You also want the option of restricting access to certain specific source IP addresses.
There are several ways to handle this. SSH has a number of access and authentication controls, so you should configure those first. Then, configure iptables to add another layer of access controls.
To restrict SSH access to LAN hosts only, add this rule:
$ipt -A INPUT -i $LAN_IFACE -p tcp -s 192.168.1.0/24 --dport 22 --sport \ 1024:65535 -m state --state NEW -j ACCEPT
Of course, you must use your own LAN address and SSH port. To allow SSH logins via the WAN interface, use this rule:
$ipt -A INPUT -p tcp -i $WAN_IFACE --dport 22 --sport 1024:65535 \ -m state --state NEW -j ACCEPT
This rule accepts SSH logins on all interfaces:
$ipt -A INPUT -p tcp --dport 22 --sport 1024:65535 -m state --state NEW -j ACCEPT
Or, you may restrict SSH logins to a specific source IP address:
$ipt -A INPUT -p tcp -s 12.34.56.78 --dport 22 --sport 1024:65535 \ -m state --state NEW -j ACCEPT
If there are additional source IP addresses you wish to allow, each one needs its own separate rule.
Let's take a look at what these rules do:
-A INPUT -p tcp ! --syn -mstate --state NEW-j DROP
A subtle iptables gotcha is that the NEW state will allow TCP packets through that do not have the SYN flag set, so we must make sure that only SYN-flagged packets are allowed. SYN is always the first step in initiating a new TCP session, so if it isn't present, we don't want to accept the packet.
-A INPUT -i $LAN_IFACE -p tcp -s 192.168.1.0/24 --dport 22 --sport 1024:65535 -m
state --state NEW -j ACCEPT
This accepts new SSH (TCP port 22) connections coming in on the LAN interface and from the local subnet only, from high-numbered ports. Anything originating from a privileged port is suspect.
-A INPUT -p tcp -i $WAN_IFACE -p tcp --dport 22--sport 1024:65535 -mstate --state NEW -j ACCEPT
This rule allows connections coming in on the WAN interface only, so LAN access is not allowed.
-A INPUT -p tcp --dport 22 --sport 1024:65535 -m state --state NEW -j ACCEPT
This rule accepts all new SSH connections from any host anywhere. Again, the new connection must come from an unprivileged port.
-A INPUT -p tcp -i $WAN_IFACE -s 12.34.56.78 --dport 22 --sport 1024:65535 -mstate
--state NEW -j ACCEPT
This rule accepts incoming SSH on the WAN interface only, from the named IP address; all others are dropped.
You don't need to add the RELATED,ESTABLISHED states to the rules because there already is a global rule for this.
In this tutorial:
- Building a Linux Firewall
- Iptables and NAT, SNAT, and DNAT
- iptables
- Assembling a Linux Firewall Box
- Configuring Network Interface Cards on Debian
- Configuring Network Interface Cards on Fedora
- Identifying Which NIC Is Which
- Building an Internet-Connection Sharing Firewall on a Dynamic WAN IP Address
- Building an Internet-Connection Sharing Firewall on a Static WAN IP Address
- Displaying the Status of Your Firewall
- Turning an iptables Firewall Off
- Starting iptables at Boot, and Manually Bringing Your Firewall Up and Down
- Testing Your Firewall
- Configuring the Firewall for Remote SSH Administration
- Allowing Remote SSH Through a NAT Firewall
- Multiple SSH Host Keys Past NAT
- Running Public Services on Private IP Addresses
- Setting Up a Single-Host Firewall
- Setting Up a Server Firewall
- Configuring iptables Logging
- Writing Egress Rules