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

5
我希望将git-daemon通过永久的ssh隧道进行传输。我完成了这个任务。如何阻止任何未经过隧道的远程连接到GIT_DAEMON端口(在我的情况下为9418)?
我已经尝试了iptables中的简单规则(除本地主机外,拒绝一切):
$ 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
2个回答

8

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

git daemon --listen=127.0.0.1

这将使其只能从本地主机连接,并且不需要root权限进行设置。


感谢您的简洁明了。但是@cnicutar正确的隧道建议应该获得“正确答案”标记。 - kravitz

4
你可以尝试以下内容(未经测试):
# 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
@kravitz 我编辑了我的回答。你的隧道设置是否完全正确?使用 iptables 很可能可以做到,耐心点。 - cnicutar
@cnicutar 是的,完全是这样。我还使用了-N选项,以创建一个非交互式会话。我还尝试连接到一个Windows主机,通过plink创建的隧道。除非启用过滤规则,否则OpenSSH和Plink都可以顺利工作。 - kravitz
@kravitz,我在你的问题中看到调谐器并没有按照我说的方式完全创建。应该使用127.0.0.1而不是192.168.1.69 - cnicutar
@cnicutar 不好意思 :) 我尝试了你的建议,它起作用了,非常感谢。另外,你可以编辑你的答案,让这个隧道必须从B端设置,因为对我来说不是很清楚,我最初在A端尝试了一下,但没有得到有趣的东西。而我的一行规则也起作用了 :) - kravitz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接