如何只允许隧道连接到端口?

Posted

技术标签:

【中文标题】如何只允许隧道连接到端口?【英文标题】:How to allow only tunneled connections to port? 【发布时间】:2011-09-13 07:54:17 【问题描述】:

我想让一个 git-daemon 通过一个永久的 ssh 隧道。我完成了这个任务。如何阻止与 GIT_DAEMON 端口(在我的情况下为 9418)的任何远程非隧道连接?

我已经在 iptables 中尝试过简单的规则(阻止除 localhost 之外的所有内容):

$ iptables -A INPUT -p tcp -d ! localhost --destination-port 9418 -j DROP

但它也会阻塞隧道(因为它保存了源 IP 地址)。如果我还有一个防火墙主机,可以通过阻止任何远程连接到该端口来简单地完成,但我需要这台主机来完成这项工作。

隧道是通过以下两种方式之一创建的:

对于 Windows:

plink.exe -N -i <key> -L 127.0.0.1:9418:192.168.1.69:9418 tunnel@192.168.1.69

对于 Linux:

ssh -N -i <key> -L 127.0.0.1:9418:192.168.1.69:9418 tunnel@192.168.1.69

【问题讨论】:

【参考方案1】:

您实际上可以完全不使用 iptables 来实现这一点,只需将git-daemon 绑定到环回接口,例如。

git daemon --listen=127.0.0.1

这将使它只能从 localhost 连接,并且不需要 root 权限来设置。

【讨论】:

谢谢,简洁明了。但是@cnicutar 的正确隧道建议值得“正确答案”标记。【参考方案2】:

你可以试试这个(未经测试):

# accept localhost
iptables -A INPUT -p tcp -d localhost --destination-port 9418 -j ACCEPT

# send everyone else packing
iptables -A INPUT -p tcp --destination-port 9418 -j DROP

使用 iptables -L 表示:

ACCEPT     tcp  --  anywhere             localhost.localdomain tcp dpt:git
DROP       tcp  --  anywhere             anywhere            tcp dpt:git

编辑

这是(可能)应该如何设置隧道:

ssh -N -i <key> -L 127.0.0.1:9418:127.0.0.1:9418 tunnel@192.168.1.69

重要的是后半部分是127.0.0.1 而不是普通IP

【讨论】:

现在已经过测试,但不是很有帮助,它提供了与问题中的规则相同的效果:( @kravitz 你能更好地解释一下流量的路径应该是什么吗? @cnicutar 当然,假设我们有三个主机:A、B、C。主机 A 有一个 git-daemon 正在运行,主机 B 想要与 A 通信(推/拉请求),主机 C 应该'无法在 A 访问 git-daemon。我通过 ssh 隧道模拟身份验证。所以B创建到A的本地隧道(9418端口到9418,在openssh中带有-L选项),这意味着B发送到本地9418端口的所有内容都通过ssh(22端口)并发生在A的9418端口。我需要一个过滤机制,它将阻止与 A:9418 的连接,除了隧道之外的所有内容。 @kravitz 我编辑了我的答案。您是否以那种方式完全设置了隧道? iptables 很有可能做到这一点,请耐心等待。 @cnicutar 是的,绝对是这样。我还提供了 -N 选项,以进行非交互式会话。还尝试使用 plink 制作的带有隧道的 Windows 主机连接。除非我启用过滤规则,否则 OpenSSH 和 Plink 都可以顺利运行。

以上是关于如何只允许隧道连接到端口?的主要内容,如果未能解决你的问题,请参考以下文章

eclipse RSE 可以连接到本地端口(ssh 隧道)吗?

创建隧道以便通过端口 443 访问 https

通过 SSH 端口转发连接到 AWS

使用 SSH 隧道实现端口转发SOCKS 代理

Java如何使服务器允许连接到套接字端口?

ssh隧道代理连接