Iptables 配置以允许 Steam 客户端

Iptables 配置以允许 Steam 客户端

我最近得到并设置了一个小型 Linux(Debian)路由器盒。我将它添加到现有网络中,以创建一个具有特定属性(即互联网内容过滤)的小型子网。我正在劫持 http/https(80/443)流量并将其推送到盒子上运行的过滤服务:

$IPT -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
$IPT -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j REDIRECT --to-port 8080

虽然这可以正常工作(当客户端计算机知道 https 代理时),但我无法让非浏览器应用程序(即 Steam 客户端)工作。它应该使用一系列 TCP 和 UDP 端口。我尝试为 TCP 和 UDP 以及 dport 和 sport 连接制定这些范围的 ACCEPT 规则,但没有成功。

我是不是对路由有什么误解?我假设我不需要转发任何端口,因为我是客户端,占用了他们的端口。我以为我只需要允许端口上的流量,然后它会转发到服务器端点并返回。有人知道如何在 iptables 中允许 Steam 客户端(或所有端口上的所有流量)吗?

第二次编辑(不同的代码):

根据评论,我决定尝试更新我的脚本,删除我尝试的不同行,让它接受所有内容。但是它似乎仍然不起作用,至少对于 Steam 来说是这样。这是我的原始代码,我没有尝试为这个网站清理它,也许我在这样做时错过了什么。

#!/bin/sh
IPT=/sbin/iptables

# Flush all chains, to start with a clean slate.
$IPT -F
$IPT -t nat -F

# Set filter Policies. By default, ACCEPT everything.
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT

# Set server INPUT rules.
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -i eth1 -j ACCEPT
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$IPT -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT

# Attempt to blanket statement accept everything (all ports, essentially)
$IPT -A INPUT -p tcp -m tcp --dport 0:65000 -j ACCEPT
$IPT -A INPUT -p udp -m udp --dport 0:65000 -j ACCEPT
$IPT -A FORWARD -p tcp -m tcp --dport 0:65000 -j ACCEPT
$IPT -A FORWARD -p udp -m udp --dport 0:65000 -j ACCEPT
$IPT -A OUTPUT -p tcp -m tcp --dport 0:65000 -j ACCEPT
$IPT -A OUTPUT -p udp -m udp --dport 0:65000 -j ACCEPT

# Accept minecraft, this is working
$IPT -A INPUT -p tcp -m tcp --dport 25565 -j ACCEPT
$IPT -A OUTPUT -p tcp -m tcp --dport 25565 -j ACCEPT
$IPT -A FORWARD -p tcp -m tcp --dport 25565 -j ACCEPT

# Set router FORWARD rules.
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i eth1 -o eth0 -j ACCEPT

# Masquerade outgoing LAN traffic.
$IPT -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE

$IPT -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
$IPT -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j REDIRECT --to-port 8080

# Port forward minecraft, simple enough
$IPT -t nat -A PREROUTING -i eth0 -p tcp --dport 25565 -j DNAT --to-destination 172.16.1.100

答案1

我能够将 Steam 使用的所有 IP 地址列入白名单。它们可能不适用于您所在的区域(这里的一切都通过 Level 3 的管道),但我会向您展示我是如何做到的。

首先,我有一个从 FORWARD 链调用的自定义链:

# Create chain to filter IP addresses
iptables -N zone_lan_filter

# Filter TCP and UDP traffic
iptables -A FORWARD -p tcp -j zone_lan_filter
iptables -A FORWARD -p udp -j zone_lan_filter

# Reject everything else
iptables -A FORWARD -p tcp -j REJECT
iptables -A FORWARD -p udp -j REJECT

自定义链实际上只是一个巨大的 IP 地址范围:

# When a packet is sent to this chain, accept it if it matches any of the rules below
#
# Addresses in these ranges are registered to Valve Corporation and are used by Steam
iptables -A zone_lan_filter -p tcp -m iprange --dst-range 208.64.200.0-208.64.203.255 -j ACCEPT
iptables -A zone_lan_filter -p udp -m iprange --dst-range 208.64.200.0-208.64.203.255 -j ACCEPT
iptables -A zone_lan_filter -p tcp -m iprange --dst-range 205.196.6.0-205.196.6.255 -j ACCEPT
iptables -A zone_lan_filter -p udp -m iprange --dst-range 205.196.6.0-205.196.6.255 -j ACCEPT

第一组是 Steam 登录时使用的。最终,我们有另一组 IP 地址列表,这些地址属于 Steam 用于下载游戏和补丁的 CDN:

# Addresses in these ranges are registered to Highwinds Network Group and are used by Steam
iptables -A zone_lan_filter -p tcp -m iprange --dst-range 205.185.217.0-205.185.217.255 -j ACCEPT
iptables -A zone_lan_filter -p udp -m iprange --dst-range 205.185.217.0-205.185.217.255 -j ACCEPT
iptables -A zone_lan_filter -p tcp -m iprange --dst-range 205.185.201.0-205.185.201.255 -j ACCEPT
iptables -A zone_lan_filter -p udp -m iprange --dst-range 205.185.201.0-205.185.201.255 -j ACCEPT

接下来,我们得到了我所在地区主要 ISP 的 IP 地址列表。科罗拉多州以外的任何地方,这些地址肯定都不一样:

# Addresses in these ranges are registered to Level 3 Communications and are used by Steam
iptables -A zone_lan_filter -p tcp -m iprange --dst-range 162.97.0.0-162.97.255.255 -j ACCEPT
iptables -A zone_lan_filter -p udp -m iprange --dst-range 162.97.0.0-162.97.255.255 -j ACCEPT
iptables -A zone_lan_filter -p tcp -m iprange --dst-range 204.245.0.0-204.245.63.255 -j ACCEPT
iptables -A zone_lan_filter -p udp -m iprange --dst-range 204.245.0.0-204.245.63.255 -j ACCEPT

最后,所有未列入白名单的内容都会被退回:

# If none of the rules above matched, return to previous chain
iptables -A zone_lan_filter -j RETURN

那么我是如何得到这些 IP 地址的呢?通过在 netfilter 中记录所有内容:

iptables -I FORWARD -j LOG --log-prefix "iptables_log: "

这些会被放入系统日志中,您可以像这样查看:

dmesg | grep iptables_log

使用来自 dmesg 的目标 IP 地址,您可以使用 whois 获取该 IP 地址注册到的组织正在使用的 CIDR。

whois 还会为您提供一个指向 ARIN 页面的链接,该页面列出了该组织使用的一大堆其他 IP 地址。例如,whois 208.64.200.0打印以下信息:

OrgName:        Valve Corporation
OrgId:          VC-2
Address:        10900 NE 4th St, Suite 500
City:           Bellevue
StateProv:      WA
PostalCode:     98004
Country:        US
RegDate:        2010-11-12
Updated:        2010-11-12
Ref:            http://whois.arin.net/rest/org/VC-2

点击底部的链接进入 ARIN 页面,然后前往相关网络。您可以将所有这些网络范围列入白名单。

答案2

只是为了帮助任何可能遇到此问题的人:

这个问题有点傻。我没有在内核中启用 IP 转发。因为我想永久启用它,所以我只是更新了 /etc/sysctl.conf,将 IPv4 转发行更改为

net.ipv4.ip_forward = 1

并重新启动了机器。

相关内容