Цель этого сценария - разрешить трафик только через VPN, за исключением localhost <-> localhost и входящего трафика SSH. Но когда я запускаю сценарий через SSH, я отключаюсь и вынужден перезагружать виртуальную машину. Что не так с моим сценарием?
#!/bin/bash
iptables -F
#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT
#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT
#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
Ваше
#SSH
правило подразумевает, что ssh является односторонней формой общения, а это не так. Данные отправляются туда и обратно.Обычный способ справиться с этим, поскольку вы не можете заранее знать номер порта на стороне клиента, это разрешить соединения, которые считаются «установленными» или «связанными» с установленным соединением. Для этого вам нужно:
Перед вашими
DROP
правилами (и желательно наверху, так как правила обрабатываются по порядку, и эти два будут применяться к большинству пакетов).Там есть объяснение того , как соединение TCP укореняется здесь ; по сути, тот факт, что сервер отвечает на пакет, разрешенный вашим
#SSH
INPUT
правилом, делает это так.источник
-p tcp
в этом смысле, и посмотрим на последующее объяснение UDP на этой странице (это то же самое). Дело в том, что сервер отвечает, не зная, разрешит ли это iptables или нет, и когда iptables получает этот ответ от сервера в локальной системе , он теперь видит трафик в обоих направлениях (даже если клиент еще этого не делал), считает соединение установлено, и позволяет ответ. «Техническость» здесь зависит от межсетевого экрана, находящегося посередине двух сторон.