[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

超级详细的iptable教程文档

[Linux用户空间编程-5]:用IPTable实现NAT功能

linux之防火墙

ansile模块之iptable