Wang's blog

使用iptables控制仅限指定IP访问指定端口

Published on

背景

在服务器上,如果将某个端口开放使所有IP都可以访问,则可能会引起攻击或增加不必要的流量。此时可以使用iptables控制仅使需要的IP可以访问。

步骤

1. 首先禁止所有IP访问端口:

iptables -I INPUT -p tcp --dport {port} -j DROP

2. 之后将该端口开放给指定IP:

iptables -I INPUT -s {ip} -p tcp --dport {port} -j ACCEPT

其中ip可以为单一IP(如192.168.1.1),也可以为带掩码的一组IP(如192.168.1.0/24)。

3. 导入/导出规则

# 导出
iptables-save > {file}
# 导入
iptables-restore < {file}

4. 重启后自动导入规则

无论直接添加的规则还是导入的规则,在重启后都不会保存,需要重新添加或导入。因此需要在/etc/rc.local中使用iptables-restore自动导入规则。

5. 使用脚本自动添加当前ssh登录ip

ip=`who | grep -o "[0-9]*\.[0-9]*\.[0-9]*\." | tail -n 1`"0/24"
port=12345
echo $ip:$port

iptables -C INPUT -s $ip -p tcp --dport $port -j ACCEPT
if [ $? -eq 1 ]; then
	iptables -I INPUT -s $ip -p tcp --dport $port -j ACCEPT
fi
iptables -C INPUT -s ${ip} -p udp --dport $port -j ACCEPT
if [ $? -eq 1 ]; then
	iptables -I INPUT -s ${ip} -p udp --dport $port -j ACCEPT
fi

说明

  • 如需针对udp协议,可将上述命令中的tcp替换为udp
  • 运行iptables需要root权限
  • 目前在Ubuntu中iptables不是服务,不能使用service iptables save保存规则