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

我已经configuration我的服务器的sshd在非标准端口42上侦听。

然而,在工作中,我在防火墙/代理的后面,它只允许传出连接到端口21,22,80和443.因此,我不能ssh到我的服务器工作,这是不好的。 我不想把sshd返回到22号港口。

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

我对iptables很新。 我简要地浏览了长长的iptables手册和这些相关/相关的问题:

  • iptables问题:将端口x转发到networking上不同机器的ssh端口
  • 我该如何使用iptables进行端口转发

然而,这些问题涉及到更复杂的几个主机场景,我不清楚哪些表和链我应该用于本地端口转发,如果我应该有2个规则(“问题”和“答案”数据包)或“问题”数据包只有1个规则。

到目前为止,我只通过sysctl启用转发。 我将在明天开始testing解决scheme,并将欣赏指针或者实现我的简单场景的具体案例。

下面的草案解决scheme是否正确?

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

要转发/redirect,必须编辑NAT表。

像这样的规则可能最接近你所需要的。

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

将SSH保留在标准端口并妥善保护它会更容易,也许更好。 使用一个备用端口只会使一个有动机的攻击者减速几秒钟。 设置入侵防护系统,如denyhosts / fail2ban,禁用基于密码的authentication。 或考虑速率限制传入的SSH连接。

看到:

  • 数百个失败的sshlogin
  • 在Linux Ubuntu上保护SSH

我会使用Shorewall来pipe理IP表。 它build立了一个体面的基础防火墙,做你喜欢的事情很简单。 将规则添加到/ etc / shorewall /规则中,如:

DNAT净值:169.250.250.250 loc:169.250.250.250 tcp 42 22

像其他人一样,我不确定你为什么在另一个端口上运行sshd。 如果这是一个互联网端口,你可能想看看端口敲门,以保持端口closures,除非你先打另一个端口。 Shorewall处理这个简单。