iptables-block-all-inbound-and-outbound 除了 dns(端口 53)、teamviewer 端口(5938)和我的服务器 IP(端口 80)

iptables-block-all-inbound-and-outbound 除了 dns(端口 53)、teamviewer 端口(5938)和我的服务器 IP(端口 80)

我尝试使用 阻止所有流量iptables,但有一些例外:

  • 域名系统
  • 我自己的服务器(我只使用端口 80)
  • Teamviewer(端口 5938)
  • 端口 5555 以允许 adb 连接

目前我有这些代码行,但它没有按照我的需要工作:

// Allow my own server - this seems to work
iptables -A INPUT -s 1.1.1.1 -j ACCEPT
iptables -A OUTPUT -d 1.1.1.1 -j ACCEPT

// Allow DNS requests - dont know if it´s correct
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

// Allow Teamviewer - same as above - dont know if it´s correct
iptables -A INPUT -p tcp --dport 5938 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 5938 -j ACCEPT
iptables -A OUTPUT -p udp --dport 5938 -j ACCEPT
iptables -A INPUT -p udp --dport 5938 -j ACCEPT

// Allow ADB - same as above - dont know if it´s correct
iptables -A INPUT -p tcp --dport 5555 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 5555 -j ACCEPT
iptables -A OUTPUT -p udp --dport 5555 -j ACCEPT
iptables -A INPUT -p udp --dport 5555 -j ACCEPT

// Block all other requests
iptables -P INPUT DROP
iptables -P OUTPUT DROP

Teamviewer 无法连接,名称解析也无法正常工作,adb 也无法连接。那里有问题,不知道到底是什么。如果我对位于 的域进行硬编码,唯一有效的是与我自己的服务器的连接/etc/hosts

这里的一位iptables大师可以帮助我吗?

答案1

什么不起作用?实际上,如果我是对的,第一个 iptable 条目将允许所有流量 tcp/udp。所以其他 ACE 也不会命中。如果您只需要 HTTP 流量,则应仅允许 TCP 端口 80。

IPtables 是自上而下工作的。您的服务器获得 IP 地址 1.1.1.1,所有数据包的来源将是 1.1.1.1。否则,所有传入流量都会获得源 xxxx 和目标 1.1.1.1,因此您的前两个条目将匹配所有流量。根据您的需要,您应该在没有前两条规则的情况下配置它。 DNS 流量将被允许:

iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53 -j ACCEPT

您应该设置服务器的 HTTP / HTTPS 流量:

iptables -A OUTPUT -p tcp --sport 1024:65535 -m multiport --dports 80,443 -j ACCEPT

Teamviewer 优先通过 5938 获取 TCP 连接,因此它应该如下所示:

iptables -A OUTPUT -o eth0 -p tcp --dport 5938 -m state --state NEW -j ACCEPT

对于 ADB 我不确定,因为从未接触过它。但如果它是一个 TCP 流,你应该这样做:

iptables -A OUTPUT -p tcp --dport 5555 -j ACCEPT

答案2

您正确地允许出站流量,但您阻止了回复数据包,因为您混淆了源端口与目标端口。

当您连接到远程系统上的服务时,您通常会打开一个带有该服务的目标端口的套接字,而源端口未定义,这意味着内核将为您随机分配一个源端口。然后,来自远程服务的答案将在网络数据包中发回,该网络数据包将您的源端口作为目标端口,并将您的目标端口作为源端口。但是,您的规则也使用服务目标端口作为返回流量的目标端口,这与实际流量不匹配,因此不起作用。

虽然理论上您可以用来--sport匹配返回流量的源端口,但我不建议这样做。这样做将允许任何人将流量发送到您服务器上的任何服务,只要他们确保使用端口 53 作为源端口(或您打开的任何其他服务)。

相反,我建议您使用连接跟踪模块:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

解释:

  • -m conntrack:告诉 iptables 加载conntrack模块,该模块跟踪已知连接的状态
  • --ctstate RELATED,ESTABLISHED:仅匹配作为已知网络连接的一部分发送的数据包 ( ESTABLISHED)或者创建一个新的但预期的连接 ( RELATED)。 RELATED 对于像 FTP 这样使用多个网络连接的东西很有用;我认为它与您正在使用的协议无关,所以如果您愿意,您可以放弃它(但我也不是 100% 确定,所以......)

添加此规则后,您只需担心为初始连接添加规则:

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 5938 -j ACCEPT

(对您想要允许的所有协议重复此操作)

conntrack请注意,如果您想阻止传出流量,也可以在 OUTPUT 链上使用。

最后,请注意,还有一个 INVALID 状态可供您匹配。当一个数据包到达时,该数据包声称是网络连接的一部分,但找不到iptables任何状态,就会触发该事件。这可能是因为状态表内存不足,或者可能是因为攻击者试图绕过您的防火墙。您可能想要记录一些内容并丢弃数据包。

相关内容