我尝试使用 阻止所有流量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
任何状态,就会触发该事件。这可能是因为状态表内存不足,或者可能是因为攻击者试图绕过您的防火墙。您可能想要记录一些内容并丢弃数据包。