Linux系统 iptables进阶学习

发布时间 2023-08-11 01:56:01作者: LB_运维技术
一、IPTABLES四表五链学习:
(1)Filter表:是iptables的默认表,它有以下三种内建链(chains):
INPUT链 – 处理来自外部的数据。
OUTPUT链 – 处理向外发送的数据。
FORWARD链 – 将数据转发到本机的其他网卡设备上。
(2)NAT表:NAT表有三种内建链:
PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
OUTPUT链 – 处理本机产生的数据包
(3)Mangle表:Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链(chains):
PREROUTING
OUTPUT
FORWARD
INPUT
POSTROUTING
(4) Raw表:Raw表用于处理异常,它具有2个内建链:
PREROUTING chain
OUTPUT chain

二、IPTABLES 规则(Rules)学习:
Rules包括一个条件和一个目标(target)
如果满足条件,就执行目标(target)中的规则或者特定值。
如果不满足条件,就判断下一条Rules。

三、目标值(Target Values)在target里指定的特殊值:
ACCEPT – 允许防火墙接收数据包
DROP – 防火墙丢弃包
QUEUE – 防火墙将数据包移交到用户空间
RETURN – 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。

四、查看表规则命令:
查看各表中的规则命令:iptables -t filter --list 相当于 iptables -nL
查看mangle表:iptables -t mangle --list
查看NAT表:iptables -t nat --list
查看RAW表:iptables -t raw --list

五、清空所有iptables规则
注:在配置iptables之前,你通常需要用iptables --list命令或者iptables-save命令查看有无现存规则,因为有时需要删除现有的iptables规则
iptables --flush
或者
iptables -F
例如清除iptables nat表规则 :iptables -t nat -F

六、永久生效
说明:当你删除、添加规则后,这些更改并不能永久生效,这些规则很有可能在系统重启后恢复原样。如下配置让配置永久生效
(1)生效方式1:
yum install -y iptables*
service iptables save(默认保存的配置在/etc/sysconfig/iptables)
重启iptables服务
service iptables stop
service iptables start
systemctl enable iptables.service
(1)生效方式2:
iptables-save > /etc/sysconfig/iptables.rules
chmod 755 /etc/sysconfig/iptables.rules
在/etc/rc.local里添加下面这段文件(执行上面这条命令会自动添加,但是要有755权限)。权限为755
iptables-restore < /etc/sysconfig/iptables.rules 或者 iptables-restore /etc/sysconfig/iptables.rules

七、追加iptables规则
(1)追加规则的完整实例:仅允许SSH服务
1.清空所有iptables规则
iptables -F
2.接收目标端口为22的数据包
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
3.拒绝所有其他数据包
iptables -A INPUT -j DROP

八、更改默认策略(禁止操作,否则你就无法ssh连接了,只能重启解决)
(1)给三个链单独添加DROP规则
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
(2)更改默认策略
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

九、配置应用程序规则
(1)允许接收远程主机的SSH请求
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
(2)允许发送本地主机的SSH响应
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
说明:
-m state: 启用状态匹配模块(state matching module)
–-state: 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED
–sport 22: sshd监听22端口,同时也通过该端口和客户端建立连接、传送数据。因此对于SSH服务器而言,源端口就是22
–dport 22: ssh客户端程序可以从本机的随机端口与SSH服务器的22端口建立连接。因此对于SSH客户端而言,目的端口就是22
(3)如果服务器也需要使用SSH连接其他远程主机,则还需要增加以下配置:
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

10、规则增删改查等相关参数
iptables -t nat -D POSTROUTING 1
-A 追加规则-->iptables -A INPUT
-D 删除规则-->iptables -D INPUT 1(编号)
-R 修改规则-->iptables -R INPUT 1 -s 192.168.1.0 -j DROP 取代现行规则,顺序不变(1是位置)
-I 插入规则-->iptables -I INPUT 1 --dport 22 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位
-L 查看规则-->iptables -L INPUT 列出规则链中的所有规则
-N 新的规则-->iptables -N allowed 定义新的规则


(1)查看Filter表中的所有链以及规则
iptables -nL --line-numbers
(2)向Filter表的INPUT链中新增接收所有来自192.168.1.1的数据包并指定其序号为2,如果占用其他主机IP的序号,则其他主机序号会往下递减一个序号
iptables -I INPUT 1 -s 192.168.1.1/32 -j ACCEPT
iptables -I INPUT 1 -s 192.168.1.2/32 -j ACCEPT
(3)删除Filter表中INPUT链中序号为2的规则
iptables -D INPUT 2
(4)向filter表的INPUT链中追加(-A)一条拒绝所有发送到192.168.1.1的数据包
iptables -A INPUT -d 192.168.1.1/32 -j DROP
(5)在nat表的PREROUTING链中新增一条序号为1的LOG规则(LOG目标通常放在对数据包过滤和处理前,可以用来分析数据包流向。)
说明:-I:表示insert,即向链中插入一条规则,PREROUTING为链名,没有指定序号默认为1,即顶部插入; -j:规则目标(Target),LOG代表获取数据包并打印日志; --log-prefix:日志信息的前缀,只能在-j LOG的情况下使用
iptables -I PREROUTING -t nat -j LOG --log-prefix "[NAT_PREROUTING_LOG]"
(6)实战篇:
1、禁止源地址192.168.1.1访问服务器的22,53,80端口
iptables -I INPUT -s 192.168.1.1/32 -p tcp -m multiport --dport 22,53,80 -j DROP
2、对于访问量比较大的服务器,例如192.168.1.1,可以通过raw表配置绕过连接跟踪:
iptables -t raw -A PREROUTING -d 192.168.1.1/32 -p tcp --dport 80 -j NOTRACK
3、将访问192.168.1.1:80的请求转到192.168.1.2:9000上
iptables -t nat -A PREROUTING -d 192.168.1.1 -t tcp --dport 80 -j DNAT --to-destination 192.168.1.2:9000
4、将访问本机的udp 314端口转发到3140上
 iptables -t nat -A PREROUTING -p udp --dport 314 -j DNAT --to-destination 124.222.170.39:3140
5、实现所有192.168.1.0/24的地址通过123.123.123.123公网地址访问公网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 123.123.123.123
6、拒绝一分钟内新建超过4次SSH连接的IP再次连接
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH --rsource -j DROP

IPTABLES模块学习:
一、multiport模块:(连续匹配多个端口)
(1)要求192.168.1.0/24网段的所有IP只能访问22,80,443端口,其他的拒绝(该命令具有风险)
iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -s 192.168.1.0/24 -j ACCEPT
iptables -t filter -A INPUT -p tcp -j DROP
或者:(只放开22,80,443端口)
iptables -t filter -A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT
iptables -t filter -A INPUT -p tcp  -j DROP

(2)要求192.168.1.0/24网段的所有ip只能访问22-90端口,其他拒绝
iptables -t filter -A INPUT -p tcp -m multiport --dport 22:90 -j ACCEPT
iptables -t filter -A INPUT -p tcp  -j DROP(其他未被允许的端口禁止访问)
iptables -t filter -A INPUT -p tcp  -m multiport --dports 80,22,8080:9090 -j ACCEPT (对所有的地址开放本机的tcp 80、22、8080-9090端口的访问)

二、iprange模块:(连续匹配多个IP)
--src-range : 源地址范围
--dest-range: 目标地址范围
(1)要求只有192.168.1.1到192.168.1.20访问23端口,其他的拒绝
iptables -t filter -A INPUT -p tcp -m iprange --src-range 192.168.1.1-192.168.1.20 -j ACCEPT
iptables -t filter -A INPUT -p tcp  -j DROP 

三、string模块:(按照内容进行匹配)
--string parttern:指定要匹配的字符串
--algo {bm|kmp}:匹配的查询算法
(1)要求访问的内容包含hello的内容不允许访问,其他的可以
iptables -t filter -A OUTPUT -p tcp -m string --string "hello" --algo kmp -j DROP

四、time模块(UTC时间):根据时间来控制访问(UTC)可以指定个端口
--timestart hh:mm[:ss]:开始时间
--timestop hh:mm[:ss]:结束时间
--monthdays day[,day...]:指定一个月的某一天
--weekdays day[,day...]:指定周还是周天
(1)要求上午的08:00到上午的10:30不允许访问,其他时间可以(UTC时间比北京时间要提前8个小时)
iptables -t filter -A INPUT -p tcp -m time --timestart 00:00 --timestop 02:30 -j DROP

五、icmp模块:(控制icmp协议)
--icmp-type{type[/code]|typename}
echo-request(8)请求(我可以ping别人,别人休想ping我)
echo-reply(0)回应(别人可以ping我,我休想ping别人)
(1)禁止他人ping我,但本主机可以ping他人
iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j DROP
(2)他人可以ping我,但本主机不能ping他人
iptables -t filter -I INPUT -p icmp --icmp-type "echo-reply" -j DROP
(3)允许对所有的地址开放本机的基于ICMP协议的数据包
iptables -t filter -A INPUT -p icmp -j ACCEPT

六、connlimit模块:(控制并发数)没有什么用
--connlimit-upto n:如果现有连接数小于或等于n则匹配 
--connlimit-above n: 如果现有连接数大于n则匹配
(1)要求登录192.168.1.1 的窗口最多两个
 iptables -t filter -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

七、limit模块:(针对 报文速率 进行限制。秒、分钟、小时、天)
--limit rate[/secon|/mintue|/hour|/day] :报文数量
--limit-burst number:报文数量(默认:5)
数据包数量=网速*1000/1500
限速:限制传输的宽带不可以超过500k(500*1000/1500=333包)
(1)要求每秒只能够传输500k大小的数据
iptables -t filter -A INPUT -p tcp -m limit --limit 333/s -j ACCEPT
iptables -t filter -A INPUT -p icmp  -j DROP
(2)允许10个数据报文快速通过,超过的数据报文1/m(一分钟一个)
iptables -t filter -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
iptables -t filter -A INPUT -p icmp  -j DROP