[Linux系列|iptables]Iptables详解②
Posted 小肖同学..
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Linux系列|iptables]Iptables详解②相关的知识,希望对你有一定的参考价值。
一. iptables扩展模块
1. multiport模块
使用multiport模块可以添加对个不连续的端口,最多可以添加15组。语法:-m multiport <--sport | --dport | --ports> 端口1 [,端口2,端口3....,端口n]
示例:192.168.122.1 访问本机的20,21,22,443端口允许通过。
root@uos-PC:~# iptables -t filter -A INPUT -s 192.168.122.1 -p tcp -m multiport --dport 20,21,22,443 -j ACCEPT
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~# iptables -t filter -A INPUT -s 192.168.122.1 -p tcp -j DROP
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~# iptables -L -n -v -t filter --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 2400 153K ACCEPT tcp -- * * 192.168.122.1 0.0.0.0/0 multiport dports 20,21,22,443
2 39 2340 DROP tcp -- * * 192.168.122.1 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
root@uos-PC:~#
2. iprange模块
· 使用iprange模块可以指定“一段“连续的IP地址范围”,用于匹配报文的源地址或者目标地址,iptables扩展模块中有两个扩展匹配条件可以使用。
· --src-range ip-from -- [ip-to] 源地址范围;
· --dst-range ip-from -- [ip-to] 目标地址范围;
示例: 192.168.122.1--192.168.122.10范围内的地址ping本机,则拒绝。
root@uos-PC:~# iptables -t filter -A INPUT -p icmp -m iprange --src-range 192.168.122.1-192.168.122.10 -j REJECT
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~# iptables -L -n -v -t filter --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 source IP range 192.168.122.1-192.168.122.10 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
3. string模块
· 使用string扩展模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则匹配调节。
--algo bm | kmp: 字符串匹配查询的算法
--string pattern 匹配的字符串。
root@uos-PC:~# iptables -t filter -I OUTPUT -d 192.168.122.1 -m string --string 'hello' --algo kmp -j DROP
root@uos-PC:~#
root@uos-PC:~# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 192.168.122.1 STRING match "hello" ALGO name kmp TO 65535
root@uos-PC:~#
测试:
(base) uos@uos-PC:~$ curl 192.168.122.27
^C
(base) uos@uos-PC:~$ curl 192.168.122.27/1.html
test iptables
(base) uos@uos-PC:~$
4. time模块
· 使用time扩展模块,根据时间段去匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。
· --timestart hh:mm:ss 开始时间
· --timestop hh:mm:ss 结束时间
· --monthdays day[,day]... 指定一个月的某一天
· --weekdays day[, day...] 指定周一到周天
· --kerneltz 使用内核时区而不是UTC时间
示例:拒绝每天在9.46--9.48时间段,192.168.122.1的主机向本机发送icmp协议
root@uos-PC:~# iptables -t filter -R INPUT 1 -p icmp -s 192.168.122.1 -m time --timestar 01:46 --timestop 01:48 -j REJECT
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
7 588 REJECT icmp -- * * 192.168.122.1 0.0.0.0/0 TIME from 01:46:00 to 01:48:00 UTC reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
5. icmp模块
· 默认情况下当我们禁ping后,其他主机无法ping通本机,本主机也无法ping通其他主机。假设现在需求是本机可以ping通其他主机,而其他主机依然无法ping通本机。
--icmp-type echo-request | echo-reply 指定icmp类型,echo-request(请求),echo-request(回应)
示例:允许192.168.122.1ping通本机,不允许本机ping通192.168.122.1
root@uos-PC:~# iptables -t filter -I INPUT -s 192.168.122.1 -p icmp -m icmp --icmp-type "echo-request" -j REJECT
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT icmp -- * * 192.168.122.1 0.0.0.0/0 icmptype 8 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
root@uos-PC:~#
测试:
root@uos-PC:~# ping 192.168.122.1
PING 192.168.122.1 (192.168.122.1) 56(84) bytes of data.
64 bytes from 192.168.122.1: icmp_seq=1 ttl=64 time=0.309 ms
64 bytes from 192.168.122.1: icmp_seq=2 ttl=64 time=0.218 ms
64 bytes from 192.168.122.1: icmp_seq=3 ttl=64 time=0.236 ms
^C
--- 192.168.122.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 38ms
rtt min/avg/max/mdev = 0.218/0.254/0.309/0.041 ms
root@uos-PC:~#
(base) uos@uos-PC:~/Desktop$ ping 192.168.122.27
PING 192.168.122.27 (192.168.122.27) 56(84) bytes of data.
^C
--- 192.168.122.27 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 60ms
(base) uos@uos-PC:~/Desktop$ ping 192.168.122.27
PING 192.168.122.27 (192.168.122.27) 56(84) bytes of data.
From 192.168.122.27 icmp_seq=1 Destination Port Unreachable
From 192.168.122.27 icmp_seq=2 Destination Port Unreachable
From 192.168.122.27 icmp_seq=3 Destination Port Unreachable
From 192.168.122.27 icmp_seq=4 Destination Port Unreachable
From 192.168.122.27 icmp_seq=5 Destination Port Unreachable
^C
--- 192.168.122.27 ping statistics ---
5 packets transmitted, 0 received, +5 errors, 100% packet loss, time 104ms
(base) uos@uos-PC:~/Desktop$
6. limit模块
· limit扩展模块:针对报文速率进行限制。
· 限制单位时间内流入包的数量,我们可以以秒为单位进行限制,也可以以分钟,小时,天作为单位进行限制。
· --limit rate/[second | minute | hour | day]
· --limit-burst number 超过限制速率的包,允许超过burst所设定值,默认可超过5个
示例1:限制主机每分钟接收10个ICMP数据包(差不多6s接收一个数据包)
root@uos-PC:~# iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
root@uos-PC:~#
root@uos-PC:~# iptables -t filter -A INPUT -p icmp -j REJECT
root@uos-PC:~# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
root@uos-PC:~#
示例2:允许ICMP瞬间通过10个数据包通过,超过的数据包每分钟仅能通过一个
root@uos-PC:~# iptables -t filter -I INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
root@uos-PC:~# iptables -t filter -A INPUT -p icmp -j REJECT
root@uos-PC:~# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 1/min burst 10
0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
root@uos-PC:~#
7. connlimit模块
· 根据每个客户端ip做并发连接数数量匹配;可以放置DOS攻击。
· --connlimit-upto N #连接的数量小于等于N时匹配
· --connlimit-above N #连接的数量大于N时匹配
示例:当连接数超过2个之后就拒绝。
root@uos-PC:~# iptables -t filter -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 #conn src/32 > 2 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
root@uos-PC:~#
8. state模块
· state 扩展模块,可以根据”连接追踪机制“去检查连接的状态,较耗资源
· conntrack机制:追踪本机上的请求和响应之间的关系
转态类型:
NEW: 新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发
出的请求
ESTABLISHED: NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信
状态
RELATED: 新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关
系
INVALID: 无效的连接,如flag标记不正确
UNTRACKED: 未进行追踪的连接,如:raw表中关闭追踪
· 记录旧信息路径
/prox/sys/net/netfilter/nf_conntrack_max
示例1:老用户允许连接,新用户拒绝连接
root@uos-PC:~# iptables -t filter -I INPUT -m state --state ESTABLISHED -j ACCEPT
root@uos-PC:~#
root@uos-PC:~# iptables -t filter -I INPUT -m state --state NEW -j REJECT
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 state NEW reject-with icmp-port-unreachable
244 17008 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
root@uos-PC:~#
示例2: 允许本机可以访问192.168.122.1,但是192.168.122.1不能访问本机
root@uos-PC:~# iptables -A INPUT -s 192.168.122.1 -m state --state NEW -j REJECT
root@uos-PC:~#
root@uos-PC:~#
root@uos-PC:~# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 192.168.122.1 0.0.0.0/0 state NEW reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
root@uos-PC:~#
二. iptables的NAT转发
1. 什么是NAT
· 网络地址转换(NAT)就是对数据包的网络地址(ip + port)进行转换。
· 例如:机器自己的ip是10.10.10.10是能正常与外部正常通信的,但是192.168.1的私有ip段,无法与外界通信,因此当源地址为192.168.1.x段的包要出去时,机器就会将源ip换成自己的10.10.10.10再发送出去;收到应答包时,在进行相反的转换,这就是NAT的基本过程。
2. NAT的几种模式
· SNAT:源地址转换
· DNAT:目标地址装换
· PNAT:端口转换
3. SNAT场景实例
## 开启转发功能
root@Route:~# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
root@Route:~# sysctl -p
方式一:
##配置iptables的SNAT转发
root@Route:~# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -j SNAT --to 10.10.10.129
root@Route:~#
root@Route:~#
root@Route:~# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2 113 SNAT all -- * * 192.168.1.0/24 0.0.0.0/0 to:10.10.10.129
root@Route:~#
方式二:
root@Route:~# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
4. DNAT场景实例
root@Route:~# iptables -t nat -I PREROUTING -d 10.10.10.129 -p tcp --dport 2222 -j DNAT --to 192.168.1.11:22
root@Route:~#
root@Route:~#
root@Route:~# iptables -t nat -A PREROUTING -d 10.10.10.129 -p tcp --dport 2223 -j DNAT --to 192.168.1.12:22
root@Route:~#
root@Route:~#
root@Route:~# iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- * * 0.0.0.0/0 10.10.10.129 tcp dpt:2222 to:192.168.1.11:22
0 0 DNAT tcp -- * * 0.0.0.0/0 10.10.10.129 tcp dpt:2223 to:192.168.1.12:22
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
11 738 SNAT all -- * * 192.168.1.0/24 0.0.0.0/0 to:10.10.10.129
root@Route:~#
三. iptables自定义链
1. 为什么要使用自定义链
· 此前我们一直在使用iptables的默认链中定义规则,那么此处,我们就来了解一下定义链,这里可能有疑问,iptables的默认链就已经能够满足我们了,为什么需要自定义链呢?
· 当默认链中的规则非常多时,不便于管理。假设INPUT链中存放了200条规则,这200条规则有针对80端口的,有针对22端口的,有针对私网ip的,等等。
· 假设想要修改针对80端口的规则,可能需要从头到尾看一遍200条规则,找出哪些规则是针对80端口的,这显然不合理,所以我们需要使用自定义链,通过自定义链即可解决上述问题。
· 假设我们定义了一条链,链名叫IN_HTTP,我们可以将所有针对80端口入站规则都写入到这条自定义链中,当以后修改针对80端口入站规则时,就直接修改IN_HTTP链中的规则就可以了,即使默认链中有在多的规则,也没有关系,因为所有针对80端口的入站规则都存放在IN_HTTP链中,同理,我们可以将针对22端口的出站规则放入到OUT_SSH自定义链中。
2. 配置子定义链
2.1 先在指定的表中创建链
root@Route:~# iptables -t filter -N IN_HTTP
root@Route:~#
root@Route:~#
root@Route:~# iptables -t filter -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain IN_HTTP (0 references)
pkts bytes target prot opt in out source destination
root@Route:~#
2.2 给自定义链中添加规则
root@Route:~# iptables -t filter -I IN_HTTP -p icmp -j REJECT
root@Route:~#
root@Route:~#
root@Route:~# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain IN_HTTP (0 references)
pkts bytes target prot opt in out source destination
0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
root@Route:~#
2.3 音乐自定义链到INPUT链上
root@Route:~# iptables -I INPUT -p icmp -j IN_HTTP
root@Route:~#
root@Route:~#
root@Route:~# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 IN_HTTP icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain IN_HTTP (1 references)
pkts bytes target prot opt in out source destination
0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Linux防火墙与端口设置
Ubuntu开启防火墙端口
Ubuntu使用的防火墙名为UFW(Uncomplicated Fire Wall),是一个iptable的管理工具。因为iptable是根据系统管理员编写的一系列规则筛选网络数据包,比较复杂,所以UFW对其进行了简化。UFW可以帮助增强服务器安全,但是如果真正对服务器安全感兴趣,还是应该学习如何为 iptable 编写规则来更好的调整服务器的安全级别。
1. 查看本地端口开启情况
sudo ufw status
开启防火墙的状态下,只有系统允许的端口才能被其他主机访问。
2. 关闭防火墙
sudo ufw disable
sudo ufw status
3. 开启防火墙,允许访问特定端口
sudo ufw enable
udo ufw allow 81 规则已添加 规则已添加 (v6)
sudo ufw status 状态: 激活
4. 不允许访问特定端口
sudo ufw deny 81
规则已更新
规则已更新 (v6)
sudo ufw status 状态: 激活 至 动作 来自 - -- -- 80 ALLOW Anywhere 8001 ALLOW Anywhere 81 DENY Anywhere 80 (v6) ALLOW Anywhere (v6) 8001 (v6) ALLOW Anywhere (v6) 81 (v6) DENY Anywhere (v6)
5.简单开启/禁用
sudo ufw allow|deny [service] sudo ufw allow smtp #允许所有的外部IP访问本机的25/tcp端口(smtp) sudo ufw deny smtp #禁止外部访问smtp服务 sudo ufw allow 22/tcp #允许所有的外部IP访问本机的22/tcp端口(ssh) sudo ufw allow 53 #允许外部访问53端口(tcp/udp) sudo ufw allow from 192.168.1.100 #允许此IP访问所有的本机端口 sudo ufw allow proto tcp from 192.168.1.30 to 192.1681.5 port 65000 #允许从192.168.1.30到192.1681.5的SSH连接
删除规则 sudo ufw delete [rule] sudo ufw delete allow smtp #删除某条规则
以上是关于[Linux系列|iptables]Iptables详解②的主要内容,如果未能解决你的问题,请参考以下文章
第二十五天 IPtable基础框架扩展匹配及防火墙原理iptable入门
Linux网络基础设定selinux/iptable/firewall