前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iptables防火墙

iptables防火墙

原创
作者头像
用户10638239
发布2024-01-30 14:25:15
1910
发布2024-01-30 14:25:15
举报
文章被收录于专栏:LlinuxLlinux

1 名词解释

在介绍防火墙之前,我们先了解几个名词

容器:可以存放东西

表(table):存放链的容器

链(chain):存放规则的容器

规则(policy):准许或拒绝规则

这几个像俄罗斯套娃那样环环相套!

1.1 iptables执行过程

  • NetFilter框架

最底层是网络接口层,网络接口层上面是网络层,网络层部署了NetFilter(网络过滤框架)

网络层上面部署了TCP、UDP传输层,这一层部署了Filter表、NAT表、Mangle表,表种存放要检查的条件和操作,这些都是内核层,再往上就是用户层,也就是应用层,可以设置iptables命令。

  • Linux服务器双网卡路由器

从物理层和数据链路层进入先通过PREROUTING链,进入路由判决,如果可以进入会通过INPUT链进入TCP、UDP,再进入应用层,由应用层再返回到TCP、UDP,通过OUTPUT链进入路由判决,再通过POSTROUTING链传输到物理层和数据链路层出来。

如果在路由判决那里不能进入的话,则会通过FORWARD链传输到出口的路由判决,在通过POSTROUTING链进入物理层和数据链路层传输出来。

  • 表与链

iptables是4表5链,4表是filter表、nat表、raw表、mangle表,5链是input、pouput、forward、prerouting、postrouting

filter表有input链、output链、forward链

nat表有prerouting链、output链、postrouting链

mangle表有prerouting链、forward链、input链、output链、postrouting链

1.2 ilter表

负责流量进出,屏蔽或准许端口IP

filter表

主要和主机自身相关,真正负责主机防火墙功能的(过滤流入与流出主机数据包)filter标识iptables默认使用的表,这个表定义了三个链。企业工作场景:主机防火墙

INPUT

负责过滤所有目标地址是本机地址的数据包,通俗说就是过滤进入主机的数据包

FORWARD

负责转发流经主机的数据包,起转发的作用,和NAT关系很大,有专门的LVS NAT模式,net.ipv4.ip_forward=0

OUTPUT

处理所有源地址是本机地址的数据包,通俗说就是从主机发送出去的数据包

1.3 NAT表

双网卡的,负责接受到后转发,类似于路由器,可以实现NAT功能:共享上网(内网服务器上外网)、端口映射和ip映射

NAT

负责网络地址转换,即来源与目的IP地址和端口的转换。 应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务 工作场景: 1、用于企业路由(zebra)或网关(iptables),共享上网(postrouting) 2、做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(prerouting) 3、web,单个端口的映射,直接映射80端口(prerouting),这个表定义了3个链,nat功能相当于网络的acl控制,和网络交换机acl类似。

OUTPUT

和主机放出去的数据包有关,改变主机发出数据包的目的地址

PREROUTING

在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等 就是收信时,根据规则重写收件人的地址 例如:把公网IP映射到局域网的服务器上,如果是web服务,可以把80转换为局域网的服务器9000端口上10.0.0.61:80(目标端口)----nat----10.0.0.7:22

POSTROUTING

在数据包离开防火墙时进行路由判断之后执行的规则,作用是改变数据包的源地址,源端口等 写好发件人的地址,要让家人的回信时能够有地址可以回 例如:默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网地址 生产应用:局域网共享上网

1.4 Mangle表

存放头部信息

2 安装iptables

代码语言:bash
复制
[root@~]# yum install -y iptables-services

2.1 查看iptables服务的配置文件

代码语言:bash
复制
[root@env-test ~]#rpm -qi iptables
Name        : iptables
Version     : 1.4.21
Release     : 35.el7
Architecture: x86_64
Install Date: Sat 01 Jul 2023 11:17:52 AM CST
Group       : System Environment/Base
Size        : 1556976
License     : GPLv2
Signature   : RSA/SHA256, Thu 15 Oct 2020 02:51:02 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : iptables-1.4.21-35.el7.src.rpm
Build Date  : Fri 02 Oct 2020 12:52:54 AM CST
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.netfilter.org/
Summary     : Tools for managing Linux kernel packet filtering capabilities
Description :
The iptables utility controls the network packet filtering code in the
Linux kernel. If you need to set up firewalls and/or IP masquerading,
you should install this package.



[root@zabbix-test ~]#rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables                          #防火墙配置文件
/usr/lib/systemd/system/ip6tables.service        #防火墙服务services配置文件(命令)
/usr/lib/systemd/system/iptables.service
/usr/libexec/initscripts/legacy-actions/ip6tables
/usr/libexec/initscripts/legacy-actions/ip6tables/panic
/usr/libexec/initscripts/legacy-actions/ip6tables/save
/usr/libexec/initscripts/legacy-actions/iptables
/usr/libexec/initscripts/legacy-actions/iptables/panic
/usr/libexec/initscripts/legacy-actions/iptables/save
/usr/libexec/iptables
/usr/libexec/iptables/ip6tables.init
/usr/libexec/iptables/iptables.init

2.2 将防火墙相关的模块、加载到内核中

代码语言:bash
复制
[root@~]# modprobe ip_tables
[root@~]# modprobe iptable_filter
[root@~]# modprobe iptable_nat
[root@~]# modprobe ip_conntrack
[root@~]# modprobe ip_conntrack_ftp
[root@~]# modprobe ip_nat_ftp
[root@~]# modprobe ipt_state

2.3 永久加入,写进开机自启动

代码语言:bash
复制
cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state  
EOF

2.4 列出三表相关的内核模块,lsmod是列出系统当前载入的所有内核模块

代码语言:bash
复制
[root@zabbix-test ~]#lsmod | grep -E 'filter|nat|itp'
nf_nat_ftp             12809  0 
nf_conntrack_ftp       18478  1 nf_nat_ftp
iptable_nat            12875  0 
nf_nat_ipv4            14115  1 iptable_nat
nf_nat                 26583  2 nf_nat_ftp,nf_nat_ipv4
nf_conntrack          143360  6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter         12810  0 
ip_tables              27126  2 iptable_filter,iptable_nat
br_netfilter           22256  0 
bridge                155432  1 br_netfilter
libcrc32c              12644  3 xfs,nf_nat,nf_conntrack

2.5 关闭firewalld,启用iptables,并设置开机自启动

代码语言:bash
复制
systemctl stop firewalld && systemctl disable firewalld
systemctl start iptables.service && systemctl enable iptables.service

2.6 列出iptables所有规则

代码语言:bash
复制
[root@env-test ~]#iptables -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
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

2.7 iptables命令参数

代码语言:bash
复制
iptables定义规则的方式比较复杂:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :3个filter nat mangle
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
-j ACTION :指定如何进行处理

比如:不允许172.16.0.0/24的进行访问。
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
当然你如果想拒绝的更彻底:
iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT

iptables -L -n -v#查看定义规则的详细信息 


iptables -t[表名] 管理选项 [链名] [匹配条件] [-j 动作]
iptables -t[表名] <-A/I/D/R>规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --sport 目标端口 -j 动作


规则管理命令
         -A:追加,在当前链的最后新增一个规则
         -I num : 插入,把当前规则插入为第几条。
            -I 3 :插入为第三条
         -R num:Replays替换/修改第几条规则
            格式:iptables -R 3 …………
         -D num:删除,明确指定删除第几条规则 
         
         
链管理命令(这都是立即生效的)
-P :设置默认策略的(设定默认门是关着的还是开着的)
默认策略一般只有两种
iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的
比如:
iptables -P INPUT DROP 这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
        -F: FLASH,清空规则链的(注意每个链的管理权限)
    iptables -t nat -F PREROUTING
    iptables -t nat -F 清空nat表的所有链
        -N:NEW 支持用户新建一个链
            iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
        -X: 用于删除用户自定义的空链
            使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了
        -E:用来Rename chain主要是用来给用户自定义的链重命名
            -E oldname newname
         -Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
            iptables -Z :清空 
            
                     
                              
通用匹配:源地址目标地址的匹配
-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
而且地址可以取反,加一个“!”表示除了哪个IP之外
-d:表示匹配目标地址
-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
-i eth0:从这块网卡流入的数据
流入一般用在INPUT和PREROUTING上
-o eth0:从这块网卡流出的数据
流出一般在OUTPUT和POSTROUTING上   

                                              
                                                                                            
扩展匹配
1隐含扩展:对协议的扩展
    -p tcp :TCP协议的扩展。一般有三种扩展
--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
--dport 21  或者 --dport 21-23 (此时表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
    对于它,一般要跟两个参数:
1.1.检查的标志位
1.2.必须为1的标志位
--tcpflags syn,ack,fin,rst syn   =    --syn
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
    -p udp:UDP协议的扩展
        --dport
        --sport
    -p icmp:icmp数据报文的扩展
        --icmp-type:
echo-request(请求回显),一般用8 来表示
所以 --icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)一般用0来表示
                  
1.3 显式扩展(-m)
     扩展各种模块
      -m multiport:表示启用多端口扩展
      之后我们就可以启用比如 --dports 21,23,80
      
                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                        
详解-j ACTION

常用的ACTION:
DROP:悄悄丢弃
一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
REJECT:明示拒绝
ACCEPT:接受
custom_chain:转向一个自定义的链
DNAT
SNAT
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回
在自定义链执行完毕后使用返回,来返回原规则链。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

3 配置filter表规则

正式配置之前,先备份,清空规则

代码语言:bash
复制
[root@env-test ~]#iptables -F
[root@env-test ~]#iptables -Z
[root@env-test ~]#iptables -X
[root@env-test ~]#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

3.1 禁止访问22端口

代码语言:bash
复制
[root@env-test ~]# iptables -t filter -I INPUT -p tcp   --dport 22  -j DROP
[root@env-test ~]# 
Connection closed by foreign host.
 
Disconnected from remote host(Linux86-10.0.0.61-Ansible) at 22:43:23.
 
Type `help' to learn how to use Xshell prompt.

从后台进入之后,删除规则,重新建立远程连接

代码语言:bash
复制
Connecting to 10.0.0.61:22...
Connection established.
To escape to local shell, press Ctrl+Alt+].
 
Last login: Sat May  6 22:44:26 2023
[root@env-test ~]#

3.2 封ip,屏蔽某个ip

代码语言:bash
复制
[root@env-test ~]# iptables -I INPUT  -s 10.0.0.5   -j DROP 
[root@env-test ~]# iptables -I INPUT  -s 192.168.10.3  -j DROP 
[root@env-test ~]#  iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  192.168.10.3           0.0.0.0/0           
DROP       all  --  10.0.0.7             0.0.0.0/0           
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

3.3 禁止网段连入(禁止10.0.0.0/24网段访问 8080端口)

代码语言:bash
复制
#指定10.0.0.0网段的屏蔽了22端口
[root@env-test ~]# iptables -F
[root@env-test ~]# iptables -I INPUT  -s 10.0.0.0/24  -p tcp  --dport 22 -j DROP 
 
[root@env-test ~]# ssh 10.0.0.6 hostname
^C
[root@env-test ~]# ssh 172.16.1.61 hostname
root@172.16.1.61's password: 
 
#指定10.0.0.0网段的屏蔽8080端口
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -I INPUT  -s 10.0.0.0/24  -p tcp  --dport 8080 -j DROP 

3.4 只允许指定网段连入(允许10.0.0.0网段)

类似于阿里云白名单功能,开放指定端口和网段,其他均拒绝

4.1、利用!排除,只准许10.0.0.0/24访问

代码语言:bash
复制
[root@Ansible ~]# iptables -I INPUT ! -s 10.0.0.0/24  -j DROP
 
 
[root@Web01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.466 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.658 ms
^C
--- 10.0.0.61 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.466/0.562/0.658/0.096 ms
[root@Web01 ~]# ping 172.16.1.61
PING 172.16.1.61 (172.16.1.61) 56(84) bytes of data.
^C
--- 172.16.1.61 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 2999ms

4.2、修改链默认规则,修改为拒绝,添加准许 

若默认规则修改为拒绝后,ping公网IP可以但是ping公网域名不行,故障类似于DNS解析有问题(我踩过的坑)

代码语言:bash
复制
[root@Ansible ~]# 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@Ansible ~]# iptables -P INPUT DROP 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination                
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 
[root@Ansible ~]# iptables -A  INPUT   -s 10.0.0.0/24   -j  ACCEPT 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

5、指定多个端口
代码语言:bash
复制
[root@Ansible ~]# ​​iptables -I INPUT -p tcp --dport 8888 -j DROP 
[root@Ansible ~]# iptables -I INPUT -p tcp --dport 9999 -j DROP 
[root@Ansible ~]# ​iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9999
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8888
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 
 
[root@Ansible ~]# iptables -I INPUT  -p tcp -m multiport ! --dport 80,443  -j DROP
 
#如果是禁用连续端口可以不加-m multiport 1:1024
[root@Ansible ~]# iptables -I INPUT  -p tcp  --dport 1024:65535  -j DROP 
[root@Ansible ~]#  iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpts:1024:65535
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

6、匹配ICMP类型

ICMP(Internet Control Message Protocol)Internet控制报文协议,ping,是整个网站的核心

通过防火墙规则,控制是否可以ping

代码语言:bash
复制
[root@Ansible ~]# iptables -I INPUT  -p icmp --icmp-type 8  -j DROP 
[root@Ansible ~]# 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 
 
[root@Web01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
^C
--- 10.0.0.61 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5002ms

通过内核参数,控制禁止被ping 

代码语言:bash
复制
[root@Ansible ~]# cat /etc/sysctl.conf     
net.ipv4.icmp_echo_ignore_all = 0    #0为允许,1为禁止
[root@Ansible ~]# sysctl -p 
net.ipv4.icmp_echo_ignore_all = 0
7、匹配网络状态(TCP/IP连接状态)

-m state --state

NEW:已经或将启动新的连接

ESTABLISHED:已建立的连接

RELATED:正在启动的新连接

INVALID:非法或无法识别的

代码语言:bash
复制
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
​
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
8、限制并发及速率

-m limit 限制模块

代码语言:bash
复制
-m limit --limit 10/minute     #每分钟只能有10个数据包 每6秒生成


 -m limit --limit n/{second/minute/hour}:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时
  
 -m limit --limit 10/minute   --limit-burst 5  每6秒释放工牌 给别人使用 
#10个数据包   
前5个  1个1个工牌   从第6个开始 每6秒 才能释放1个工牌 



--limit-burst [n]:在同一时间内允许通过的请求“n”为数字,不指定默认为5
#ping  icmp 协议  进行测试
[root@Ansible ~]# iptables -F 
[root@Ansible ~]# iptables -I INPUT  -p icmp  -m limit --limit 10/minute    --limit-burst 5   -j ACCEPT 
[root@Ansible ~]# iptables -A INPUT  -p tcp  --dport 22 -j  ACCEPT 
[root@Ansible ~]# iptables -P INPUT DROP 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            limit: avg 10/min burst 5
ACCEPT     tcp  --  0.0.0.0/0            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@Web01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.298 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=1.33 ms
64 bytes from 10.0.0.61: icmp_seq=3 ttl=64 time=0.435 ms
64 bytes from 10.0.0.61: icmp_seq=4 ttl=64 time=0.460 ms
64 bytes from 10.0.0.61: icmp_seq=5 ttl=64 time=0.758 ms
64 bytes from 10.0.0.61: icmp_seq=7 ttl=64 time=2.28 ms    #7和1之间间隔6秒
64 bytes from 10.0.0.61: icmp_seq=13 ttl=64 time=0.793 ms  #13和7之间间隔6秒
64 bytes from 10.0.0.61: icmp_seq=19 ttl=64 time=0.734 ms
64 bytes from 10.0.0.61: icmp_seq=25 ttl=64 time=0.803 ms
^C
--- 10.0.0.61 ping statistics ---
26 packets transmitted, 9 received, 65% packet loss, time 25013ms
rtt min/avg/max/mdev = 0.298/0.877/2.286/0.572 ms
9、防火墙规则的保存与恢复

iptables-save 保存,默认输出到屏幕

iptables-restore 恢复,加上文件

写入/etc/sysconfig/iptables

代码语言:bash
复制
[root@Ansible ~]# iptables-save   >/etc/sysconfig/iptables
[root@Ansible ~]#  cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Sun May  7 16:11:34 2023
*nat
:PREROUTING ACCEPT [306:36403]
:INPUT ACCEPT [182:29467]
:OUTPUT ACCEPT [145:11135]
:POSTROUTING ACCEPT [145:11135]
COMMIT
# Completed on Sun May  7 16:11:34 2023
# Generated by iptables-save v1.4.21 on Sun May  7 16:11:34 2023
*filter
:INPUT DROP [17:1428]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [49:5580]
-A INPUT -p icmp -m limit --limit 10/min -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT
# Completed on Sun May  7 16:11:34 2023
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            limit: avg 10/min burst 5
ACCEPT     tcp  --  0.0.0.0/0            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@Ansible ~]# iptables -D INPUT 1 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            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@Ansible ~]# iptables-restore < /etc/sysconfig/iptables
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            limit: avg 10/min burst 5
ACCEPT     tcp  --  0.0.0.0/0            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 
 
此外,systemctl restart iptables 会读取/etc/sysconfig/iptables内容
10、filter表简单总结

1、封ip,端口,网段

2、禁止ping

3、限制速度和并发

4、iptables filter表功能可以在云服务器使用

4 重点用法

iptables配置方式:1、逛公园模式,默认规则是ACCEPT;2、看电影模式,默认规则是DROP

默认是拒绝

1、ssh可以连接
代码语言:bash
复制
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -X
[root@Ansible ~]# iptables -Z
[root@Ansible ~]# 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@Ansible ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            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@Web01 ~]# ssh 10.0.0.61 hostname
root@10.0.0.61's password: 
Ansible

2、设置允许本机lo通讯规则

允许本机回环lo(本地操作)接口数据流量流出和流入

代码语言:bash
复制
[root@Ansible ~]# iptables -A INPUT -i lo -j ACCEPT
[root@Ansible ~]# iptables -A OUTPUT -o lo -j ACCEPT
3、配置默认规则及放行80,443端口
代码语言:bash
复制
[root@Ansible ~]# iptables -P INPUT DROP 
[root@Ansible ~]# iptables -P FORWARD DROP 
[root@Ansible ~]# iptables -P OUTPUT ACCEPT 
[root@Ansible ~]# 
[root@Ansible ~]# iptables -A INPUT  -m multiport -p tcp  --dport 443,80   -j ACCEPT
[root@Ansible ~]# iptables -nL 
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 443,80
 
Chain FORWARD (policy DROP)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
[root@Ansible ~]# iptables -A INPUT  -s 10.0.0.0/24  -j ACCEPT 
[root@Ansible ~]# iptables -A INPUT  -s 172.16.1.0/24  -j ACCEPT
#此处还可以添加 vpn网段 比如说 10.7.1.0/24
 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 443,80
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
ACCEPT     all  --  172.16.1.0/24        0.0.0.0/0           
 
Chain FORWARD (policy DROP)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
[root@Ansible ~]# iptables-save 
# Generated by iptables-save v1.4.21 on Sun May  7 16:24:29 2023
*nat
:PREROUTING ACCEPT [9:711]
:INPUT ACCEPT [2:112]
:OUTPUT ACCEPT [3:312]
:POSTROUTING ACCEPT [3:312]
COMMIT
# Completed on Sun May  7 16:24:29 2023
# Generated by iptables-save v1.4.21 on Sun May  7 16:24:29 2023
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [7:1480]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --dports 443,80 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -j ACCEPT
-A INPUT -s 172.16.1.0/24 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Sun May  7 16:24:29 2023

五 NAT表

恢复链

代码语言:bash
复制
[root@Ansible ~]# iptables -P INPUT ACCEPT
[root@Ansible ~]# iptables -P FORWARD ACCEPT 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 443,80
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
ACCEPT     all  --  172.16.1.0/24        0.0.0.0/0           
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
[root@Ansible ~]# iptables -F
[root@Ansible ~]# 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         
1、实现共享上网

1、防火墙配置

代码语言:bash
复制
[root@Ansible ~]#  iptables -t nat -A POSTROUTING  -s 172.16.1.0/24   -j SNAT  --to-source 10.0.0.61 
[root@Ansible ~]# echo 'net.ipv4.ip_forward = 1'  >> /etc/sysctl.conf 
[root@Ansible ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.ip_forward = 1
 
注意:公网IP不固定
iptables -t nat -A POSTROUTING  -s 172.16.1.0/24   -j  MASQUERADE

2、web配置

代码语言:bash
复制
[root@Web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=no            #修改网卡,禁止开机自启动
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.2
DNS1=223.5.5.5
[root@Web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=172.16.1.61
DNS1=1.2.4.8
[root@Web01 ~]# systemctl restart network
[root@Ansible ~]# ssh 172.16.1.7
Last login: Sun May  7 21:16:43 2023 from 10.0.0.1
[root@Web01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:0c:29:91:01:20 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:91:01:2a brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe91:12a/64 scope link 
       valid_lft forever preferred_lft forever

3、在web01测试结果

代码语言:bash
复制
[root@Web01 ~]# ip r
default via 172.16.1.61 dev eth1 
169.254.0.0/16 dev eth1 scope link metric 1003 
172.16.1.0/24 dev eth1 proto kernel scope link src 172.16.1.7 
[root@Web01 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.1.61     0.0.0.0         UG    0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
172.16.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1
[root@Web01 ~]# ping baidu.com
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=127 time=10.3 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=127 time=12.3 ms
^C
--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 10.306/11.346/12.386/1.040 ms
[root@Web01 ~]# ping 1.2.4.8
PING 1.2.4.8 (1.2.4.8) 56(84) bytes of data.
64 bytes from 1.2.4.8: icmp_seq=1 ttl=127 time=12.5 ms
64 bytes from 1.2.4.8: icmp_seq=2 ttl=127 time=11.3 ms
^C
--- 1.2.4.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 11.337/11.945/12.554/0.618 ms

2、端口转发(端口映射)
代码语言:bash
复制
[root@Ansible ~]# iptables -t nat -A PREROUTING    -d 10.0.0.61 -p tcp --dport 9000  -j DNAT --to-destination 172.16.1.7:22
[root@Ansible ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            10.0.0.61            tcp dpt:9000 to:172.16.1.7:22
 
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  --  172.16.1.0/24        0.0.0.0/0            to:10.0.0.61

本地shell测试

代码语言:bash
复制
c:\~]$ ssh root@10.0.0.61 9000
 
 
Connecting to 10.0.0.61:9000...
Connection established.
To escape to local shell, press Ctrl+Alt+].
 
Last login: Sun May  7 21:34:55 2023 from 10.0.0.61

3、IP映射
代码语言:bash
复制
[root@Ansible ~]#  iptables -t nat -A PREROUTING  -d 10.0.0.62  -j DNAT  --to-destination 172.16.1.7 
[root@Ansible ~]# iptables -nL -t nat 
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            10.0.0.61            tcp dpt:9000 to:172.16.1.7:22
DNAT       all  --  0.0.0.0/0            10.0.0.62            to:172.16.1.7
 
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  --  172.16.1.0/24        0.0.0.0/0            to:10.0.0.61
4、NAT表简单总结

1、可以实现共享上网

2、可以实现端口转发

3、NAT功能在云服务器无法使用,但有替代品叫NAT网关

六 iptables简单练习

1、查看iptables当前所有规则的命令

代码语言:bash
复制
iptables-save 
 
iptables -nL
 
iptables -nL -t nat

2、禁止来自10.0.0.188IP地址访问80端口的请求

代码语言:bash
复制
iptables -I   INPUT   -s 10.0.0.188 -p tcp   --dport 80      -j  DROP 

3、在命令行执行的iptables规则永久生效

代码语言:bash
复制
iptables-save > /etc/sysconfig/iptables

 4、实现把访问10.0.0.3:80请求转到172.16.1.17:80

代码语言:bash
复制
iptables -t nat  -A PREROUTING  -d 10.0.0.3  -p tcp --dport 80    -j   DNAT  --to-destination  172.16.1.17:80

5、实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网

代码语言:bash
复制
iptables   -t nat  -A POSTROUTING    -s 172.16.1.0/24    -j  SNAT  --to-source   123.32.54.26
​
iptables   -t nat  -A POSTROUTING    -s 172.16.1.0/24    -j  SNAT  MASQUERADE

6、iptables实现防止syn ddos和ping攻击

代码语言:bash
复制
-A FORWARD -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
-A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
-A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
说明:第一行:每秒中最多允许5个新连接。第二行:防止各种端口扫描。第三行:Ping洪水攻击(Ping of Death),可以根据需要调整或关闭

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 名词解释
    • 1.1 iptables执行过程
      • 1.3 NAT表
        • 1.4 Mangle表
        • 2 安装iptables
          • 2.1 查看iptables服务的配置文件
            • 2.2 将防火墙相关的模块、加载到内核中
              • 2.3 永久加入,写进开机自启动
                • 2.4 列出三表相关的内核模块,lsmod是列出系统当前载入的所有内核模块
                  • 2.5 关闭firewalld,启用iptables,并设置开机自启动
                    • 2.6 列出iptables所有规则
                      • 2.7 iptables命令参数
                      • 3 配置filter表规则
                        • 3.1 禁止访问22端口
                          • 3.2 封ip,屏蔽某个ip
                            • 3.3 禁止网段连入(禁止10.0.0.0/24网段访问 8080端口)
                              • 3.4 只允许指定网段连入(允许10.0.0.0网段)
                              • 4 重点用法
                              • 五 NAT表
                              • 六 iptables简单练习
                              相关产品与服务
                              容器服务
                              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档