iptables规则

一、查看和保存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 (用于内网服务器通过防火墙共享上网)

相关推荐
蜜獾云9 分钟前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
小屁不止是运维10 分钟前
麒麟操作系统服务架构保姆级教程(五)NGINX中间件详解
linux·运维·服务器·nginx·中间件·架构
Hacker_Oldv15 分钟前
WPS 认证机制
运维·服务器·wps
bitcsljl23 分钟前
Linux 命令行快捷键
linux·运维·服务器
ac.char26 分钟前
在 Ubuntu 下使用 Tauri 打包 EXE 应用
linux·运维·ubuntu
Youkiup1 小时前
【linux 常用命令】
linux·运维·服务器
qq_297504611 小时前
【解决】Linux更新系统内核后Nvidia-smi has failed...
linux·运维·服务器
_oP_i1 小时前
.NET Core 项目配置到 Jenkins
运维·jenkins·.netcore
weixin_437398211 小时前
Linux扩展——shell编程
linux·运维·服务器·bash
小燚~1 小时前
ubuntu开机进入initramfs状态
linux·运维·ubuntu