Перейти к основному содержимому

Огранчиение доступа с помощью iptables

Если Вы используете сервисы, доступ к которым необходимо закрыть, но при этом сохранить его для определенных IP-адресов, то это можно сделать с помощью правил iptables.

Допустим, IPv4-адрес сервера 192.0.2.10, IPv6-адрес 2001:0db8::2, сервис работает на порту 11211, с использованием и TCP, и UDP. Определим, используется TCP или UDP, с помощью команды ss:

# ss -ntplu | grep 11211
udp UNCONN 0 0 192.0.2.10:11211 0.0.0.0:* users:(("memcached",pid=24785,fd=26),("memcached",pid=24785,fd=25),("memcached",pid=24785,fd=24),("memcached",pid=24785,fd=23))
tcp LISTEN 0 128 192.0.2.10:11211 0.0.0.0:* users:(("memcached",pid=24785,fd=22))
udp UNCONN 0 0 2001:0db8::2:11211 0.0.0.0:* users:(("memcached",pid=24785,fd=26),("memcached",pid=24785,fd=25),("memcached",pid=24785,fd=24),("memcached",pid=24785,fd=23))
tcp LISTEN 0 128 2001:0db8::2:11211 0.0.0.0:* users:(("memcached",pid=24785,fd=22))

В выводе видим, что наш сервис работает и на TCP, и на UDP (указано в первой колонке), на IPv4 и IPv6 адресах (пятая колонка). То есть, огранчиивать доступ нужно и для TCP, и для UDP, а также на обоих IP.

Возьмем, что IP-адрес, для которого доступ нужен - 198.51.100.11.

Первые два правила закрывают доступ к порту 11211 по протоколам TCP и UDP соотвественно, вторые два - открывают доступ для IP 198.51.100.11:

iptables -I INPUT ! -i lo -p tcp -m tcp --dport 11211 -j DROP
iptables -I INPUT ! -i lo -p udp -m udp --dport 11211 -j DROP
iptables -I INPUT -p tcp -m tcp -s 198.51.100.11 --dport 11211 -j ACCEPT
iptables -I INPUT -p udp -m udp -s 198.51.100.11 --dport 11211 -j ACCEPT

Если нужно разрешить больше IP-адресов, повторите два последних правила, сменив в них IP.

Правила для IPv6 задаются с помощью команды ip6tables, в остальном все аналогично:

ip6tables -I INPUT ! -i lo -p tcp -m tcp --dport 11211 -j DROP
ip6tables -I INPUT ! -i lo -p udp -m udp --dport 11211 -j DROP

Правила iptables при перезагрузке сервера теряются, чтобы добавленные правила сохранились, на Debian/Ubuntu рекомендуется установить пакет iptables-persistent:

apt-get update && apt-get install iptables-persistent

После установки сохранить правила можно командой:

netfilter-persistent save

На CentOS треубется установить iptables-services:

yum install iptables-services
systemctl enable iptables

После установки сохранить правила можно командой:

service iptables save