一、查看和保存iptables规则
1、查看iptables规则
# iptables -t filter -nvL --line
# iptables-save
2、保存iptables规则与还原
(1) 保存规则方式一,默认会保存到/etc/sysconfig/iptables
# service iptables save
(2) 保存规则方式二
# iptables-save > /etc/sysconfig/iptables
(3) 还原iptabels规则
# iptables-restore /etc/sysconfig/iptables
3、删除iptables规则
# iptables -t filter -D INPUT 1
# iptables -t filter -D INPUT -s 192.168.2.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
二、iptables规则介绍
- iptables是根据ipv4做安全策略的
- iptables匹配规则:从上向下匹配,匹配成功则停止匹配,如果匹配都不成功就看默认规则
- 强调:如果并发比较大(1万以上),或日pv多(3000万)的情况下,开启防火墙可能会导致网络变慢,这时候就需要购买硬件防火墙了
1、iptables有4表5链
filter表:
主要对进入本机的数据包进行处理,真正用于主机防火墙功能,filter表是iptables默认使用的表,这个表有三个链
链:
INPUT: 负责过滤所有目标地址是本机地址的数据包,通俗讲就是过滤进入主机的数据包
FORWARD: 负责转发流经主机的数据包,起转发作用
OUTPUT: 处理所有源地址是本机的数据包,通俗讲就是从主机发出去的数据包
nat表:
负责网络地址转换,与主机本身无关,主要用于端口转换或ip映射,nat表也有三个链
链:
OUTPUT: 处理所有源地址是本机的数据包,通俗讲就是从主机发出去的数据包
PREROUTING: 在数据包到达防火墙之前进行规则判断,作用是改变数据包的目的地址、目的端口
POSTROUTING:在数据包离开防火墙之前进行规则判断,作用是改变数据包的源地址、源端口
注意:当使用PREROUTING和POSTROUTING的时候需要开启路由转发 [net.ipv4.ip_forward = 1]
2、iptables原理
(1) 数据包进来,先经过NAT表的PREROUTING链进行判断,该数据包是给主机的还是流经主机的
(2) 如果数据包是流经主机的,那么就进行ip/端口映射后再交给filter表的FORWARD链进行转发,最后再通过NAT表的POSTROUTING链再次做地址映射把数据包发出去
(3) 如果该数据包是给主机的,那么就将数据包交给filter表的INPUT链进行处理,处理完再交给NAT表和filter表的OUTPUT链、NAT表的POSTROUTING链把数据包发出去。
3、iptables基本参数
-A # 添加规则到链上,会添加到最后一行
-I # 添加规则到链上,会插入规则到第一行
-t # 指定表, 默认是filter表,比如iptables -nL -t filter/nat
-p # 指定过滤的协议(tcp,udp,icmp,all)
-P # 添加默认规则到链上(大写)
-s # address[/mask][...] 指定源地址
-d # address[/mask][...] 指定目的地址
-i # 从网络接口(eth0,eth1)进来的数据包
-o # 从网络接口(eth0,eth1)出去的数据包
--dport # 指定目标端口
--sport # 指定源端口
-j # 对规则的具体处理方法(ACCEPT,DROP,REJECT,DNAT,SNAT,MASQUERADE)
--line-number # 查看链上的规则号,简写为--line
-D chain # 删除链上的规则,也可以指定规则号
iptables -nL -t filter # 显示filter表里的所有规则(默认不写-t filter也是代表查看filter表)
iptables -nL -t nat # 显示nat表里的所有规则
-F # 默认清除filter表的所有规则
--to-source # 把源地址转换为某个ip/网段
--to-destination # 把目标地址转换为某个ip/网段
-m multiport # 添加多个不连续端口
DNAT # 目标地址转换
SNAT # 源地址转换
ACCEPT, # 允许
DROP # 拒绝
REJECT # 丢弃
MASQUERADE # 自动寻路
/etc/sysconfig/iptables # 防火墙配置文件
4、企业中有两种使用iptables的模式
(1)默认规则为全部允许,只拒绝指定ip
# 设置INPUT链、output链、forward链默认允许
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
(2)默认规则为全部拒绝,只允许指定ip
-
OUTPUT一般默认允许就可以
-
POSTROUTING和PREROUTING没有 DROP和ACCEPT命令,它们是用来做NAT转发的,所以默认也是允许iptables -t filter -P FORWARD ACCEPT
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT # 先设置允许sshd端口
iptables -t filter -P INPUT DROP # 进入规则默认拒绝
iptables -t filter -P FORWARD DROP # 转发规则默认拒绝
5、对防火墙的优化
[root@Oldboy ~]# tail -7 /etc/sysctl.conf
# 以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理。
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
三、iptables filter表实战总结
1、允许任意来源ip访问服务器的8080端口
(1) 创建规则
# iptables -t filter -I INPUT -p tcp --dport 8080 -j ACCEPT
# service iptables save # 保持规则,否则重启后会失效
------------------------------------------------------
-t filter # 指定表
-I INPUT # 表示对INPUT链进行插入
-p # 表示允许/拒绝的协议
--dport # 表示目标端口(就是来源ip要访问的端口)
-j # 规则
(2) 查看filter表规则
# iptables -nL -t filter
INPUT链 (默认策略为允许)
Chain INPUT (policy ACCEPT)
规则 协议 源 目标 协议 目标端口(dport)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
1.1、允许任意来源ip访问本机80-8080端口
(1) 创建规则
# iptables -t filter -I INPUT -p tcp --dport 80:8080 -j ACCEPT
---------------------------------------
-t filter # 指定表
-I INPUT # 表示对INPUT链进行插入
-p # 表示允许/拒绝的协议
--dport # 表示目标端口,可以指定范围(就是来源ip要访问的端口)
-j # 规则
(2) 查看规则
[root@docker-106 ~]# iptables -t filter -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:80:8080
1.2、允许任意来源ip访问服务器 80、443、20、21端口
(1) 创建规则
# iptables -t filter -I INPUT -p tcp -m multiport --dport 80,443,20,21 -j ACCEPT
---------------------------------
-t filter # 指定表
-I INPUT # 表示对INPUT链进行插入
-p # 表示允许/拒绝的协议
-m multiport # 表示指定多个端口
--dport # 表示目标端口,可以指定范围,多个端口有逗号隔开(就是来源ip要访问的端口)
-j # 规则
(2) 查看规则
# iptables -t filter -nL
INPUT链 (默认允许)
Chain INPUT (policy ACCEPT)
规则 协议 源 目标 状态(多端口) 目标端口
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443,20
2、允许来源是192.168.1.5的ip访问服务器的8080端口
(1) 创建规则
# iptables -t filter -I INPUT -p tcp -s 192.168.1.5 --dport 8080 -j ACCEPT
# service iptable save
------------------------------------------------------
-t filter # 指定表
-I INPUT # 表示对INPUT链进行插入
-p # 表示允许/拒绝的协议
-s # 表示来源ip,可以写成网段 192.168.1.0/24
--dport # 表示目标端口(就是来源ip要访问的端口)
-j # 规则
(2) 查看filter规则
# iptables -t filter -nL
INPUT链 (默认策略为允许)
Chain INPUT (policy ACCEPT)
规则 协议 源 目标 协议 目标端口(dport)
target prot opt source destination
ACCEPT tcp -- 192.168.1.5 0.0.0.0/0 tcp dpt:8080
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2.1、允许多个来源ip访问服务器的8080端口
(1) 添加规则
# iptables -t filter -I INPUT -p tcp -s 192.168.1.4,192.168.1.5 --dport 8080 -j ACCEPT
------------------------------
-t filter # 指定表
-I INPUT # 表示对INPUT链进行插入
-p # 表示允许/拒绝的协议
-s # 来源ip,多个ip用逗号隔开
--dport # 表示目标端口(就是来源ip要访问的端口)
-j # 规则
(2) 查看规则
# iptables -t filter -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.5 0.0.0.0/0 tcp dpt:8080
ACCEPT tcp -- 192.168.1.4 0.0.0.0/0 tcp dpt:8080
3、删除创建的规则
(1) 当时创建当时删除
# iptables -I INPUT -p tcp --dport 22 -j ACCEPT # 创建
# iptables -D INPUT -p tcp --dport 22 -j ACCEPT # 删除
(2) 根据规则编号删除
# iptables -t filter -nL --line # 查看filter表规则编号
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 DROP icmp -- 0.0.0.0/0 192.168.1.106 icmptype 8
3 ACCEPT tcp -- 192.168.1.5 0.0.0.0/0 tcp dpt:8080
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
# iptables -t filter -D INPUT 1 # 删除filter表中INPUT链的第1条规则
4、清空防火墙规则
(1) 清空表(表对于的链也会被清空)
iptables -t filter -F # 清空filter表
iptables -t nat -F # 清空nat表
(2) 清空指定链
iptables -t filter -F INPUT # 清空filter表的INPUT链
iptables -t filter -F OUTPUT # 清空filter表的OUTPUT链
iptables -t nat -F PREROUTING # 清空nat表的PREROUTING链
iptables -t nat -F POSTROUTING # 清空nat表的POSTROUTING链
5、禁止ping防火墙(192.168.1.106是防火墙ip
(1) 创建规则
# iptables -t filter -I INPUT -p icmp --icmp-type 8 -d 192.168.1.106 -j DROP
----------------------------------
-t filter # 指定filter表
-I INPUT # 向INPUT链插入数据
-p icmp # 指定协议
--icmp-type 8 # 回显别人对自己的请求
-d # 目标地址
-j # 规则
(2) 查看规则
# iptables -t filter -nL
INPUT链 (默认策略为允许)
Chain INPUT (policy ACCEPT)
规则 协议 源 目标 协议 回显状态
target prot opt source destination
DROP icmp -- 0.0.0.0/0 192.168.1.106 icmp type 8
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
6、允许关联的状态包进入防火墙
-
当INPUT默认策略为DROP时,需要加上这一条才能让本机ping同外网
(1)创建规则:允许关联的数据包通过
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-t filter # 指定filter表
-A INPUT # 向INPUT链插入规则
-m state # 指定状态
ESTABLISHED # 已经成功联机状态
RELATED # 联机成功后的相关数据包(2) 查看规则
iptables -t filter -nL
Chain INPUT (policy ACCEPT)
规则 协议 源 目标 状态 数据包类型
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
7、当INPUT链默认为DROP时,允许外网ping通本机,并且本机也能ping通外网
(1) 设置filter表的INPUT链为DROP
# iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
# iptables -t filter -P INPUT DROP
(2) 允许外网ping通本机(此时外网能ping通本机,但本机是ping不通外网的)
# iptables -t filter -I INPUT -p icmp --icmp-type 8 -d 192.168.1.106 -j ACCEPT
(3) 允许关联数据包通过,让本机也能ping通过外网
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
8、当filter表的FORWORD链为DROP时,让PC1可以访问PC2的80/3389端口
(1) 让任意来源ip经过防火墙可以ping通目标地址192.168.4.10
iptables -t filter -A FORWARD -d 192.168.4.10 -p icmp -j ACCEPT
(2) 让任意来源ip能够经过防火墙访问目标地址192.168.4.10:80
iptables -t filter -A FORWARD -d 192.168.4.10 -p tcp --dport 80 -j ACCEPT
(3) 让任意来源ip能够经过防火墙访问目标地址192.168.4.10:3389
iptables -t filter -A FORWARD -d 192.168.4.10 -p tcp --dport 3389 -j ACCEPT
(4) 让任意来源ip的相关数据包能够经过防火墙到达内网服务器
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
9、允许回环接口进出本机
(1) 创建规则
# iptables -t filter -A INPUT -i lo -j ACCEPT # 允许来自于lo接口的数据包
# iptables -t filter -A INPUT -o lo -j ACCEPT # 允许从lo接口出去的数据包
-t filter # 指定filter表
-A INPUT # 向INPUT链插入规则
-i lo # 从lo网卡进来的数据包
-j ACCEPT # 允许规则
(2) 查看规则
# iptables -t filter -nvL
INPUT链 (默认策略为允许 接收的数据包 接收的字节)
Chain INPUT (policy ACCEPT 54 packets, 3952 bytes)
接收的包 接收字节 规则 协议 从哪进 从哪出 源 目标
pkts bytes target prot opt in out source destination
10 540 ACCEPT all -- lo * 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 157 packets, 19532 bytes)
pkts bytes target prot opt in out source destination
四、iptables NAT表实战总结
内网访问外网(共享上网)
- SNAT: 通过POSTROUTING链对数据包的源地址进行改写
- 将内网地址转换成防火墙的公网ip来实现内网访问外网
1、内网服务器配置
(1) 内网服务器配置
# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
NAME="ens33"
UUID="a4190b4c-cc83-44d2-8348-96d76ffdc0ce"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=172.16.1.10 # 内网服务器ip
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=172.16.1.100 # 网关(指定防火墙内网ip)
DNS=202.106.0.20 # 配置dns
(2) 查看内网服务器网关(可以用命令设置route add default gw 172.16.1.51 )
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.1.100 0.0.0.0 UG 100 0 0 ens33
2、防火墙配置
(1) 开启路由转发
# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1 # 开启路由转发
# sysctl -p # 让路由生效
(2) 配置filter表的FORWARD链默认允许
# iptables -t filter -P FORWARD ACCEPT
(3) 配置nat表的POSTROUTING链:允许来自于172.16.1.0网段的内网用户通过防火墙转换为公网ip,去访问外网
# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 192.168.1.106
-------------------------------------
-t nat # 修改nat表
-A POSTROUTING # 在POSTROUTING链插入数据
-p tcp # 协议(做共享上网时不要指定协议)
-s # 源地址
-j SNAT # 规则,对源地址转换
--to-source # 把源地址转换为该地址(只要这个地址是防火墙中能上网的地址就行)
(4) 如果防火墙的公网ip是通过ADSL分配的不固定ip,那就用这个命令
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
--------------------------------
-j MASQUERADE # 会自动寻找一个可用的公网地址
(5) 查看规则
# iptables -t nat -nL
POSTROUTING链 (默认策略为允许)
Chain POSTROUTING (policy ACCEPT)
规则 协议 源 访问的目标地址 把源地址转换为该地址
target prot opt source destination
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:192.168.1.106
3、如果是阿里云主机,还需要在阿里云的专有网络VPC中加一条路由条目
4、内网服务器ping百度
# ping www.baidu.com
PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data.
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=48 time=17.0 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=2 ttl=48 time=16.6 ms
五、iptables NAT转发
-
MASQUERADE :主要用于不固定的公网IP,也可以用于固定的公网IP,如果是固定公网IP也可以不写
(1) 当访问的目标地址是:10.0.0.31时,则跳转到172.16.1.51
[root@Oldboy ~]# iptables -t nat -A PREROUTING -p tcp -d 10.0.0.31 -j DNAT --to-destination 172.16.1.51 (数据包进)
[root@Oldboy ~]# iptables -t nat -A POSTROUTING -j MASQUERADE (主要用于外网ip是DHCP自动获取时使用,公网ip可以不写)(2) 当访问的目标地址是:10.0.0.31,目标端口是22222时,则跳转到172.16.1.51:22
[root@Oldboy ~]# iptables -t nat -I PREROUTING -p tcp -d 10.0.0.31 --dport 22222 -j DNAT --to-destination 172.16.1.51:22 (数据包进)
[root@Oldboy ~]# iptables -t nat -A POSTROUTING -j MASQUERADE(3) 当来源地址是:10.0.0.0/24,目标地址是:10.0.0.31,目标端口是:22222,则跳转到172.16.1.51:22
[root@Oldboy ~]# iptables -t nat -A PREROUTING -p tcp -s 10.0.0.0/24 -d 10.0.0.31 --dport 22222 -j DNAT --to-destination 172.16.1.51:22 (数据包进)[root@Oldboy ~]# iptables -t nat -A POSTROUTING -j MASQUERADE(4) 一对一ip映射
-A PREROUTING -d 124.42.34.112 -j DNAT --to-destination 10.0.0.8
-A POSTROUTING -s 10.0.0.8 -o eth0 -j SNAT --to-source 124.42.34.112
-A POSTROUTING -s 10.0.0.0/255.255.240.0 -d 124.42.34.112 -j SNAT --to-source 10.0.0.254(5) 映射多个ip,将内网服务器ip转换为公网地址通过eth0接口去访问外网
iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.240.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16 (用于内网服务器通过防火墙共享上网)