iptable之fiter表、nat表
1:防火墙种类及使用说明
- 硬件
- 三层路由:华为H3C(华三)
- 深信服
- juniper
- 软件
- iptables
- filrewalld
- 云防火墙
- 阿里云:安全组(默认的是白名单 防火墙默认规则是拒绝)
2:必须熟悉的名词
- 容器:瓶子 罐子 存放东西
- 表(table):存放链的容器
- 链(chain):存放规则的容器
- 规则(policy):准许或拒绝规则 ACCEPT DROP
Netfilter(iptalbes) | 表(tables) | 链(chains) | 规则(Policy) |
---|---|---|---|
一栋楼 | 楼里的房子 | 房子里的柜子 | 柜子里衣服,摆放规则 |
3:iptables执行过程
工作流程小结:
- 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
- 匹配 表示 阻止还是通过,数据包就不再向下匹配新的规则 。
- 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明
确的阻止还是通过。 - 防火墙的默认规则是所有规则执行完才执行的。
4:表与链
- 4表伍链
- 表:
- filter (默认,防火墙功能 准许 拒绝)
- nat表 nat功能
- 内网服务器上外网(共享上网)
- 端口映射
- mangle(工作中基本不用)所以不学
- raw(工组中基本不用)所以不学
- 表的处理优先级:raw》mangle》nat》filter
4.1.1:filter表(默认表)
chain | 强调:主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包) filter表示iptables默认使用的表,这个表定义了三个链(chains)企业工作场景:主机防火墙 |
---|---|
INPUT | 负责过滤所有目标地址是本机地址的数据包 通俗来说:就是过滤进入主机的数据包 |
FORWARD | 负责转发流经主机的数据包。起转发的作用,和NAT关系很大,后面会详细介绍 LVS NAT模式,net.ipv4.ip_forward=0 |
OUTPUT | 处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包 |
4.1.2:nat表
Network Address Translation
chain | 负责网络地址转换的,即来源与目的IP地址和port的转换。 应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关。 工作场景: 1. 用于企业路由(zebra)或网关(iptables),共享上网(POSTROUTING) 2. 做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务 (PREROUTING) 3. WEB,单个端口的映射,直接映射80端口(PREROUTING) 这个表定义了3个链,nat 功能相当于网络的acl控制。和网络交换机acl类似 |
---|---|
OUTPUT | 和主机放出去的数据包有关,改变主机发出数据包的目的地址。 |
PREROUTING pre 在.....之前 |
在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、 目的端口等 就是收信时,根据规则重写收件人的地址。 例如:把公网IP:xxx.xxx.xxx.xxx映射到局域网的xx.xx.xx.xx服务器上。 如果是web服务,可以把80转换为局域网的服务器9000端口上 10.0.0.61 8080(目标端口) ----nat---à 10.0.0.7 22 |
POSTROUTING POST 在....之后 |
在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口 等。 写好发件人的地址,要让家人回信时能够有地址可回。 例如。默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网 地址。 生产应用:局域网共享上网。 |
4.1.5:4表五链流程
5:环境准备及命命令
iptables 启动或关闭的命令
yum install -y iptables-services
[root@ISP ~]# rpm -qa | grep iptables
iptables-services-1.4.21-35.el7.x86_64
iptables-1.4.21-35.el7.x86_64
#防火墙相关模块 加载到内核中
#加载防火墙的内核模块
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
[root@ISP ~]# systemctl stop firewalld
[root@ISP ~]# systemctl disable firewalld
[root@ISP ~]# systemctl is-active firewalld
unknown
root@ISP ~]# systemctl start iptables.service
root@ISP ~]# systemctl enable iptables.service
[root@ISP ~]# iptables -F
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain l (0 references)
target prot opt source destination
5.1.1:iptables命令参数
参数 | 含义 |
---|---|
-L | 显示表中的规则 |
-n | 不要把端口或ip反向解析为名字 |
-t,--table | 指定表 |
-A | append追加最后 准许ACCEPT |
-I(大写字母I) | insert拒绝的规则放在最上面 |
-D | delete删除 |
-p | protocal协议 tcp/udp/icmp/all |
--dport | destination目标端口 |
--sport | source src 源端口 |
-s | --source 源ip |
-d | --destination目标ip |
-m | 指定模块 |
-i | --input数据进入的时候 通过哪个网卡 |
-o | --output数据流出的 通过的网卡 |
-j | --jump满足条件后的动作:DROP/ACCEPT/REJECT |
-P | 指定链设置默认规则 |
-F,--flush | 清楚所有规则,不会处理默认的规则 |
-X | 删除用户自定义的链 |
-Z | 链的计数器清零(数据包计数器与数据包字节计数器) |
6:配置filter表规则
[root@ISP ~]# iptables -F
[root@ISP ~]# iptables -X
[root@ISP ~]# iptables -Z
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
6.1.1:禁止访问22端口
[root@ISP ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
使用-D可以根据num来删除规则
6.1.2:禁止ip和短裤访问
[root@ISP ~]# iptables -I INPUT -s 10.0.0.7 -p tcp --dport 22 -j DROP
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 10.0.0.7 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
6.1.3:禁止网段连入(禁止10.0.0.0网段访问8080端口)
[root@ISP ~]# yum -y install nc
[root@ISP ~]# nc -l 8080
[root@ISP ~]# nc -l 8080
你好呀
[root@ISP ~]# netstat -lntup | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 24499/nc
tcp6 0 0 :::8080 :::* LISTEN 24499/nc
[root@server ~]# telnet 10.0.0.12 8080
Trying 10.0.0.12...
Connected to 10.0.0.12.
Escape character is '^]'.
你好呀
^] #《==按Ctrl + 】退出
telnet> q
Connection closed.
[root@ISP ~]# nc -l 8080 > /etc/hosts.txt
[root@server ~]# cat /etc/hosts | nc 10.0.0.12 8080
[root@ISP ~]# cat /tmp/hosts.txt
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- 禁止117.136.81.0网段访问8080端口
[root@ISP ~]# iptables -I INPUT -s 117.136.81.0/24 -p tcp --dport 8080 -j DROP
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 117.136.81.0/24 0.0.0.0/0 tcp dpt:8080
DROP tcp -- 10.0.0.7 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@ISP ~]# nc -l 8080
我去
[root@server ~]# telnet -S 117.136.81.1 117.136.81.254 8080
telnet: Warning: -S ignored, no parsetos() support.
Trying 117.136.81.254...
[root@server ~]# telnet -S 10.0.0.11 10.0.0.12 8080
telnet: Warning: -S ignored, no parsetos() support.
Trying 10.0.0.12...
Connected to 10.0.0.12.
Escape character is '^]'.
我去
6.1.4:只允许指定网段连入(允许10.0.0.0网段)
[root@ISP ~]# iptables -I INPUT ! -s 10.0.0.0/24 -j DROP
#感叹号表示取反,意思就变成了除了10.0.0.0/24其他都拒绝
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- !10.0.0.0/24 0.0.0.0/0
DROP tcp -- 117.136.81.0/24 0.0.0.0/0 tcp dpt:8080
DROP tcp -- 10.0.0.7 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@ISP ~]# nc -l 2222
我是最帅的
[root@server ~]# telnet -b 10.0.0.11 10.0.0.12 2222
Trying 10.0.0.12...
Connected to 10.0.0.12.
Escape character is '^]'.
我是最帅的
#另外还要注意一个问题,如果加了感叹号和没加感叹号两条源IP相同的规则,他会优先匹配没有加感叹号的规则。
6.1.5:指定多个端端口
[root@ISP ~]# iptables -I INPUT -p tcp -m multiport ! --dport 80,443 -j DROP
#表示进端口为80,443两个端口除外的其他所有端口全部拒绝
[root@ISP ~]# iptables -I INPUT -p tcp --dport 1024:65535 -j DROP
#表示进端口1024到65535范围的全部端口都拒绝
6.1.6:匹配ICMP类型
- ping
- tracert(windows)traceroute(linux)路由跟踪
- ICMP(Internet Control Message Protocol) Internet控制报文协议
通过内核参数控制 禁止被ping
[root@ISP ~]# cat /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all = 1
[root@ISP ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 1
通过防火墙规则 控制是否可以ping
[root@ISP ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
###iptables -I INPUT -p icmp --icmp-type any -j DROP
#如果想要匹配所有icmp类型可以指定any
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain l (0 references)
target prot opt source destination
6.1.7:匹配网络状态(TCP/IP连接状态)
- -m state --state
- NET:已经或将启动新的连接
- ESTABLISHED:已建立的连接
- RELATED:正在启动的新连接
- INVALID:非法或无法识别的
[root@ISP ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@ISP ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@ISP ~]# netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7277/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7264/sshd
tcp 0 36 10.0.0.12:22 10.0.0.253:63776 ESTABLISHED 26467/sshd: root@pt
tcp 0 0 10.0.0.12:22 10.0.0.253:62425 ESTABLISHED 24519/sshd: root@pt
tcp6 0 0 :::22 :::* LISTEN 7264/sshd
6.1.8:限制并发及速率
[root@ISP ~]# iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT
[root@ISP ~]# iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 6/m --limit-burst 5 -j ACCEPT
#结合起来意思每分钟可以请求6次,也就是60s/6=10s,每10s可请求一次,可存储5次
#例子:
假设现在PC1想要ping PC2,PC1可以连续ping通5次,到了第6次的时候就无法ping通了,需要等待10s后才能ping通一次,然后又无法ping通了,过了将近50秒,又可以连续ping通5次,到了第6次的时候又无法ping通,依此类推
-m limit --limit n/{second/minute/hour};
解释:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时
--limit-burst [n]
解释:在同一时间内允许通过的请求”n”为数字,不指定默认为5
6.1.9:防火墙规则的保存与恢复
#@<++++++++++++++++++++++
[root@ISP ~]# iptables-save
# Generated by iptables-save v1.4.21 on Mon Apr 11 14:12:27 2022
*nat
:PREROUTING ACCEPT [998:62210]
:INPUT ACCEPT [913:57075]
:OUTPUT ACCEPT [6:476]
:POSTROUTING ACCEPT [6:476]
-A POSTROUTING -s 117.136.81.0/24 -j SNAT --to-source 10.0.0.12
COMMIT
# Completed on Mon Apr 11 14:12:27 2022
# Generated by iptables-save v1.4.21 on Mon Apr 11 14:12:27 2022
*filter
:INPUT ACCEPT [111:29529]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:l - [0:0]
-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Mon Apr 11 14:12:27 2022
#@<++++++++++++++++++++++
[root@ISP ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Mon Apr 11 10:31:45 2022
*nat
:PREROUTING ACCEPT [465:28520]
:INPUT ACCEPT [153:9607]
:OUTPUT ACCEPT [11:1188]
:POSTROUTING ACCEPT [11:1188]
COMMIT
# Completed on Mon Apr 11 10:31:45 2022
# Generated by iptables-save v1.4.21 on Mon Apr 11 10:31:45 2022
*filter
:INPUT DROP [462:89115]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [415:43376]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -m limit --limit 12/min -j ACCEPT
COMMIT
# Completed on Mon Apr 11 10:31:45 2022
#@<++++++++++++++++++++++
[root@ISP ~]# iptables-save > /etc/sysconfig/iptables
[root@ISP ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Mon Apr 11 14:13:20 2022
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Mon Apr 11 14:13:20 2022
# Generated by iptables-save v1.4.21 on Mon Apr 11 14:13:20 2022
*filter
:INPUT DROP [5:1455]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4:376]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -m limit --limit 12/min -j ACCEPT
COMMIT
# Completed on Mon Apr 11 14:13:20 2022
#@<++++++++++++++++++++++
[root@ISP ~]# iptables -F
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#@<++++++++++++++++++++++
[root@ISP ~]# iptables-restore < /etc/sysconfig/iptables
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 limit: avg 6/min burst 5
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
iptables | 管理命令 |
iptables-save | 当前正在使用的防火墙规则输出 |
iptables-restore | 从文件中读取防火墙规则并生效 |
7:配置nat表规则
nat表 案例 | |
---|---|
1、共享上网(没有公网ip的服务器 上网) | |
2、端口映射(转发) | |
3、ip映射 |
[root@ISP ~]# iptables -P INPUT ACCEPT
[root@ISP ~]# iptables -P FORWARD ACCEPT
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT) #<==
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 limit: avg 6/min burst 5
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
Chain FORWARD (policy ACCEPT) #<==
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@ISP ~]# iptables -F
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
7.1.1:实现共享上网
- 物理服务器/虚拟机
- 云服务器:
- 防火墙配置
[root@ISP ~]# hostname -I
10.0.0.12 117.136.81.254 10.1.1.1
[root@ISP ~]# iptables -t nat -A POSTROUTING -s 117.136.81.0/24 -j SNAT --to-source 10.0.0.12
[root@ISP ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@ISP ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.icmp_echo_ignore_all = 0
[root@server ~]# hostname -I
10.0.0.11 117.136.81.1
[root@server ~]# ping www.baidu.com
PING www.a.shifen.com (36.152.44.96) 56(84) bytes of data.
64 bytes from localhost (36.152.44.96): icmp_seq=1 ttl=127 time=23.9 ms
64 bytes from localhost (36.152.44.96): icmp_seq=2 ttl=127 time=18.3 ms
64 bytes from localhost (36.152.44.96): icmp_seq=3 ttl=127 time=19.0 ms
^C
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2008ms
rtt min/avg/max/mdev = 18.365/20.477/23.999/2.511 ms
[root@ISP ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 117.136.81.0/24 0.0.0.0/0 to:10.0.0.12
注意事项: 公网ip不固定: iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth1 -j MASQUERADE
MSAQUERADE配合-o指定公网接口,有些公网接口IP变化,比如PPOE拨号这样的,那么就会自动转换公网接口任意公网IP
7.1.2:实现端口转发
[root@ISP ~]# yum -y install nginx
[root@ISP ~]# vim /etc/nginx/nginx.conf
server {
listen 10.1.1.1:80; #<==只允许监听10.1.1.1
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
[root@ISP ~]# systemctl restart nginx
[root@ISP ~]# cd /usr/share/nginx/html/
[root@ISP html]# rm -rf *
[root@ISP html]# echo "我是最帅的" > index.html
[root@ISP html]# systemctl start nginx
[root@ISP html]# netstat -lntup | grep -o 80 | wc -l
1
[root@ISP html]# iptables -t nat -A PREROUTING -d 117.136.81.254 -p tcp --dport 9000 -j DNAT --to-destination 10.1.1.1:80
#这个就表示当所有源地址访问目标为117.136.81.254的9000端口时,则转发到10.1.1.1:80上
[root@server ~]# curl 117.136.81.254:9000
我是最帅的
7.1.3:实现IP映射
[root@ISP ~]# iptables -t nat -F
[root@ISP ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@ISP ~]# iptables -t nat -A PREROUTING -d 117.136.81.254 -j DNAT --to-destination 10.1.1.2
##10.1.1.2是另外一台主机RTA,这里映射IP 117.136.81.254其实就是这个IP的任何协议、任何端口都会被映射到10.1.1.2上
[root@server ~]# ssh 117.136.81.254
root@117.136.81.254's password:
Last login: Mon Apr 11 15:01:02 2022 from 117.136.81.1
[root@RTA ~]# exit
logout
Connection to 117.136.81.254 closed.
[root@server ~]# curl 117.136.81.254:80 2> /dev/null| wc -l
16