Я хочу заблокировать все подсети за пределами США. Я сделал сценарий, в котором есть все подсети США. Я хочу запретить или УДАЛИТЬ все, кроме моего списка. Может кто-нибудь привести мне пример того, как я могу начать все отрицать?
Это результат -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp state NEW
DROP icmp -- anywhere anywhere
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
И это правила
iptables --F
iptables --policy INPUT DROP
iptables --policy FORWARD DROP
iptables --policy OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT -p icmp -j DROP
Для ясности, с этими правилами я все еще могу подключиться к порту 21 без моего списка подсетей. Я хочу заблокировать ВСЕ подсети и просто открыть те, что находятся в США.
Если пакет соответствует «ACCEPT», он немедленно принимается. Если он соответствует DROP, он немедленно отбрасывается.
Похоже, вы хотите, чтобы только хосты в США могли подключаться к ftp. Есть несколько способов добиться этого.
Составьте множество таких сложных правил.
iptables -P INPUT DROP
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT --src 1.2.3.4/24 -p tcp -i eth0 --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT --src 4.5.6.7/12 -p tcp -i eth0 --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT --src 8.9.1.2/31 -p tcp -i eth0 --dport 21 -m state --state NEW -j ACCEPT
Создайте новую цепочку, отправьте весь трафик в цепочку, используйте RETURN для всех подсетей США и сделайте свое последнее правило в цепочке DROP все остальное. Это должен быть лучший метод, поскольку будет выполняться меньше проверок условий.
iptables -P INPUT DROP
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -N USNETS
iptables -A USNETS -s 1.2.3.4/24 -j RETURN
iptables -A USNETS -s 4.5.6.7/12 -j RETURN
iptables -A USNETS -s 8.9.1.2/31 -j RETURN
iptables -A USNETS -j DROP # drop everything that isnt in USNETS
iptables -A INPUT -j USNETS # send everything to USNETS
# PERMIT traffic that
iptables -A INPUT -p tcp -i eth0 --dport 21 -m state --state NEW -j ACCEPT
Используя отдельное изменение, вы даже можете добавлять / удалять элементы из цепочки USNETS без сброса всего брандмауэра по мере выделения нового адресного пространства. Я серьезно сомневаюсь, стоит ли эта идея усилий. Люди снаружи смогут войти, они просто будут использовать прокси.
Вы даже можете сделать это наоборот и выполнить весь порт / сервис в цепочке.
iptables -P INPUT DROP
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -N SRVCS
iptables -A SRVCS -p tcp -i eth0 --dport 21 -m state --state NEW -j RETURN
iptables -A SRVCS -j DROP # drop everything that isnt in allowed SRVCS
iptables -A INPUT -j SRVCS # send everything to SRVCS
# PERMIT traffic that has been returned from SRVCS
iptables -A INPUT --src 1.2.3.4/24 -j ACCEPT
iptables -A INPUT --src 4.5.6.7/12 -j ACCEPT
iptables -A INPUT --src 8.9.1.2/31 -j ACCEPT
Однако, если вы решили делать огромные наборы для блокировки, вам следует изучить ipset который может обрабатывать очень большие списки на очень высокой скорости.
С ipset у вас может быть одно правило iptable, действующее на один набор. Нет необходимости в правилах для каждой подсети.
Однако в основном ядре нет поддержки ipset. Вам необходимо самостоятельно скомпилировать модуль. Инструкцию можно найти на сайте ipset.
Задайте для политики по умолчанию значение DROP, затем добавьте правила ACCEPT для всех подсетей в США.
Что-то вроде:
iptables -P INPUT DROP
iptables -A INPUT --src 1.2.3.4/24 -j ACCEPT
iptables -A INPUT --src 4.5.6.7/12 -j ACCEPT
iptables -A INPUT --src 8.9.1.2/31 -j ACCEPT
...
Я ОП (Джим), и я вернулся к этой теме, чтобы узнать, есть ли новые ответы. Я также вернулся, чтобы лично поблагодарить Зоредаш за всю его помощь и усилия, которые он вложил в свой ответ. Я работаю в среде UNIX много-много лет и практически не имею опыта работы с пакетными фильтрами "Linux", но я знал, что Давр и Уорнер были неправильными и просто пришли к выводу, что после всего того времени, которое я ждал, пока они вернутся и искупят свою вину, они не знали, какой был правильный ответ.
Итак, еще раз спасибо, Zoredache, за вашу помощь! Я склонен согласиться с вами по поводу блокировки всех стран, поскольку это того не стоит; они могут просто использовать прокси, если захотят.