我的 ubuntu 服务器不允许回送 wget

我的 ubuntu 服务器不允许回送 wget

我的 Ubuntu Server 14.04 上有以下规则:

#!/bin/sh
# Flushing all rules
iptables -F
iptables -X

# Setting default filter policy
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Allow unlimited traffic on loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow incoming SSH
iptables -A INPUT -p tcp --sport 513:65535 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 --dport 513:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Forward 80 to 8080
iptables -I INPUT -m mark --mark 1 -j DROP
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination SERVER_IP:8080
iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j MARK --set-mark 1

iptables -A INPUT -p tcp --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 8080 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow DNS lookup
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT

我无法做一个简单的事情(连接被拒绝):

wget http://www.example.com

或(连接被拒绝):

wget http://localhost/

甚至(保持空闲状态):

wget http://localhost:8080

我该如何修复我的配置才能做到这一点?

谢谢!

答案1

其中一些操作不必要地复杂(特别是,如果您有一个公共 Web 服务器显然位于端口 80 上,如果它实际上监听端口 8080,那么试图阻止它通过端口 8080 被访问是没有意义的);此外,您只是在filter开始时刷新表。(另请注意,-m state已弃用;较新的 iptables 更喜欢-m conntrack --ctstate。)

尝试这个:

#!/bin/sh
# Flush all rules
for table in nat filter mangle; do
    iptables -F -t $table
    iptables -X -t $table
done

# Set default filter policy
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Allow unlimited traffic on loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow reply packets
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow incoming SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# DNAT 80 to 8080
iptables -t nat -A PREROUTING -i eth0 -p tcp -d SERVER_IP --dport 80 -j DNAT --to-destination SERVER_IP:8080
iptables -t nat -A OUTPUT -p tcp -d SERVER_IP --dport 80 -j DNAT --to-destination SERVER_IP:8080
iptables -t nat -A OUTPUT -p tcp -d localhost --dport 80 -j DNAT --to-destination SERVER_IP:8080

iptables -A INPUT -p tcp --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# Allow DNS lookup
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# ICMP is needed for pmtu discovery (could be more selective here, perhaps apply ratelimit):
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT

# Log dropped packets for debugging, with a ratelimit
iptables -A INPUT -m limit --limit 5/minute -j LOG --log-prefix "FW: INPUT DROP: "
iptables -A OUTPUT -m limit --limit 5/minute -j LOG --log-prefix "FW: OUTPUT DROP: "

# flush conntrack table to make sure new rules are applied to existing connections (at the cost of interrupting them):
conntrack -F

如果没有其他事情,最后的日志记录应该有助于确定您不应该丢弃哪些数据包。

答案2

检查您的 Web 服务器是否正在监听环回端口:lsof -Pni:8080应显示至少一个监听套接字,该套接字应绑定到 IPv4 *:8080、IPv6 *:8080 或某些特定接口集,例如 127.0.0.1:8080 和 SERVER_IP:8080

连接被拒绝通常意味着没有任何内容监听该端口,因此请检查 Web 服务器是否实际正在运行并监听该接口。

还要记住,您的规则集仅对进入 eth1 的流量执行 DNAT,因此请确保从机器外部进行测试。

从本地主机,您应该能够执行curl -I http://127.0.0.1:8080/或类似操作。请注意,localhost并非127.0.0.1在所有系统上都会给您,但通常会先给您::1,因此127.0.0.1在测试时请使用。

相关内容