当前位置:   article > 正文

Linux命令--iptables--使用/实例_linux iptable限制ip访问

linux iptable限制ip访问

原文网址:Linux命令--iptables--使用/实例_IT利刃出鞘的博客-CSDN博客

简介

说明

本文介绍Linux的iptables命令的用法。

作用

iptables控制防火墙,用于禁止或允许某个IP访问,也可以用于请求转发等。

Linux防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(也称网络层防火墙)。

示例

查看信息

查看当前的IP规则表

iptables -L -n

查看当前IP规则表(带编号) 。

iptables -L -n --line-numbers

此命令会在第1列添加编号,此编号可以用于删除规则:

iptables -D INPUT NUM

禁止

禁止某个IP访问

iptables -I INPUT -s 192.168.0.232 -j DROP

禁止某个IP网段访问

iptables -I INPUT -s 192.168.0.232/240 -j DROP

禁止某个IP访问某个端口(比如:8501)

iptables -I INPUT -s 192.168.0.232 -ptcp --dport 8501 -j DROP

禁止某个端口访问(比如:8501)

iptables -I INPUT -p tcp --dport 8501 -j DROP

禁止其他主机ping此服务器 

  1. iptables -A INPUT -p icmp --icmp-type 8 -j DROP
  2. iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP

禁止用户访问www.baidu.com 

iptables -I FORWARD -d www.baidu.com -j DROP

 解封某个IP访问

iptables -D INPUT -s 192.168.0.232 -j DROP

也可以这样做:

查看当前IP规则表(带编号) 。

iptables -L -n --line-numbers

此命令会在第1列添加编号,此编号可以用于删除规则:

iptables -D INPUT NUM

清空iptables的所有规则(默认规则除外)

iptables -F

允许

允许某个IP访问

iptables -I INPUT -s 192.168.0.232 -j ACCEPT

仅允许来自172.27.8.0/22的用户连接ssh服务

  1. iptables -I INPUT -s 172.27.8.0/22 -p tcp --dport 22 -j ACCEPT
  2. iptables -A INPUT -p tcp --dport 22 -j REJECT

限制

限制最大的连接数

当访问80端口的连接数达到100后,开始限制为最多允许每分钟25个链接(防止cc攻击) 

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

限制单个ip的并发访问(防止cc攻击) 

iptables -I INPUT -p tcp --dport 85 -s 192.168.1.8 -m connlimit --connlimit-above 10 -j REJECT

其他 

流量均衡

将访问流量分流至内网三台不同主机: 

  1. iptables -A PREROUTING -i eth1 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT -to-destination 172.27.8.10
  2. iptables -A PREROUTING -i eth1 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT -to-destination 172.27.8.20
  3. iptables -A PREROUTING -i eth1 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT -to-destination 172.27.8.30

保存配置

通过iptables配置防火墙立即生效。iptables防火墙配置在重启后就失效了,解决方法如下:

1.将配置写入文件

sudo iptables-save > /etc/iptables.rules

2.网卡启动和关闭时自动加载和保存配置

编辑/etc/network/interfaces文件,添加如下内容:

  1. pre-up iptables-restore < /home/user/iptables.rules
  2. post-down iptables-save > /home/user/iptables.rules
  • pre-up: 网卡启用前的动作
  • up: 启用时候的动作
  • post-up: 启用后的动作
  • pre-down: 关闭前的动作
  • down: 关闭时动作
  • post-down: 关闭后动作 

语法

格式

iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION

table

table有四个,简称四表,对应iptables的功能

  • filter
    • 控制数据包是否允许进出及转发(INPUT、OUTPUT、FORWARD),可以控制的链路有input, forward, output
  • nat,
    • 控制数据包中地址转换,可以控制的链路有prerouting, input, output, postrouting
  • mangle
    • 修改数据包中的原数据,可以控制的链路有prerouting, input, forward, output, postrouting
  • raw
    • 控制nat表中连接追踪机制的启用状况,可以控制的链路有prerouting, output

command

命令

命令

说明

示例

-A/--append

把规则追加到指定链的尾部。

格式:iptables -A chain firewall-rule

示例:iptables -A INPUT

-D/--delete

删除规则

格式:

iptables -D chain rulenum  //删除 chain 中编号为 rulenum 的那条规则。

iptables -D chain firewall-rule //从 chain 中删除规则 firewall-rule 的那一条目

示例

iptables -D INPUT 1   //删除INPUT中的第1个条目

-E/--rename-chain

重命名规则。会使所有引用原规则名的规则失效。

iptables -E old-chain new-chain //将 old-chain 名称更改为 new-chain

-F/--flush

清空规则链的规则。若未指定chain名称,则清空所有 chain 。

iptables -F

-I/--insert

在头部插入规则

格式:iptables -I chain [rulenum] firewall-rule

说明:将 firewall-rule 添加为 chain 中的第 rulenum 条规则,原先的第 rulenum 条及以后各条的需要顺次 +1。

示例:iptables -I INPUT 1 --dport 80 -j ACCEPT

-L/--list

查看规则链

iptables -L

-N/--new

创建新的规则

格式:iptables -N chain//创建一个名称为 chain 的新链。

-P/--policy

更改策略

格式:iptables -P chain target

说明:改变 chain 的策略为 target。

-R/--replace

替换规则

格式:格式:iptables -R chain [rulenum] firewall-rule

说明:将 chain 中第 rulenum 条规则替换为 firewall-rule。若不指定 rulenum,则替换该 chain 中第一条。

示例:iptables -R INPUT 1 -s 192.168.120.0 -j DROP

-S/ --list-rules

查看规则

格式:iptables -S [chain [rulenum]]

-V

查看iptables版本

iptables -V

-X/--delete-chain

删除chain

格式:iptables -X [chain]

说明:

-Z/--zero

清空chain的计数器

格式:iptables -Z [chain [rulenum]]

说明:把 chain 或者所有 chain(当未指定 chain 名称时)的包及字节的计数器清空。

选项

选项

说明

示例

-p

协议(tcp/udp/icmp)

iptables -A INPUT -p tcp

-s

匹配原地址,加" ! "表示除这个IP外

iptables -A INPUT -s 192.168.1.1

-d

匹配目的地址

iptables -A INPUT -d 192.168.12.1

--sport

匹配源端口流入的数据

iptables -A INPUT -p tcp --sport 22

--dport

匹配目的端口流出的数据

iptables -A INPUT -p tcp --dport 22

-i

匹配入口网卡流入的数据

iptables -A INPUT -i eth0

-o

匹配出口网卡流出的数据

iptables -A FORWARD -o eth0

-j

要进行的处理动作:DROP,REJECT,ACCEPT(接受)等

iptable -A INPUT 1 -s 192.168.120.0 -j DROP

--to-source

指定SANT转换后的地址

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SANT --to-source 172.16.100.1

-t

表名(raw、mangle、nat、filter)

iptables -t nat

-m

使用扩展模块来进行数据包的匹配(multiport/tcp/state/addrtype)

iptables -m multiport

chain

有5个,简称:五链。

  • PREROUTING:路由前处理。
  • INPUT:处理输入。
  • FORWARD:处理转发
  • OUTPUT:处理输出。
  • POSTROUTING:路由后处理。

规则链先后顺序:

入站:PREROUTING→INPUT
出站:OUTPUT→POSTROUTING
转发:PREROUTING→FORWARD→POSTROUTING

CRETIRIA

匹配的条件。

对于同一条防火墙规则,可以指定多个匹配条件,表示这些条件必须都满足规则才会生效,根据数据包的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配、隐含匹配、显式匹配。

类别

条件类型

用法

通用匹配

协议匹配

-p 协议名

通用匹配

地址匹配

-s 源地址、-d 目的地址

通用匹配

接口匹配

-i 入站网卡、-o 出站网卡

隐含匹配

端口匹配

-sport 源端口、-dport 目的端口

隐含匹配

TCP标记匹配

-tcp-flags 检查范围 被设置的标记

隐含匹配

ICMP类型匹配

-icmp-type ICMP类型

显示匹配

多端口匹配

-m multiport --sports

显示匹配

ip范围匹配

-m iprange --src-range ip范围

显示匹配

MAC地址匹配

-m mac --mac-source MAC地址

显示匹配

状态匹配

-m state --state 连接状态

一、通用匹配

通用匹配也称为常规匹配,这种匹配方式可以独立使用,不依赖于其他条件或扩展模块。常见的通用匹配包括协议匹配、地址匹配、网络接口匹配。

1、协议匹配

iptables规则时使用"-p 协议名’的形式指定,用于检查数据包所使用的网络协议,如tcp、udp、icmp、all等,协议存放在/etc/protocols文件中。

丢弃通过icmp协议访问防火墙本机的数据包

iptables -I INPUT -p icmp -j DROP

2、地址匹配

iptables规则时使用"-s 源地址" 或 “-d 目标地址” 的形式指定,用来检查数据包的源地址(source)或目标地址(destination)。IP地址、网段地址等红豆是可以接受,但不建议使用主机名、域名地址。

拒绝转发源地址为192.168.1.38的数据包,允许转发源地址位于192.168.10.0/24网段的数据

  1. iptables -t filter -A FORWARD -s 192.168.1.38 -j REJECT
  2. iptables -t filter -A FORWARD -s 192.168.10.0/24 -j ACCEPT

3、网络接口匹配

iptables规则时使用"-i 接口名" 和"-o 接口名"的形式,用于检查数据包从防火墙的那一个节后进入或发出,分别对应入站网卡,出站网卡。

丢弃从外网接口(eth1)访问防火墙本机且源地址为私有地址的数据包

  1. iptables -t filter -A INPUT -i eth1 -s 192.168.10.0/24 -j DROP
  2. iptables -t filter -A INPUT -i eth1 -s 192.168.20.0/24 -j DROP
  3. iptables -t filter -A INPUT -i eth1 -s 192.168.30.0/24 -j DROP

二、隐含匹配

这种匹配方式要求以指定的协议匹配作为前提条件,相当于子条件,因此无法独立使用,其对应的功能由iptables在需要时自动载入内核,常见的隐含匹配包括端口匹配,TCP标记匹配,ICMP类型匹配。

1、端口匹配

构建Vsftpd服务器时,若要开放20,21端口,以及用于被动模式的端口范围200~300

  1. iptables -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT
  2. iptables -t filter -A INPUT -p tcp --dport 200:300 -j ACCEPT

2、tcp标记匹配

iptables可通过匹配TCP的特定标志而设定更加严谨的防火墙规则,tcp-flags参数使用如下:-p tcp --tcp-flags。匹配指定的TCP标记,有两个参数列表,列表内部用逗号为分隔符,两个列表之间用空格分开。第一个列表用作参数检查,第二个列表用作参数匹配。可用以下标志:SYN、ACK、FIN、RST 、URG、PSH、ALL、NONE。ALL是指选定所有的标记,NONE是指未选定任何标记。

防止Xmas扫描

iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

防止TCP Null扫描

iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

拒绝TCP标记为SYN/ACK但连接状态为NEW的数据包,防止ACK欺骗

iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP

3、icmp类型匹配

iptabels规则时使用"–icmp-type ICMP类型"的形式,针对的协议为ICMP用来检查ICMP数据包的类型。ICMP类型使用字符串货数字代码表示,如"Echo-Rwquest" (代码为8)、“Echo-Reply” (代码为0)、“Destunation-Unreachable”(代码为3)、分别对应ICMP协议的请求、回显、目标不可达。

1、禁止其他主机ping本机,允许本机ping其他主机

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

iptables -A INPUT -p icmp --icmp-type 8 -j DROP

2、禁止本机ping其他主机,允许其它主机ping本机

iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP

iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP

三、显式匹配

1、多端口匹配

iptbales规则时使用"-m multiport --dports 端口列表"、"-m multiport --sports 端口列表"的形式,用来检查数据包的源端口,多个端口之间以逗号进行分隔。

允许本机开放80,443,18080端口

iptables -t filter -A INPUT -p tcp -m multiport --dport 80,443,18080 -j ACCEPT

2、ip范围匹配

iptables规则时使用"-m iprange --src-range IP 范围"、"-m iprange --dst-range IP 范围"的形式,用来检查数据包的源地址,目标地址,其中IP范围采用"起始地址-结束地址"的形式表示。

禁止转发源IP地址位于192.168.1.8与192.168.2.8之间的TCP数据包

iptables -t filter -A FORWARD -m iprange --src-range 192.168.1.8-192.168.2.8 -j ACCEPT

3、MAC地址匹配

iptables规则时使用"-m mac --mac-source MAC地址"的形式,用来检查数据包的源MAC地址。由于MAC地址本身的局限性,此类匹配条件一般只适用于内部网络。

禁止mac地址为00:0c:29:04:e4:dc的主机访问本机的ssh端口

iptables -t filter -A INPUT -p tcp --dport 22 -m mac --mac-source 00:0c:29:04:e4:dc -j DROP

4、状态匹配

iptabls规则时使用"-m state --state连接状态"的形式,基于iptables的状态跟踪机制用来检查数据包的链接状态(State)。常见的连接状态包括NEW(与任何连接无关的)、EXTABLISHED(响应请求或者已建立连接的)和RELATED(与已有连接相关性的,如FTP数据连接。)

只开放本机的Web服务,但对发给本机的TCP应答报文予以放行,其他入站报文均丢弃

  1. iptables -I INPUT -p tcp -m multiport --dport 22,53000 -j ACCEPT
  2. iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
  3. iptables -P INPUT DROP

ACTION

执行的动作,常见的几个如下

  • ACCEPT:接收。
  • DROP:丢弃,不给对端任何回应。
  • REJECT:拒绝,拒绝后给对端一个回应。
  • SNAT:修改请求报文的源地址。
  • DNAT:修改请求报文的目标地址。
  • MASQUERADE:可以伪装IP地址。实现自动化的snat。

通过-j参数指定,分为基本动作和扩展动作,扩展动作通过自定义链实现的。

动作

说明

示例

ACCEPT

允许数据包通过。

处理后不再比对其它规则,直接跳往下一规则链(nat:postrouting)

REJECT

拦阻该数据包,并传送数据包通知对方。

处理后不再比对其它规则,直接中断过滤程序。

message默认是:icmp-port-unreachable。可选的message有:

icmp-net-unreachable

icmp-host-unreachable

icmp-port-unreachable

icmp-proto-unreachable

icmp-net-prohibited

icmp-host-prohibited

icmp-admin-prohibited

Icmp-echo-reply

tcp-reset(这个数据包会要求对方关闭联机)。

iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

DROP

丢弃数据包不予处理,处理后不再比对其它规则,直接中断过滤程序。

这时客户端会感觉自己的请求沉入大海,等过了超时时间才会有反应。

REDIRECT

将数据包重新导向到另一个端口(PNAT)。

处理后,会继续比对其它规则。

例1:将本机的80端口转发到8080端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

SNAT

改写数据包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围。

处理后,将直接跳往下一个规则炼(mangle:postrouting)。

SNAT报文必须存在POSTROUTING链中,也就是从内部发出去的报文经过的最后一道关卡,对应的–to-source选项

示例:所有从内部机器IP=192.168.10.111发过来的报文都会被隐藏源IP,并转发到192.168.1.111机器上

iptables -t nat -I POSTROUTING -s 192.168.10.111 -j SNAT --to-source 192.168.1.111

DNAT

改写数据包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围。

处理后,将会直接跳往下一个规则炼(filter:input 或 filter:forward)。

一般配置在 PREROUTING链中。

示例:所有从外部访问主机192.168.1.34对应的端口为53000的服务,都会被转发到192.168.100.100:53000 上,目标IP被修改

iptables -t nat -A PREROUTING -d 192.168.1.34 -p tcp -m tcp --dport 53000 -j DNAT --to-destination 192.168.100.100:53000

MASQUERADE

改写数据包来源 IP 为防火墙 NIC IP,可指定 port 对应的范围。

处理后,直接跳往下一规则链(mangle:postrouting)。

MASQUEREAD与SNAT 类似,也是将内部发出去的报文映射成公网IP,不同是MASQUEREAD可指定网卡,无需关心IP是什么,即使IP发生变化也可以正常映射

当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。

例1:iptables -t nat -I POSTROUTING -s 192.168.10.111 -j -o eth0 MASQUEREAD

例2:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

LOG

将数据包通信纪录在 /var/log/messages 中。

处理后,会继续比对其它规则。

--log-level 可以给指定日志加级别:emerg,alert,crit,error,warn,notice,debug,info

--log-prefix 可以给指定的日志加标签,便于查看

iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

MIRROR

镜射数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包送回,处理后,将会中断过滤程序。

QUEUE

中断过滤程序,将数据包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用……等。

RETURN

结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。

MARK

将数据包标上某个代号,以便提供作为后续过滤的条件判断依据,处理后,将会继续比对其它规则。

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

其他应用场景

内网的服务器对外服务(端口映射)

目标:使外网用户可以访问到局域网192.168.138.21这台HTTP服务

  1. echo 1 > /proc/sys/net/ipv4/ip_forward
  2. iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.138.21
  3. iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

在网关服务器进行透明代理

目标: 使局域网用户,访问外网web服务时,自动使用squid作web透明代理服务器
 

  1. echo 1 > /proc/sys/net/ipv4/ip_forward
  2. iptables -t nat -A PREROUTING -s 192.168.138.0/24 -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.138.1
  3. iptables -t nat -A PREROUTING -s 192.168.138.0/24 -p tcp --dport 80 -i eth0 -j REDIRECT --to 3128 
  4. iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 

ip映射

假设一家ISP提供园区Internet接入服务,为方便管理,该ISP分配给园区用户的IP地址都是伪IP,部分用户要求建立自己的WWW 服务器对外发布信息。可以在防火墙的外部网卡上绑定多个合法IP地址,然后通过ip映射将发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。

该ISP分配给A单位www服务器的ip情况:伪ip(192.168.1.100)、真实ip(202.110.123.100)
该ISP分配给B单位www服务器的ip情况:伪ip(192.168.1.200)、真实ip(202.110.123.200)
linux防火墙的ip地址情况:内网接口eth1(192.168.1.1)、外网eth0(202.110.123.1)

配置流程如下:

  1. #将分配给A、B单位的真实ip绑定到防火墙的外网接口
  2. ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0
  3. ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0
  4. #对防火墙接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT)
  5. iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100
  6. iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200
  7. #对防火墙接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT)
  8. iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100
  9. iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号