Конфигурация 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. Я попытался создать правила ACCEPT для этих диапазонов как для TCP, так и для UDP, а также для соединений dport и sport, но безуспешно.
Я что-то неправильно понимаю в маршрутизации? Я предполагаю, что мне не нужно ничего переносить вперед, потому что я клиент, использующий их порты. Я подумал, что мне просто нужно разрешить трафик через порты, и что он будет затем перенаправляться на конечную точку сервера и возвращаться. Кто-нибудь знает, как разрешить клиент Steam (или весь трафик на всех портах) в iptables?
ВТОРОЕ РЕДАКТИРОВАНИЕ (другой код):
Основываясь на комментариях, я решил попробовать обновить мой сценарий, вычеркнув разные строки, которые я пробовал, и просто заставив его принять все. Тем не менее, это все еще не работает, по крайней мере, для 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
2 ответа
Просто чтобы помочь кому-то еще, кто может столкнуться с этой проблемой:
Проблема была немного глупой. Я не включил IP-пересылку в ядре. Поскольку я хотел, чтобы это было постоянным, я просто обновил /etc/sysctl.conf, изменив строку пересылки IPv4 на
net.ipv4.ip_forward = 1
и перезапустил машину.
Я смог внести в белый список все IP-адреса, используемые Steam. Скорее всего, они не будут применяться в вашем районе (все здесь проходит через трубы 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-адресов, принадлежащих CDN, которые Steam использует для загрузки игр и патчей:
# 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
Далее мы получаем список 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
Используя IP-адрес получателя от dmesg, вы можете использовать whois для получения CIDR, используемой организацией, в которой зарегистрирован IP-адрес.
Кроме того, 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, затем перейдите в соответствующие сети. Вы можете внести в белый список все эти диапазоны сети.