Как настроить эти правила iptables для запуска при запуске


20

Я обычно запускаю свои правила iptables при каждом входе в систему. С терминала я печатаю;

sudo sh firewall.sh

Настраивая компьютер моей сестры, я хочу дать ей базовую защиту брандмауэра. Она не будет входить в систему как администратор, просто стандартная учетная запись. Как я могу заставить скрипт брандмауэра запускаться каждый раз, когда она входит в систему, без необходимости вводить какой-либо пароль?

Сценарий, который я написал для компьютера моей сестры, содержит;

#!/bin/sh

modprobe ip_conntrack
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -I OUTPUT -p tcp --dport 80 --sport 32768:61000 -j ACCEPT
iptables -I OUTPUT -p udp --dport 53 --sport 32768:61000 -j ACCEPT
iptables -I OUTPUT -p tcp --dport 443 --sport 32768:61000 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -I OUTPUT -p icmp -j DROP

iptables -I INPUT -p icmp -j DROP
iptables -I INPUT -p udp -j DROP
iptables -I INPUT -p tcp -m tcp --syn -j DROP
iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Я поместил его в ее домашнюю папку как firewall.sh и установил его как исполняемый (щелкните правой кнопкой мыши по файлу и отметьте опцию «разрешить запуск файла как программы» на вкладке прав доступа).

Запуск этого скрипта из терминала как root работает нормально.

После набора текста;

sudo sh firewall.sh

Я набрал в терминале

sudo iptables -L -v

и я получаю

Chain INPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,ACK/SYN
    0     0 DROP       udp  --  any    any     anywhere             anywhere            
    0     0 DROP       icmp --  any    any     anywhere             anywhere            

Chain FORWARD (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       icmp --  any    any     anywhere             anywhere            
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spts:32768:61000 dpt:https
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere             udp spts:32768:61000 dpt:domain
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spts:32768:61000 dpt:http
    0     0 ACCEPT     all  --  any    lo      anywhere             anywhere

Как я могу запустить этот скрипт автоматически при входе в систему или, возможно, сохранить эти правила навсегда для моего компьютера сестер? Не могли бы вы предоставить подробный код, так как мои первые попытки использования метода rc.local и iptables-save не были очень успешными. При каждой перезагрузке все цепочки INPUT, OUTPUT и FORWARD сбрасываются в ACCEPT, и при вводе данных политики не отображаются.sudo iptables -L -v


Спустя почти два года, но важный комментарий: убедитесь, что у вас есть ip6tablesправила, если вы получите соединение v6 однажды, поскольку IPv6 обрабатывается, ip6tablesа не обрабатывается iptables.
— Томас Уорд

Ответы:


38

Вы можете использовать iptables-persistentпакет, а не связываться с вашими загрузочными скриптами. Сначала запустите ваш скрипт для настройки правил брандмауэра. Во-вторых, запустите sudo apt-get install iptables-persistentи следуйте инструкциям. Когда появится запрос на сохранение текущих правил, нажмите «Да» в обоих запросах. Теперь при перезагрузке ваши правила iptables будут восстановлены.


ПРИМЕЧАНИЕ. Если после этого вы измените свои правила, после внесения изменений вам потребуется выполнить следующие команды:

Чтобы сохранить правила IPv4 iptables: sudo su -c 'iptables-save > /etc/iptables/rules.v4'

Чтобы сохранить правила IPv6 ip6tables: sudo su -c 'ip6tables-save > /etc/iptables/rules.v6'


Спасибо, что сработало. Если я хочу временно изменить правила, я могу просто запустить скрипт из терминала, да?
— Микелан

Да, или вы можете напрямую манипулировать системой iptables напрямую. ОДНАКО, если вы планируете использовать временное правило постоянно, новые правила не будут гарантированно сохранены, если вы не выполните команды, которые я указал в своем ответе.
— Томас Уорд

Это плохая идея запускать sudo dpkg-reconfigure iptables-persistentпосле изменения правила.
— souravc

@souravc вопрос, который отвечает на это: «Зачем вам нужно или хотите?» Идея заключается в том, что вам не придется и можно просто переписать (или перезаписать) файлы rules.v4или rules.v6вручную, чтобы они были проиндексированы при следующей загрузке, или сразу же при запуске iptables-restore < /etc/iptables/rules.v4илиip6tables-restore < /etc/iptables/rules.v6
— Томас Уорд

2

Предполагая, что у вас есть правила брандмауэра в:

/etc/iptables.up.rules

Возможно, наиболее очевидным ответом будет создание файла с именем iptables в:

/etc/network/if-pre-up.d

с содержанием:

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

и сделать его исполняемым с помощью

sudo chmod +x /etc/network/if-pre-up.d/iptables

Таким образом, перед активацией сетевого интерфейса ваши правила будут загружены.


Спасибо, это куда-нибудь выкидывает логи? Это не работает, и я подозреваю, что это связано с тем, что на моем DNS-сервере уже есть распознаватель, еще не запущенный во время загрузки хоста.
— Дмитрий Коприва,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.