我有一台服务器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
可以像上面一样使用来限制可以连接的地址,并添加额外的日志记录。如果您不经常连接,您可能需要记录成功和不成功的尝试。