iptables命令常用规则汇总
iptables非常强大,但是参数选项多,学习成本较高。本文将常用的iptables的命令进行汇总,在关键时刻方便拿来即用。
iptables的四表五链
iptables的四表五链是指iptables中的四个表和五个链。四个表分别是:
- filter表:用于过滤数据包,控制网络流量。
- nat表:用于对数据包进行地址转换,实现网络地址转换(NAT)功能。
- mangle表:用于修改数据包的头部信息,比如TTL、TOS等。
- raw表:用于处理数据包的连接状态,对于未建立连接的数据包进行处理。
五个链分别是:
- PREROUTING:数据包进入路由之前进行处理。
- INPUT:数据包进入本机之前进行处理。
- FORWARD:数据包转发到其他主机之前进行处理。
- OUTPUT:数据包从本机发出之前进行处理。
- POSTROUTING:数据包离开路由之后进行处理。
iptables中需要用 -t <表名> 来指定查看对应表的规则,不指定默认为filter表的规则。例如查看nat表的规则:
iptables -t nat -L
查看表的详细规则
iptables -t nat -nvL --line-numbers
显示编号方便删除指定的规则。
端口转发
开启内核转发
echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf sysctl -p
本地端口转发
本地端口转发,只涉及一台机器。比如外部访问本机的2222端口转发到本地的22端口。
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-port 22
添加上面的规则后,外部可以访问,但是本地127.0.0.1无法访问。因为本地的请求不经过PREROUTING。
多主机端口转发
A的ip是192.168.1.2,B的ip是192.168.1.1,A和B是内网互通的,现在有一个外部ip(1.2.3.4)为C,C想通过访问B的2222端口从而访问到A的22端口。
iptables -t nat -A POSTROUTING -d 192.168.1.2 -p tcp --dport 22 -j SNAT --to-source 192.168.1.1
该命令很重要!将所有从A机器返回的TCP流量的源地址改为B机器的IP地址,不管单端口还是多端口转发都需要执行。
单端口转发
iptables -t nat -A PREROUTING -s 1.2.3.4 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.2:22
第一条命令将所有目的地为1.2.3.4且端口为2222的TCP流量重定向到A机器的22端口。
注意:这两条都要在B机器上执行,因为它是外部访问的目标机器。
如果不想限制外部访问的来源是C,可以不指定-s选项。
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.2:22
这样任意外部ip访问都可以请求转发了。
多端口转发
针对上面的命令,如果是多端口转发,可以分为多对一和多对多的情况。
注意:经测试,iptables不支持在一条命令中实现不同主机的多端口的不同映射。比如同时将B的80转发到A的8080,将B的443转发到A的4443。
多对一端口转发
例如将B的50000到60000的端口全部转发到A的443端口,命令如下:
iptables -t nat -I PREROUTING -p tcp -m multiport --dport 50000:60000 -j DNAT --to-destination 192.168.1.2:443
注意:”–dports” 参数指定端口范围,使用冒号 “:” 表示起始端口和结束端口之间的范围。
多对多端口转发
例如将B的50000到60000的端口全部转发到A的50000到60000的端口,命令如下:
iptables -t nat -I PREROUTING -p tcp -m multiport --dport 50000:60000 -j DNAT --to-destination 192.168.1.2:50000-60000
当然多个端口也可以是不连续的,比如80、443、8080同端口转发,端口用逗号”,”隔开,–to-destination后面的ip不用再指定端口。
iptables -t nat -I PREROUTING -p tcp -m multiport --dport 80,443,8080 -j DNAT --to-destination 192.168.1.2
注意:–to-destination 参数后,使用”-“表示起始端口和结束端口之间的范围。
MASQUERADE的作用
MASQUERADE作用是,从服务器的网卡上,自动获取当前ip地址来做NAT,就不用手动指定转换的目的IP了,实现了动态的SNAT。
iptables -t nat -A POSTROUTING -d 192.168.1.2 -p tcp --dport 22 -j SNAT --to-source 192.168.1.1
这条命令用MASQUERADE可以换成下面的写法。
iptables -t nat -A POSTROUTING -d 192.168.1.2 -p tcp --dport 22 -j MASQUERADE
这样的优点在于机器B的ip如果发生变化,不用重新修改–to-source,iptables会自动替换,实现动态SNAT。
iptables增加、插入、删除规则
- -A 在最后一条规则后新增规则
- -I 默认将新规则插入到第一条
- -F 不指定<链名>,默认清空整个表的规则
- -D <链名> <规则编号> 删除指定编号的规则
在第n条规则后插入规则
iptables -I <chain> <rule_number> <new_rule>
比如要在nat表的POSTROUTING链的第三条规则后增加一条规则。
iptables -t nat -I POSTROUTING 3 <new_rule>
删除指定表中某个链的全部规则
iptables -t 表名 -F 链名
其中,表名可以是filter、nat、mangle、raw等,链名可以是INPUT、OUTPUT、FORWARD等。
例如,要清空filter表中INPUT链的所有规则,可以使用以下命令:
iptables -t filter -F INPUT
注意这个操作是不可逆的,清空后所有的规则都将被删除。
iptables 拒绝入方向流量
拒绝ip段访问本机端口段的请求
例如将源IP为47.100.0.0/16的TCP流量目的端口为40000-60000的数据包丢弃,命令如下:
iptables -A INPUT -s 47.100.0.0/16 -p tcp --dport 40000:60000 -j DROP
拒绝指定ip的所有请求
例如拒绝 47.100.0.1 的所有请求,命令如下:
iptables -A INPUT -s 47.100.0.1 -j DROP
拒绝ip段的icmp流量
例如拒绝10.8.0.0/16 ip段的所有icmp且type为8的流量。
iptables -A INPUT -s 10.8.0.0/16 -p icmp --icmp-type 8 -j DROP
同理其他协议的流量,也可以修改iptables 的 -p 参数,支持 TCP,UDP,ICMP,ICMPv6,esp,ah,sctp,udplite 和 all 协议。
限制只有指定IP段能访问
白名单:先允许,再拒绝。
例如只允许192.168.0.0/16的ip段访问本机,其他ip的请求都拒绝,命令如下:
iptables -I INPUT -s 192.168.0.0/16 -j ACCEPT iptables -I INPUT -s 0.0.0.0/0 -j DROP
REJECT 和 DROP 的区别
REJECT
和DROP
是iptables中的两种不同的动作。
REJECT
会向源地址回送一条信息,告诉它被拒绝了,而DROP
则是默默地将数据包丢弃。所以使用REJECT
可以让源地址知道它的请求被拒绝了,而DROP
则会使源地址一直等待直到超时。
应用场景
- DROP 的处理效率明显比 REJECT 低。DROP 会导致客户端不停的发送 SYN 包到服务器,最终客户端等待 tcp timeout才停止发送数据包,会占用更多带宽。
- 从安全层面来考虑,DROP 不会向客户端返回任何数据包,无疑是最安全的。
iptables 拒绝出方向流量
放行某个端口,但拒绝其他全部流量
以ssh为例,只放通22端口入方向的流量,拒绝所有出流量。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -j DROP
先允许,再拒绝。第二条命令允许与已建立的连接相关的出站流量,为了保证进来的SSH连接能够正常通信(即能够通过SSH发送命令和接收回应)。
拒绝出方向的域名请求
一般 iptables 自带的都有 string 模块,这个模块的作用就是匹配字符串,匹配到泛域名的 URL,然后就把数据包丢弃,就实现了屏蔽泛域名的功能。
例如要限制访问 youtube.com,命令如下:
iptables -A OUTPUT -m string --string "youtube.com" --algo bm --to 65535 -j DROP
对命令的参数进行解释。
-m string # 指定模块; --string "youtube.com" # 指定要匹配的字符串(域名、关键词等); --algo bm # 指定匹配字符串模式/算法(还有一种更复杂的算法:kmp); --to 65535 # 指定端口,这里代表所有端口(1-65535); -j DROP # 指匹配到数据包后处理方式,这里是丢弃数据包。
iptables伪造发送源ip
使用内网的两台主机进行测试。
iptables -t nat -D POSTROUTING -d <目的ip> -o eth0 -j SNAT --to-source <伪造源ip>
经测试内网的主机是可以的,需要注意iptables伪造的ip能发送,但是无法收到回包。
图中fake-ip.py和iptables伪造源ip的作用是一样的,但测试公网主机无法收到伪造的报文。
iptables限制端口的并发数和请求频率
安装压测工具ab
yum install httpd-tools -y
命令如下,注意最后的斜杠 / 一定不能少。
ab -n 1000 -c 10 http://ip:port/
- -n 总共请求1000次
- -c 每次并发10个
限制端口的每分钟请求频率
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set --name HTTP --rsource iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 100 --name HTTP --rsource -j DROP
这个规则将在每个IP地址的每个60秒内限制HTTP连接到80端口的数量为100个。如果超过了这个限制,连接将被拒绝。
限制端口并发数
限制端口总并发数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT
使用iptables的connlimit模块来实现限制80端口的并发量不超过10个,超过则拒绝连接。注意这里是对所有ip并发的总数进行限制的,不是对于单个ip的并发限制。
限制单个ip端口并发数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
--connlimit-mask 32
: 指定掩码为32,表示限制单个IP的并发连接数。上面的规则只能限制单个IP的并发连接数,如果需要限制所有的IP的并发连接数,可以使用--connlimit-mask 0
。
iptables规则取反
iptables 用 !取反的,例如禁止除了tcp协议之外的所有协议。
iptables -A INPUT ! -p tcp -j DROP
禁止除了 192.168.0.0/16 之外所有的ip。
iptables -A INPUT ! -s 192.16.0.0/16 -j DROP
让iptables规则永久生效
默认iptables的规则在重启后会失效,所以需要将规则持久化。
使用 iptables-persistent
iptables-persistent 是一个 Debian/Ubuntu 系统上的工具,可以在重新启动后自动加载 iptables 规则。使用以下命令安装:
apt-get install -y iptables-persistent
在安装过程中,会被要求保存当前的 iptables 规则。安装完毕后,可以使用以下命令来保存新的 iptables 规则。
service netfilter-persistent save
使用iptables-save 保存规则
iptables-save > /etc/iptables.rules
将 iptables 规则保存到 /etc/iptables.rules 文件中,可以使用以下命令来加载。
iptables-restore < /etc/iptables.rules
为了在系统启动时自动加载 iptables 规则,可以将上述命令添加到 /etc/rc.local 文件中。该文件中的命令将在每次系统启动时自动执行。
微信赞赏支付宝赞赏
发表评论