![如何解决阻止我的服务器访问互联网的 iptables 规则?](https://linux22.com/image/787465/%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E9%98%BB%E6%AD%A2%E6%88%91%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BF%E9%97%AE%E4%BA%92%E8%81%94%E7%BD%91%E7%9A%84%20iptables%20%E8%A7%84%E5%88%99%EF%BC%9F.png)
所以我遇到了一个奇怪的问题,无法理解。希望有人能帮我理解。我的 iptable 规则设置如下
root@COV0495:~# iptables -S
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-N ufw-after-forward
-N ufw-after-input
-N ufw-after-logging-forward
-N ufw-after-logging-input
-N ufw-after-logging-output
-N ufw-after-output
-N ufw-before-forward
-N ufw-before-input
-N ufw-before-logging-forward
-N ufw-before-logging-input
-N ufw-before-logging-output
-N ufw-before-output
-N ufw-reject-forward
-N ufw-reject-input
-N ufw-reject-output
-N ufw-track-forward
-N ufw-track-input
-N ufw-track-output
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.*.*.*/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.*.*.*/32 -p tcp -m tcp --dport 8443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -j LOG
-A FORWARD -j LOG
虽然我可以通过互联网访问服务器上托管的网站,但我无法从服务器内部访问互联网上的任何内容。以下是 ping 请求输出示例:
root@COV0495:~# ping bing.com
ping: bing.com: Temporary failure in name resolution`
现在我注意到,如果我将第一条规则更改为,-P INPUT ACCEPT
那么我就能再次从服务器内部访问互联网上的资源。
然而我感到困惑的是为什么这会-P INPUT DROP
影响服务器出去的流量?
我尝试使用类似这样的规则启用 DNS 入站请求
-A INPUT -p udp -m udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
但它仍然不起作用。
答案1
规则集中的默认 DROP 策略会影响回复:您的查询已完成,回复已从远程发送回您的服务器,然后您的服务器丢弃了此回复。最终结果:无回复意味着无连接。
您最后一次尝试:
-A INPUT -p udp -m udp --sport 53 -m state --state ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
应该已经使 DNS 部分工作了。下一步是:尝试连接到已解析的资源。但这次尝试再次失败,原因相同:回复被丢弃。
你缺少了通用的有状态规则,它应该是规则集中的第一个规则:
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
它将允许回复主机本身发送的任何查询,包括相关错误(通常以 ICMP 形式接收),因为此类查询被 Netfilter 记住连接跟踪用于状态操作的设施(以及相关的 NAT)。
如果稍后添加 REJECT 规则,则应该接着:
-A INPUT -m conntrack --ctstate INVALID -j DROP
(这里不需要)。
要使其立即生效,只需以 root 身份运行,-I
并使用以下-A
命令:
iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
请注意,Docker 的容器不受影响,因为进出 Docker 容器的所有内容都经过路由(由于 NAT),因此遍历 filter/FORWARD 而不是 filter/INPUT。当依赖主机的服务(可能是 DNS 解析)时,它们可能仍会受到影响。