![用于 samba/netbios 访问的 iptables/netfilter 规则](https://linux22.com/image/626336/%E7%94%A8%E4%BA%8E%20samba%2Fnetbios%20%E8%AE%BF%E9%97%AE%E7%9A%84%20iptables%2Fnetfilter%20%E8%A7%84%E5%88%99.png)
我必须设置哪些 iptables 规则才能允许客户端访问具有工作 netbios 的 samba 服务器(即能够使用 \MyServer 而不是 \192.168.0.1 从 Windows 访问服务器)?
我有一个小型办公服务器,它在内部和外部网络之间进行 NAT/伪装,并为内部网络提供 dns(转发)、dhcp 和 samba 以及 netbios 服务器。
我当前的 iptables 配置:
# Loeschen aller vorhandener Regeln
$IPT -F
# Default Policy setzen
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
# Loopback komplett freischalten
$IPT -A INPUT -i $LO -j ACCEPT
$IPT -A OUTPUT -o $LO -j ACCEPT
# Bestehende Verbindungen auf allen Interfaces erlauben
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Ping auf allen Interfaces erlauben
$IPT -A INPUT -p icmp -j ACCEPT
# Eingehende Verbindungen aus dem internen Netz erlauben
# SSH, HTTP, HTTPS, Squid
$IPT -A INPUT -i $INT -m state --state NEW -m multiport -p tcp --dport 22,80,443,8080 -j ACCEPT
# DNS
$IPT -A INPUT -i $INT -m state --state NEW -p tcp --dport domain -j ACCEPT
$IPT -A INPUT -i $INT -m state --state NEW -p udp --dport domain -j ACCEPT
# Samba
$IPT -A INPUT -i $INT -m state --state NEW -p udp --dport 137 -j ACCEPT
$IPT -A INPUT -i $INT -m state --state NEW -p udp --dport 138 -j ACCEPT
$IPT -A INPUT -i $INT -m state --state NEW -p tcp --dport 139 -j ACCEPT
$IPT -A INPUT -i $INT -m state --state NEW -p tcp --dport 445 -j ACCEPT
# Ausgehende Verbindungen ins interne Netz erlauben
# Samba
$IPT -A OUTPUT -o $INT -m state --state NEW -p udp --sport 137 -j ACCEPT
$IPT -A OUTPUT -o $INT -m state --state NEW -p udp --sport 138 -j ACCEPT
$IPT -A OUTPUT -o $INT -m state --state NEW -p tcp --sport 139 -j ACCEPT
$IPT -A OUTPUT -o $INT -m state --state NEW -p tcp --sport 445 -j ACCEPT
# Eingehende Verbindungen aus dem externen Netz erlauben
# SSH vom Sprungserver
$IPT -A INPUT -i $EXT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT
# Ausgehende Verbindungen ins externe Netz erlauben
# HTTP
$IPT -A OUTPUT -o $EXT -m state --state NEW -p tcp --dport http -j ACCEPT
# DNS
$IPT -A OUTPUT -o $EXT -m state --state NEW -p udp --dport domain -j ACCEPT
$IPT -A OUTPUT -o $EXT -m state --state NEW -p tcp --dport domain -j ACCEPT
# Transparenter Proxy für HTTP über Squid
$IPT -t nat -A PREROUTING -i $INT -p tcp --dport 80 -j REDIRECT --to-port 8080
# Routing
# Forwarding
$IPT -A FORWARD -i $INT -o $EXT -j ACCEPT
$IPT -A FORWARD -i $EXT -o $INT -m state --state RELATED,ESTABLISHED -j ACCEPT
# NAT
$IPT -t nat -A POSTROUTING -o $EXT -j MASQUERADE
使用此规则集,通过 IP 地址进行访问可以正常运行,但无法进行名称解析。我必须允许哪些端口?
我从服务器本身和客户端检查了 smbclient 的功能:
root@client:~# smbclient -L //192.168.40.254/
Enter root's password:
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.6]
Sharename Type Comment
--------- ---- -------
IPC$ IPC IPC Service (samba-debian)
lehrer Disk Lehrer
print$ Disk Printer Drivers
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.6]
Server Comment
--------- -------
SAMBA-DEBIAN samba-debian
Workgroup Master
--------- -------
WORKGROUP SAMBA-DEBIAN
root@client:~# smbclient -L //samba-debian/
Enter root's password:
Connection to samba-debian failed (Error NT_STATUS_CONNECTION_REFUSED)
root@samba-debian:~# smbclient -L //192.168.40.254/
Enter root's password:
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.6]
Sharename Type Comment
--------- ---- -------
IPC$ IPC IPC Service (samba-debian)
lehrer Disk Lehrer
print$ Disk Printer Drivers
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.6]
Server Comment
--------- -------
SAMBA-DEBIAN samba-debian
Workgroup Master
--------- -------
WORKGROUP SAMBA-DEBIAN
root@samba-debian:~# smbclient -L //samba-debian/
Enter root's password:
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.6]
Sharename Type Comment
--------- ---- -------
IPC$ IPC IPC Service (samba-debian)
lehrer Disk Lehrer
print$ Disk Printer Drivers
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.6]
Server Comment
--------- -------
SAMBA-DEBIAN samba-debian
Workgroup Master
--------- -------
WORKGROUP SAMBA-DEBIAN
此外,当我完全禁用防火墙时它可以工作 - 因此原因应该在 iptables 代码中。
在服务器内部接口的 53 端口上执行 tcpdump - 没有任何结果:
root@samba-debian:~# tcpdump -i eth1 port 53
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
^C
0 packets captured
0 packets recieved by filter
0 packets recieved by kernel
答案1
一个有用的做法是在iptables
规则文件的末尾插入以下日志过滤器。
$IPT -A OUTPUT -m limit --limit 2/min -j LOG --log-prefix "IPTables-OUTPUT-Dropped: " --log-level 4
$IPT -A INPUT -m limit --limit 2/min -j LOG --log-prefix "IPTables-INPUT-Dropped: " --log-level 4
$IPT -A FORWARD -m limit --limit 2/min -j LOG --log-prefix "IPTables-FWD-Dropped: " --log-level 4
以上内容将报告缺失的内容,我猜测 FORWARD 将为您记录这些消息。
如果您希望您的 SMB 服务器能够从一个路由器跳跃之外访问,您会发现您还需要为-A FORWARD
(端口 137、138、139、445)插入相同的 4 条规则
虽然我不是 SMB 专家,但您可能希望在每个 INPUT、OUTPUT 中添加端口 137/tcp、138/tcp、139/udp,如果外部需要,还可以在 FORWARD 中添加端口 137/tcp、138/tcp、139/udp。