Port Knocking
Tom
Eastep
2005-06-26
2005
Thomas M. Eastep
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License, Version
1.2 or any later version published by the Free Software Foundation; with
no Invariant Sections, with no Front-Cover, and with no Back-Cover
Texts. A copy of the license is included in the section entitled
GNU Free Documentation
License
.
What is Port Knocking?
Port knocking is a technique whereby attempting to connect to port A
enables access to port B from that same host. For the example on which
this article is based, see http://www.soloport.com/iptables.html
which should be considered to be part of this documentation.
Implementing Port Knocking in Shorewall
In order to implement this solution, your iptables and kernel must
support the 'recent match' extension (see FAQ
42). These instructions also assume Shorewall version 2.2.0 or
later.
In this example:
Attempting to connect to port 1600 enables SSH access. Access is
enabled for 60 seconds.
Attempting to connect to port 1601 disables SSH access (note
that in the article linked above, attempting to connect to port 1599
also disables access. This is an port scan defence as explained in the
article).
To implement that approach:
Add an action named SSHKnock (see the Action documentation). Leave the
action.SSHKnock file empty.
Create /etc/shorewall/SSHKnock with the following
contents:
if [ -n "$LEVEL" ]; then
log_rule_limit $LEVEL $CHAIN SSHKnock ACCEPT "" "$TAG" -A -p tcp --dport 22 -m recent --rcheck --name SSH
log_rule_limit $LEVEL $CHAIN SSHKnock DROP "" "$TAG" -A -p tcp --dport ! 22
fi
run_iptables -A $CHAIN -p tcp --dport 22 -m recent --rcheck --seconds 60 --name SSH -j ACCEPT
run_iptables -A $CHAIN -p tcp --dport 1599 -m recent --name SSH --remove -j DROP
run_iptables -A $CHAIN -p tcp --dport 1600 -m recent --name SSH --set -j DROP
run_iptables -A $CHAIN -p tcp --dport 1601 -m recent --name SSH --remove -j DROP
Now if you want to protect SSH access to the firewall from the
Internet, add this rule in
/etc/shorewall/rules:
#ACTION SOURCE DEST PROTO DEST PORT(S)
SSHKnock net fw tcp 22,1599,1600,1601
If you want to log the DROPs and ACCEPTs done by SSHKnock, you
can just add a log level as in:
#ACTION SOURCE DEST PROTO DEST PORT(S)
SSHKnock:info net fw tcp 22,1599,1600,1601
If you wish to use SSHKnock with a forwarded connection, you
must be using Shorewall 2.3.1 or later for fullest protection. Assume
that you forward port 22 from external IP address 206.124.146.178 to
internal system 192.168.1.5. In /etc/shorewall/rules:
#ACTION SOURCE DEST PROTO DEST PORT(S) SOURCE ORIGINAL
# PORT(S) DEST
DNAT- net loc:192.168.1.5 tcp 22 - 206.124.146.178
SSHKnock net fw tcp 1599,1600,1601
SSHKnock net loc:192.168.1.5 tcp 22 - 206.124.146.178
You can use SSHKnock with DNAT on earlier releases provided
that you omit the ORIGINAL DEST entry on the second SSHKnock rule.
This rule will be quite secure provided that you specify 'norfc1918'
on your external interface.