Как настроить эти правила 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

Mikelane
источник
Спустя почти два года, но важный комментарий: убедитесь, что у вас есть 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-сервере уже есть распознаватель, еще не запущенный во время загрузки хоста.
Дмитрий Коприва,