Асумінг для сервера та клієнта обмежувальний INPUT
і відкритий OUTPUT
, тобто:
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
І з iptables-extensions (8) на прикладі FTP в активному режимі:
1. НОВИЙ
НОВО Пакет розпочав нове з'єднання або іншим чином пов’язаний із з'єднанням, яке не бачило пакетів в обох напрямках.
Клієнт на порту 50000
(будь-який випадковий непривілейований порт) підключається до FTP-сервера на порту 21
, серверу знадобиться принаймні це, щоб прийняти це вхідне з'єднання:
iptables -A INPUT --dport 21 -m state --state NEW -j ACCEPT
2. ВСТАНОВЛЕНО
Встановлено Пакет асоціюється із з'єднанням, яке бачило пакети в обох напрямках.
Тепер на стороні клієнта він відкрив вихідне з'єднання з сервером на порту 21
за допомогою локального порту, 50000
і йому потрібні такі iptables, щоб відповідь могла надходити з server (21)
до client (50000)
:
sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
3. ПОВ'ЯЗАНІ
ЗВ'ЯЗАНО Пакет починає нове з'єднання, але асоціюється з існуючим з'єднанням, таким як передача даних FTP або помилка ICMP.
Тепер після встановлення з'єднання FTP і збирання даних буде вже встановлено, клієнт відкриє серверний сокет (так, з активним клієнтом FTP стає сервером для з'єднання даних) на порту 60000
(наскільки я розумію, клієнт позначить цей порт 60000
а RELATED
в іншу сполуку з 50000->21
) і відправити цей номер порту на сервер з допомогою FTP - PORT
команди. Тоді FTP-сервер відкриє нове з'єднання від свого порту 20
до порту 60000
на клієнті, і, клієнт тепер вимагає наступного, щоб дозволити цьому новому з'єднанню досягти успіху:
sudo iptables -A INPUT -m state --state RELATED -j ACCEPT
Нарешті, для цього потрібно увімкнути ip_conntrack_ftp
модуль ядра, щоб система давала змогу позначати з'єднання / пакети як RELATED
(це я розумію, я надто не копався):
modprobe ip_conntrack_ftp