linux之iptables应用详解

时间:2022-07-22
本文章向大家介绍linux之iptables应用详解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

iptables应用主要包括主机防火墙和网络防火墙

主机防火墙详解(服务范围当前主机):

        iptables其规则主要作用在“匹配条件”上,具体为各种模块

icmp模块

--icmp-type     8:echo-request     0:echo-reply 例子:两个主机 in和out,允许in ping out 不允许out ping in  做法:首先在in上拒绝所有ping请求,先生成一个白名单再在in上写规则

[root@in ~]# iptables -A INPUT -p icmp -j REJECT
[root@in ~]# iptables -A OUTPUT -p icmp -j REJECT
[root@in ~]# iptables -I OUTPUT 1 -p icmp --icmp-type 8 -j ACCEPT
[root@in ~]# iptables -I INPUT 1 -p icmp --icmp-type 0 -j ACCEPT

multiport模块

iptables的多端口匹配 Linux系统上配置iptables放开相应的80、21、22、23、53的端口访问:

[root@ ~]# iptables -R INPUT 1 -p tcp -m multiport --dport 21:23,80,53 -j ACCEPT

iprange模块

匹配连读的地址访问: 允许192.168.0.1-192.168.0.50的地址访问到192.168.0.81的80端口:

[root@ ~]# iptables -I INPUT -d 192.168.0.81 -p tcp --dport 80 -m iprange --src-range 192.168.0.1-192.168.0.50 -j ACCEPT

ipset模块

允许非连续的地址访问

[root@ ~]# ipset create httplist hash:net maxelem 10000
[root@ ~]# ipset add httplist 192.168.153.101
[root@ ~]# ipset add httplist 192.168.153.102
[root@ ~]# iptables -I INPUT 1 -p tcp --dport 80 -m set --match-set httplist src -j ACCEPT
[root@ ~]# iptables -I OUTPUT 1 -p tcp --sport 80 -m set --match-set httplist dst -j ACCEPT

string&time模块

拒绝在周一和周四的上午九点到下午六点访问本机的80端口中带有game字符串的报文

[root@ ~]# iptables -R INPUT 1 -m time --timestart 9:00 --timestop 18:00 --weekdays Mon,Thu -m string --algo bm --string "game" -j REJECT

connlimit模块

对匹配的地址做并发连接数限制,限制指定IP的22端口的并发数为3

[root@ ~]# iptables -I INPUT -d 192.168.0.81 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT

limit模块

基于收发报文做速率限制,限制icmp报文的收发速率:

[root@ ~]# iptables -I INPUT -d 192.168.0.81 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 5 -j ACCEPT

连接追踪CONNTRACK

原理分析:

      连接跟踪(CONNTRACK),顾名思义,就是跟踪并且记录连接状态。Linux为每一个经过网络堆栈的数据包,生成一个新的连接记录项 (Connection entry)。此后,所有属于此连接的数据包都被唯一地分配给这个连接,并标识连接的状态。连接跟踪是防火墙模块的状态检测的基础,同时也是地址转换中实 现SNAT和DNAT的前提。那么Netfilter又是如何生成连接记录项的呢?每一个数据,都有“来源”与“目的”主机,发起连接的主机称为“来源”,响应“来源”的请求的主机即为目的,所谓生成记录项,就是对每一个这样的连接的产生、传输及终止进行跟踪记录。由所有记录项产生的表,即称为连接跟踪表。

      在 Linux 内核中,连接记录由ip_conntrack结构表示。在该结构中,包含一个nf_conntrack类型的结构,其记录了连接记录被公开应用的计数,也方便其他地方对连接跟踪的引用。每个连接记录都对应一个指向连接超时的函数指针,当较长时间内未使用该连接,将调用该指针所指向的函数。如果针对某种协议的连接跟踪需要扩展模块的辅助,则在连接记录中会有一指向ip_conntrack_helper 结构体的指针。连接记录中的结构体ip_conntrack_tuple_hash实际记录了连接所跟踪的地址信息(源和目的地址)和协议的特定信息(端口)。所有连接记录的ip_conntrack_tuple_hash以散列形式保存在连接跟踪表中(ip_conntrack记录存放在堆里面)。

       对于数据包,首先检查它的tuple是否存在于hash表中,若存在就能找到对应的连接记录,若不存在就新建一个连接记录,将对应的两个tuple都加入到hash表中去。

iptables 包括一个模块,它允许管理员使用“连接跟踪”(connection tracking)方法来检查和限制到内部网络中可用服务的连接。连接跟踪把所有连接都保存在一个表格内,它令管理员能够根据以下连接状态来允许或拒绝连接:

NEW — 请求新连接的分组,如 HTTP 请求。

ESTABLISHED — 属于当前连接的一部分的分组。

RELATED — 请求新连接的分组,但是它也是当前连接的一部分。

INVALID — 不属于连接跟踪表内任何连接的分组。

报文状态匹配及连接状态追踪,仅匹配放开会话状态为ESTABLISHTED且端口为21的连接:

[root@ ~]# iptables -I INPUT -d 192.168.0.81 -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT

对ftp服务作会话追踪:

装载ftp连接追踪的专用模块
[root@iptables ~]# modprobe  nf_conntrack_ftp  
#放开命令链接
[root@iptables ~]# iptables -I INPUT -d 192.168.0.81 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@iptables ~]# iptables -I OUTPUT -s 192.168.0.81 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
#放开数据连接
[root@iptables ~]# iptables -I INPUT -d 192.168.0.81 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@iptables ~]# iptables -I OUTPUT -s 192.168.0.81 -m state --state ESTABLISHED -j ACCEPT
#查看已经追踪并记录下来的链接
root@iptables ~]# cat /proc/net/nf_conntrack
......
ipv4     2 tcp      6 431997 ESTABLISHED src=192.168.0.85 dst=192.168.0.81 sport=52070 dport=21 src=192.168.0.81 dst=192.168.0.85 sport=21 dport=52070 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=3
ipv4     2 tcp      6 428774 ESTABLISHED src=192.168.0.38 dst=192.168.0.81 sport=51061 dport=22 src=192.168.0.81 dst=192.168.0.38 sport=22 dport=51061 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2

网络防火墙(服务范围为局域网):

做一个只需内网ping外网而不允许外网ping内网的实验:

三台机器:

inside       ip:192.168.153.7    outside     ip:10.10.10.7

firewalld   ip:192.168.153.1

1:在firewalld上开启ip转发

[root@firewall ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1

在inside上

[root@inside ~]# route add default gw 192.168.153.7

在outside上

[root@outside ~]# route add default gw 10.10.10.7

方法一:类似icmp模块

[root@ ~]# iptables -A FORWARD -j REJECT
[root@ ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp --icmp-type 8 -j ACCEPT
[root@ ~]# iptables -I FORWARD -d 192.168.153.0/24 -s 10.0.0.0/8 -p icmp --icmp-type 0 -j ACCEPT

方法二:状态追踪

[root@ ~]# iptables -A FORWARD -j REJECT
[root@ ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp --icmp-type 8 -j ACCEPT
[root@ ~]# iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT

方法三:

[root@ ~]# iptables -A FORWARD -j REJECT
[root@ ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp -m state --state NEW -j ACCEPT
[root@ ~]# iptables -I FORWARD - --m state --state ESTABLISHED -j ACCEPT

实验二:SNAT源地址转化

在server1启用iptables并设置SNAT地址转换,使得192.168.83.0/24网段能够正常访问互联网:

前提:只有仅主机的ip和可以上网的ip的仅主机网卡在同一个网段(可以ping通)

首先在可以上网的机器上做以下操作:

#首先启用IP转发功能
[root@outside ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
#添加SNAT规则
[root@outside ~]# iptables -t nat -A POSTROUTING -s 192.168.83.0/24  -j SNAT --to-source 1.1.1.1

在仅主机的机器上开启路由指向

[root@inside ~]# route add default gw outside(ip)

另外还可以使用MASQUERADE处理动作来实现SNAT地址转换,此动作适用于动态IP环境:

[root@outside ~]# iptables -t nat -A POSTROUTING -s 192.168.83.0/24 -j MASQUERADE

DNAT目的端口映射

在Server1上通过iptables设置DNAT使得client192.168.0.38能通过192.168.0.81的8080端口访问10.10.10.10的80端口:

[root@ ~]# iptables -t nat -A PREROUTING -d 192.168.0.81 -p tcp --dport 8080 -j DNAT --to-destination 10.10.10.10:80