1、详述iptables五链
2、举例实现iptables多端口匹配、连接追踪、字符串匹配、时间匹配、并发连接限制、速率匹配、报文状态匹配等应用
3、举例实现iptables之SNAT源地址修改及DNAT目标地址修改和PNAT端口修改等应用
4、简述sudo安全切换工具,及详细讲解visudoer
1、详述iptables五链
iptables是linux自带的防火墙,工作在系统空间,根据事先定义好的规则对出入的包进行过滤,做出相应的动作。在数据包过滤的表中,规则被分组放在我们所谓的链(chain)中。
iptables实际上由两个组件netfilter 和 iptables 组成。
iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
netfilter组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
五链:

可以看到netfilter在内核空间的五个位置虚拟了五个钩子,数据包经过的时候,一但被任何一个钩子的规则所匹配到就会执行相应的操作。
- prerouting: 流入的数据包进入路由表之前
- input:通过路由表判断后目的是本机,然后进入本机内部资源
- forward:通过路由表判断后目的地不是本机,然后通过路由转发到其他地方
- output:由本机产生的数据包向外部转发
- postrouting:传出的数据包到达网卡出口之前
四表:

- filter表——过滤数据包
- Nat表——用于网络地址转换(IP、端口)
- Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
- Raw表——决定数据包是否被状态跟踪机制处理
图片中显示的是四表与五链的对应关系,表就相当于规则的集合,表工作在哪些钩子上,代表了数据包流经过哪些钩子会被哪些表给匹配到。表在哪些钩子上是有指定意义的,譬如filter不需要工作在prerouting,ouput链上,因为数据包不需要进入用户空间,直接被路由走,那么也不需要进行过滤了
默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。
2、举例实现iptables多端口匹配、连接追踪、字符串匹配、时间匹配、并发连接限制、速率匹配、报文状态匹配等应用
多端口匹配
以离散方式定义多端口匹配;最多指定15个端口;
--source-ports,--sports port[,port|,port:port]...:指定多个源端口;
--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
--ports port[,port|,port:port]...:指明多个端口;
服务器端的web服务监听在80,8080,8000三个端口上,只有8000能访问到,这里多端口使用了显式声明
iptables -t filter -I INPUT -d 192.168.31.200 -s 192.168.31.201 -p tcp -m multiport --dports 80,8080 -j DROP
[root@lvq-7-4-2 ~]# curl http://192.168.31.200:80
^C
[root@lvq-7-4-2 ~]# curl http://192.168.31.200:8080
^C
[root@lvq-7-4-2 ~]# curl http://192.168.31.200:8000
<h1>The node1 Server</h1>
连接追踪
连接追踪需要知道以下几个状态的意思
- NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
- ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
- RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
- INVALID:无效的连接;
- UNTRACKED:未进行追踪的连接;
这里我们设定允许ESTABLISHED的22号端口进出,然后再开一个终端来进行实验
iptables -A INPUT -j DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
新开的终端无法连接
字符串匹配
使用到string的扩展
注意:仅对明文协议有效对ssh,https等加密协议无效
--algo {bm|kmp}:字符串匹配检测算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--string pattern:要检测的字符串模式;
--hex-string pattern:要检测的字符串模式,16进制格式;
规则需要定义在在OUTPUT链上,在INPUT链上无效,因为请求时不带有字符,出来的数据包才带有匹配的字符
iptables -I OUTPUT -m string --algo kmp --string "erver" -j DROP
时间匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--monthdays day[,day...]
--weekdays day[,day...]
--kerneltz:使用内核上的时区,而非默认的UTC;
拒绝周一到周六晚上7点50到8点所有访问80端口的请求
iptables -A INPUT -d 192.168.31.200 -p tcp --dport 80 -m time --timestart 19:50 --timestop 18:00 --weekdays 1,2,3,4,5,6 -j DROP
并发连接限制
--connlimit-upto n:连接的数量小于等于n时匹配;小于允许
--connlimit-above n:连接的数量大于n时匹配;大于拒绝
最多打开两个终端
iptables -A INPUT -d 192.168.31.200 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
速率匹配
--limit rate[/second|/minute|/hour|/day] --limit 20/minute :每分钟20个
--limit-burst number :令牌桶最大多少个
iptables -I INPUT -d 192.168.31.200 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp -j REJECT
[root@lvq-7-4-2 ~]# ping 192.168.31.200
PING 192.168.31.200 (192.168.31.200) 56(84) bytes of data.
64 bytes from 192.168.31.200: icmp_seq=1 ttl=64 time=0.970 ms
64 bytes from 192.168.31.200: icmp_seq=2 ttl=64 time=0.266 ms
64 bytes from 192.168.31.200: icmp_seq=3 ttl=64 time=0.250 ms
64 bytes from 192.168.31.200: icmp_seq=4 ttl=64 time=0.273 ms
64 bytes from 192.168.31.200: icmp_seq=5 ttl=64 time=0.344 ms
From 192.168.31.200 icmp_seq=6 Destination Port Unreachable
From 192.168.31.200 icmp_seq=7 Destination Port Unreachable
From 192.168.31.200 icmp_seq=8 Destination Port Unreachable
3、举例实现iptables之SNAT源地址修改及DNAT目标地址修改和PNAT端口修改等应用
nat表的target:
SNAT
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
DNAT
--to-destination [ipaddr[-ipaddr]][:port[-port]]
MASQUERADE
--to-ports port[-port]
--random
SNAT
iptables -t nat -A POSTROUTING -s 192.168.31.200 -j SNAT --to-source 192.168.31.11
20:25:15.015281 IP 192.168.31.200 > 192.168.31.201: ICMP echo request, id 7815, seq 3, length 64
20:32:28.319994 IP 192.168.31.11 > 192.168.31.201: ICMP echo request, id 7938, seq 1, length 64
DNAT
iptables -t nat -A PREROUTING -d 192.168.31.201 -j DNAT --to-destination 192.168.31.22
192.168.31.200 > 192.168.31.201: ICMP echo request, id 7980, seq 4, length 64
ARP, Request who-has 192.168.31.22 tell192.168.31.201, length 28
PNAT
REDIRECT:端口重定向;
iptables -t nat -A PREROUTING -d 192.168.31.200 -p tcp --dport 80 -j REDIRECT --to-ports 9999
curl http://192.168.31.200:80
curl: (7) Failed connect to 192.168.31.200:80; 拒绝连接
[root@lvq-7-4-2 ~]# curl http://192.168.31.200:8080
<h1>The node1 Server</h1>
4、简述sudo安全切换工具,及详细讲解visudoer
我们日常使用系统不可能全都用root来进行操作,所以就有了不同权限的用户,但当用户需要使用当前不具备权限的命令时就可以使用sudo,用户权限都在/etc/sudoers配置文件中
以sudo的方式来运行指定的命令;
sudo [options] COMMAND
-l command 列出用户能执行的命令
-k 清除此前缓存用户成功认证结果;
可以直接使用visudo命令进入/etc/sudoers文件
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
可以使用!排除命令
users hosts=(runas) commands
users:
username
#uid
%groupname
%#gid
user_alias
支持将多个用户定义为一组用户,称之为用户别名,user_alias;
hosts:
ip
hostname
NetAddr
host_alias
runas:
...
runas_alias
commands:
command
directory
sudoedit:特殊权限,可用于向其它用户授予sudo权限;
cmnd_alias
网友评论