Разрешение доступа клиентам
В этой статье объясняется, как настроить брандмауэр iptables, чтобы разрешить сетевым клиентам доступ к серверу Samba на узле Linux.
Я запускал серверы Samba уже несколько лет, всегда в частных сетях за брандмауэрами, и обычно отключал брандмауэр на внутреннем хосте, чтобы не усложнять настройку или избавиться от неожиданных багов. С годами я стал более сознательным в вопросах безопасности, и теперь я стараюсь всегда настраивать фаервол, чтобы впускать трафик только тот, что мне нужен. Эта краткая статья должна объяснить основы разрешения трафика Samba через iptables. А пока немного о самой Samba.
Порты, протоколы, и службы
В файле /etc/services несколько строк, связанных с Samba:
netbios-ns 137/tcp # NetBIOS Name Service
netbios-ns 137/udp
netbios-dgm 138/tcp # NetBIOS Datagram Service
netbios-dgm 138/udp
netbios-ssn 139/tcp # NetBIOS Session Service
netbios-ssn 139/udp
microsoft-ds 445/tcp # Microsoft Directory Service
microsoft-ds 445/udp
На самом деле количество портов можно сократить к следующему виду:
netbios-ns 137/udp # NetBIOS Name Service
netbios-dgm 138/udp # NetBIOS Datagram Service
netbios-ssn 139/tcp # NetBIOS Session Service
microsoft-ds 445/tcp # Microsoft Directory Service
…потому что это порты, которые слушают службы сервера Samba. Первые три строки представляют порты, используемые сетью windows, так как сеть TCP/IP стала стандартной в операционной системе Windows 95. Оставшийся порт стал использоваться, когда Microsoft представила свою службу каталогов с Windows 2000. Для устранения неполадок или настройки полезно отметить, что протоколы UDP (порты 137 и 138) обслуживаются демоном nmbd, а протоколы TCP (порты 139 и 445) обслуживаются smbd.
Вы можете сами проверить, какие порты используются Samba, с помощью этих команд (от root):
# service smb stop
# netstat -ln > netstat-ln-smb.before
# service smb start
# netstat -ln > netstat-ln-smb.after
# diff netstat-ln-smb.*
И Вы увидите, что порты, перечисленные выше, появляются в выходных данных вместе с протоколом (TCP или UDP), которые используются для связи.
Настройка iptables
Разрешим же необходимые порты:
# iptables -A INPUT -p udp -m udp --dport 137 -j ACCEPT
# iptables -A INPUT -p udp -m udp --dport 138 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
Затем перезапустим службу Samba:
# service iptables restart
В некоторых случаях есть хосты, которые не должны иметь доступа к серверу Samba. Вы можете ограничить диапазон IP-адресов, которые могут успешно подключаться к серверу Samba. Вот пример команд, вместо приведенных выше:
# iptables -A INPUT -p udp -m udp -s 192.168.0.0/24 --dport 137 -j ACCEPT
# iptables -A INPUT -p udp -m udp -s 192.168.0.0/24 --dport 138 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.0/24 --dport 445 -j ACCEPT
Этот пример позволит только хостам с IP-адресами между 192.168.0.1 и 192.168.0.254 связаться с сервером Samba.
Если требуется ограничить доступ только с одного хоста, используйте эти команды:
# iptables -A INPUT -p udp -m udp -s 192.168.0.1/32 --dport 137 -j ACCEPT
# iptables -A INPUT -p udp -m udp -s 192.168.0.1/32 --dport 138 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.1/32 --dport 139 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.1/32 --dport 445 -j ACCEPT
Эта конфигурация позволит только хосту с IP-адресом 192.168.0.1 связаться с сервером Samba.
Если вы хотите, чтобы несколько отдельных узлов или подсетей могли подключаться к серверу Samba, вам придется использовать несколько наборов из четырех строк конфигурации.
Настройка доступа в Samba
С помощью самой же Samba так же можно ограничить доступ. Но это скорее как вспомогательная опция к брэндмауэру.
interfaces -это глобальная опция в файле конфигурации smb.conf, которая может ограничить возможность установления соединений с Samba на одном или нескольких сетевых интерфейсах. В системах с одним сетевым интерфейсом эта опция может быть полезна только для того, чтобы Samba могла работать с интерфейсом loopback или создаваться программным обеспечением вроде VMware. Вот типичный пример использования этой опции:
interfaces = 192.168.100.1 127.0.0.1
Теперь порты слушаются только на loopback интерфейсе и интерфейсе с адресом 192.168.100.1
И еще два параметра hosts deny и hosts allow. С их помощью запрещаем или разрешаем доступ от источника:
hosts deny = 192.168.0.0/255.255.255.0
hosts allow = 192.168.1.0/255.255.255.0 192.168.3.10 192.168.3.12
Вот так.