Linux 上依赖于 IP 的本地端口转发

Linux 上依赖于 IP 的本地端口转发

我已将服务器的 sshd 配置为监听非标准端口 42。

但是,在工作时,我处于防火墙/代理后面,仅允许向外连接到端口 21、22、80 和 443。因此,我无法从工作中 ssh 到我的服务器,这很糟糕。我不想将 sshd 返回到端口 22。

想法是这样的:在我的服务器上,本地将端口 22 转发到端口 42如果源 IP 与我工作网络的外部 IP 匹配。为清楚起见,我们假设我的服务器 IP 为 169.1.1.1(在 eth1 上),我的工作外部 IP 为 169.250.250.250。对于所有不同于 169.250.250.250 的 IP,我的服务器应该响应预期的“连接被拒绝”,就像它对非监听端口所做的那样。

我对 iptables 很陌生。我简要浏览了冗长的 iptables 手册和以下相关/相关问题:

但是,这些问题涉及更复杂的多主机场景,我不清楚应该使用哪些表和链进行本地端口转发,以及是否应该有 2 条规则(针对“问题”和“答案”数据包),或者只有 1 条针对“问题”数据包的规则。

到目前为止,我只通过 sysctl 启用了转发。明天我将开始测试解决方案,并希望得到一些指导或具体案例来实现我的简单场景。

下面的方案草案正确吗?

iptables -A INPUT [-m state] [-i eth1] --source 169.250.250.250 -p tcp
    --destination 169.1.1.1:42 --dport 22 --state NEW,ESTABLISHED,RELATED
    -j ACCEPT

我应该用mangle表代替filter? 和/或FORWARD用链代替INPUT?

答案1

要转发/重定向内容,您必须编辑 NAT 表。

这样的规则可能最接近您的需要。

/sbin/iptables --table nat --append PREROUTING --protocol tcp \
               --source 169.250.250.250 --dport 22 \
               --jump REDIRECT --to-ports 42

让 SSH 留在标准端口上并妥善保护它会更加简单,而且可能更好。使用备用端口只会减慢有动机的攻击者几秒钟的速度。设置像denyhosts/fail2ban这样的入侵防御系统并禁用基于密码的身份验证。或者考虑限制传入 ssh 连接的速率。

看:

答案2

我会使用 Shorewall 来管理 ip 表。它设置了一个不错的基础防火墙,做你想做的事情很简单。向 /etc/shorewall/rules 添加一条规则,例如:

DNAT 网络:169.250.250.250 位置:169.250.250.250 tcp 42 22

与其他人一样,我不确定你为什么在另一个端口上运行 sshd。如果这是一个互联网端口,你可能需要查看端口敲击以保持端口关闭,除非你先访问另一个端口。Shorewall 可以简单地处理这个问题。

相关内容