通过 Internet 进行 ssh 的 iptable 规则

通过 Internet 进行 ssh 的 iptable 规则

我有一台服务器abc.example.com和一个远程桌面zzz.example.com。我通过自定义端口(例如 6789)使用 SSH。只要我的防火墙关闭,我就能够成功连接到服务器。但是,一旦我启动防火墙,就徒劳无功了。

此外,出于安全原因,我只想允许abc.example.com和之间进行 ssh 会话。zzz.example.com

这是我添加到服务器上的 iptables 中的规则,

iptables -A INPUT -s zzz.example.com -m state --state NEW,ESTABLISHED -p tcp --dport 6789 -j ACCEPT

答案1

如果您缺少启用来自ESTABLISHED连接的流量的规则,那么您将需要一条允许从主机到远程系统的流量的规则。通常有这样的第一条规则:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

然后您可以使用如下规则启用访问:

iptables -A INPUT -s zzz.example.com -p tcp --dport 6789 -j ACCEPT

或者,您可以使用防火墙构建器,例如shorewall并启用port knocking在需要时打开端口几秒钟。

如果您的 ssh 守护程序支持tcp_wrapers,那么您可以限制/etc/hosts.allow/etc/hosts.deny文件的访问。即使您已经修复了防火墙,您也可能希望考虑使用此功能在建立远程连接时通知您。以下规则会阻止多个国家/地区的域名,并在每次成功时发送一封电子邮件

sshd :          ALL \
            EXCEPT .ar .au .br .by .cl .co .cz .do .eg .gt \
                .id .il .in .jp .ma .mx .nl .pe .pk .pl .pt \
                .ro .rs .ru .sa .sg .tr .tw .ua .vn .za \
                .ae .at .bg .gh .hr .hu .ke .kz .lt .md \
                .my .no .sk .uy .ve : \
            spawn (/bin/echo "SSH connection to %N from %n[%a] allowed" | \
                /usr/bin/mailx -s "SSH Allowed" [email protected])

编辑:在规则中使用域名不是一个好主意:

  • 加载规则后,DNS 查找可能不可用。 (此时名称会转换为 IP 地址。)
  • 没有静态 IP 地址的客户端可能会获得新地址,但由于 DNS 缓存而无法使用这些新地址。旧 IP 地址可能仍具有访问权限,而新地址则无访问权限。具有本地主机条目的静态 IP 地址工作相当可靠。

如果您有动态地址,请从相对较大的 IP 地址范围进行安全访问,或使用端口碰撞。您可以使用fail2ban或类似的程序来锁定正在探测您的 ssh 服务的地址。 tcpwrappers可以像上面一样使用来限制可以连接的地址,并添加额外的日志记录。如果您不经常连接,您可能需要记录成功和不成功的尝试。

相关内容