![我需要向 iptables 添加哪些 INPUT 规则以便 apt(apt-get、aptitude)可以工作(更新、升级、搜索、安装)?](https://linux22.com/image/811746/%E6%88%91%E9%9C%80%E8%A6%81%E5%90%91%20iptables%20%E6%B7%BB%E5%8A%A0%E5%93%AA%E4%BA%9B%20INPUT%20%E8%A7%84%E5%88%99%E4%BB%A5%E4%BE%BF%20apt%EF%BC%88apt-get%E3%80%81aptitude%EF%BC%89%E5%8F%AF%E4%BB%A5%E5%B7%A5%E4%BD%9C%EF%BC%88%E6%9B%B4%E6%96%B0%E3%80%81%E5%8D%87%E7%BA%A7%E3%80%81%E6%90%9C%E7%B4%A2%E3%80%81%E5%AE%89%E8%A3%85%EF%BC%89%EF%BC%9F.png)
我需要使用 aptitude 来更新和安装软件,但失败了。它说...
0% [Connecting to archive.ubuntu.com]
...然后停止。我需要输入内容CTRL-C
才能退出。我正在使用 Ubuntu Server 10.04 LTS (Lucid Lynx)。
发生这种情况是因为我的iptables规则。如果我恢复iptables恢复其默认设置(通过删除规则并将策略设置为“接受”),然后资质按预期工作。不再有错误。
但是,嘿,我想用我的iptables规则......我只需要知道:我到底需要保持什么开放才能易于工作?
我的规则很简单。OUTPUT 策略是 ACCEPT。FORWARD 策略是 ACCEPT。我没有 OUTPUT 和 FORWARD 的规则。INPUT 策略是 DROP。所以,问题出在输入链!我有 11 条 INPUT 规则来打开运行 FTP、SSH、HTTP 等服务所需的特定 TCP 端口。一条附加规则用于接受 ICMP(ping),另一条规则用于接受所有本地主机输入。这就是全部:
iptables -F
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 587 -j ACCEPT
iptables -A INPUT -p tcp --dport 995 -j ACCEPT
iptables -A INPUT -p tcp --dport 1008 -j ACCEPT
iptables -A INPUT -p tcp --dport 2812 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 8000 -j ACCEPT
iptables -P INPUT DROP
我尝试了很多规则试图让资质工作。当然,简单就iptables -P INPUT ACCEPT
可以让它工作,但我不想接受一切。我只想打开 aptitude 完成其工作所需的内容。
INPUT 链是个问题,这听起来很奇怪......但事实确实如此。
另一个问题是我无法访问 iptables 日志...我刚刚发现我正在使用的内核中有一个错误(请参阅https://serverfault.com/questions/159818/iptables-logging-not-working)...所以,不要问我日志内容,因为我无法获得它们。
谢谢你!
答案1
当您向另一台服务器发送 HTTP 请求时,您使用的是 TCP。首先,SYN 数据包从随机高端口发送到另一台服务器,然后您将收到 ACK 响应。最后,您向服务器发送 SYN/ACK,服务器会使用请求的文档(以多个数据包的形式)进行响应。您的规则不允许接收 ACK 数据包,因此无法建立连接。添加如下规则:
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
您无法免费获得 iptables 日志。您的规则应如下所示:
# if no rule matched, the input should be dropped
-P INPUT DROP
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# etc
# the limit prevents your logs from being flooded if there are a lot packets being captured
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied" --log-level debug
请注意,我iptables
在命令前省略了,我建议使用iptables-restore
(或iptables-apply
进行测试),以避免在规则应用失败时将自己锁定。要传递给命令的文件如下所示:
*FILTER
# your rules here, for example:
-P INPUT DROP
-P INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
COMMIT
COMMIT
行后必须有一个换行符。
默认情况下,条目转到/var/log/kern.log
。如果您想区分内核和 iptables 消息,那么这样做并不好,因此请为 rsyslog 创建一个/etc/rsyslog.d/iptables.conf
包含以下内容的过滤器:
:msg,contains,"iptables denied" /var/log/iptables.log
& ~
这将过滤 iptables 错误并将其发送至/var/log/iptables.log
。
答案2
在 Ubuntu 18 中,apt 更新直到我允许环回(使用)才起作用-i lo ACCEPT
。因此,我的“安全规则”列表是
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -j REJECT