1

Я недавно получил и настроил небольшой маршрутизатор 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 ответа2

0

Я смог внести в белый список все 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, затем перейдите в соответствующие сети. Вы можете внести в белый список все эти диапазоны сети.

0

Просто чтобы помочь кому-то еще, кто может столкнуться с этой проблемой:

Проблема была немного глупой. Я не включил IP-пересылку в ядре. Поскольку я хотел, чтобы это было постоянным, я просто обновил /etc/sysctl.conf, изменив строку пересылки IPv4 на

net.ipv4.ip_forward = 1

и перезапустил машину.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .