系统相关
首页 > 系统相关> > iptables介绍和基本使用

iptables介绍和基本使用

作者:互联网

iptables

image-20200109152152185

防火墙是什么

防火墙好比一堵真的墙,能够隔绝些什么,保护些什么。

防火墙的本义是指古代构筑和使用木制结构房屋的时候,为防止火灾的发生和蔓延,人们将坚固的石块堆砌在房屋周围作为屏障,这种防护构筑物就被称之为“防火墙”。其实与防火墙一起起作用的就是“门”。

如果没有门,各房间的人如何沟通呢,这些房间的人又如何进去呢?当火灾发生时,这些人又如何逃离现场呢?

这个门就相当于我们这里所讲的防火墙的“安全策略”,所以在此我们所说的防火墙实际并不是一堵实心墙,而是带有一些小孔的墙。

这些小孔就是用来留给那些允许进行的通信,在这些小孔中安装了过滤机制,就是防火墙的过滤策略了。

防火墙的作用

防火墙具有很好的保护作用。入侵者必须首先穿越防火墙的安全防线,才能接触目标计算机。

防火墙的功能

防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信。

最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。

防火墙概念

防火墙一般有硬件防火墙和软件防火墙

硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。

软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。

软件防火墙

Linux提供的软件防火墙,名为iptables,它可以理解为是一个客户端代理,通过iptables的代理,将用户配置的安全策略执行到对应的安全框架中,这个安全框架称之为netfilter

iptables是一个命令行的工具,位于用户空间,我们用这个工具操作真正的框架,也就是netfilter

真正实现流量过滤的防火墙框架是netfilter,位于内核空间,它俩共同组成了Linux的软件防火墙,一般用来代替昂贵的硬件防火墙,实现数据包过滤,网络地址转换等。

在Centos7发行版本下,firewalld防火墙又取代了iptables防火墙

iptables是将配置好的规则交给内核层的netfilter网络过滤器来处理
filrewalld服务是将配置好的防火墙规则交给内核层的nftables网络过滤器处理
这俩工具二选一即可,都只是命令行工具,

iptables

iptables就是按照规则办事的,(rules)规则就是运维事先定义好的规则。

[root@chaogelinux tmp]# iptables -L
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

iptables会从上至下的读取防火墙规则,找到匹配的规则后,就结束匹配工作,并且执行对应的动作。

如果读取所有的防火墙规则都没有符合的,就执行默认的规则。

规则一般两种:允许、拒绝。

规则就存储在内核空间的信息包过滤表中,这些规则定义了源地址信息、目的地址、传输的协议类型、服务类型等

当数据包符合规则条件时候,iptables就根据所定义的方法来处理这些数据包,放行accept、拒绝reject、丢弃drop

image-20200109171759860

iptables服务吧用于处理或者过滤流量的策略称之为规则,多条规则就组成了一个规则链,规则链根据数据包处理位置的不同进行分类。

image-20200109175453113

具体5条链如下

正常情况下,服务器内网向外网发出的流量一般是良性可控的,主要处理的都是input链,从外网流入的流量,需要严格把控,能够很大程度防止恶意流量,造成服务器隐患。

image-20200109180446835

image-20200109180614627

防火墙的规则链,这在生活里很常见,例如外卖禁止入内禁止小贩入内共享单车禁止入内车辆进入要登记

等等。

这些校园、小区门口都有一些规则,用于控制外来的人员,这就好比服务器设置的防火墙规则,禁止哪些流量进入。

好比现在有一个人送外卖,直接第一条规则就禁止入内了,外卖小哥只能离开或是想其他办法

现在又来了一个骑着共享单车的想要进入校园,他不是送外卖的,第一条规则通过,但是第二条规则,给他拦下来了。

现在有一个学生要进去校园,两条规则都不符合,如果默认规则是放行,学生则可以直接进入校园。

动作

校园大门口的保安,除了在门上贴上告示,定义一些规则链以外,在学生进入后还得有一些动作,好比服务器流量进入后,防火墙还得有一些动作去处理流量。

【drop和reject区别】

image-20200109213101307

例如小明在家里,忽然有陌生人敲门,发现是自己的朋友来找自己出去玩,但是不想去,因此拒绝了他们(这就是reject)

如果小明透过猫眼发现门外是一个坏人敲门,小明闷不吭声,假装自己不在家(这就是drop)

iptables命令

语法
iptables(选项)(参数)

这些选项指定执行明确的动作:若指令行下没有其他规定,该行只能指定一个选项. 对于长格式的命令和选项名,所用字母长度只要保证iptables能从其他选项中区 分出该指令就行了。

-A -append
在所选择的链末添加一条或更多规则。当源(地址)或者/与 目的(地址)转换 为多于一个(多个)地址时,这条规则会加到所有可能的地址(组合)后面。
-D -delete
从所选链中删除一条或更多规则。这条命令可以有两种方法:可以把被删除规则 指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。
-R -replace
从选中的链中取代一条规则。如果源(地址)或者/与 目的(地址)被转换为多地 址,该命令会失败。规则序号从1开始。
-I -insert
根据给出的规则序号向所选链中插入一条或更多规则。所以,如果规则序号为1, 规则会被插入链的头部。这也是不指定规则序号时的默认方式。
-L -list
显示所选链的所有规则。如果没有选择链,所有链将被显示。也可以和z选项一起 使用,这时链会被自动列出和归零。精确输出受其它所给参数影响。
-F -flush
清空所选链。这等于把所有规则一个个的删除。
--Z -zero
把所有链的包及字节的计数器清空。它可以和 -L配合使用,在清空前察看计数器,请参见前文。
-N -new-chain
根据给出的名称建立一个新的用户定义链。这必须保证没有同名的链存在。
-X -delete-chain
删除指定的用户自定义链。这个链必须没有被引用,如果被引用,在删除之前你必须删 除或者替换与之有关的规则。如果没有给出参数,这条命令将试着删除每个非 内建的链。
-P -policy
设置链的目标规则。
-E -rename-chain
根据用户给出的名字对指定链进行重命名,这仅仅是修饰,对整个表的结构没有影响。 TARGETS参数给出一个合法的目标。只有非用户自定义链可以使用规则,而且内建链和用 户自定义链都不能是规则的目标。
-h Help.
帮助。给出当前命令语法非常简短的说明。

p -protocal [!]protocol
规则或者包检查(待检查包)的协议。指定协议可以是tcp、udp、icmp中的一个或 者全部,也可以是数值,代表这些协议中的某一个。当然也可以使用在/etc/pro tocols中定义的协议名。在协议名前加上"!"表示相反的规则。数字0相当于所有 all。Protocol all会匹配所有协议,而且这是缺省时的选项。在和check命令结合 时,all可以不被使用。

-s -source [!] address[/mask]
指定源地址,可以是主机名、网络名和清楚的IP地址。mask说明可以是网络掩码 或清楚的数字,在网络掩码的左边指定网络掩码左边”1”的个数,因此,mask 值为24等于255.255.255.0。在指定地址前加上"!"说明指定了相反的地址段。标志 
 --src 是这个选项的简写。

-d --destination [!] address[/mask]
指定目标地址,要获取详细说明请参见 -s标志的说明。标志 --dst 是这个选项的简写。

-j --jump target
(-j 目标跳转)指定规则的目标;也就是说,如果包匹配应当做什么。目标可以是用 户自定义链(不是这条规则所在的),某个会立即决定包的命运的专用内建目标, 或者一个扩展(参见下面的EXTENSIONS)。如果规则的这个选项被忽略,那么匹 配的过程不会对包产生影响,不过规则的计数器会增加。

-i -in-interface [!] [name]
(i -进入的(网络)接口 [!][名称])这是包经由该接口接收的可选的入口名称,包通过 该接口接收(在链INPUT、FORWORD和PREROUTING中进入的包)。当在接口名 前使用"!"说明后,指的是相反的名称。如果接口名后面加上"+",则所有以此接口名 开头的接口都会被匹配。如果这个选项被忽略,会假设为"+",那么将匹配任意接口。

-o --out-interface [!][name]
(-o --输出接口[名称])这是包经由该接口送出的可选的出口名称,包通过该口输出(在 链FORWARD、OUTPUT和POSTROUTING中送出的包)。当在接口名前使用"!"说明 后,指的是相反的名称。如果接口名后面加上"+",则所有以此接口名开头的接口都会 被匹配。如果这个选项被忽略,会假设为"+",那么将匹配所有任意接口。

--dport num  匹配目标端口号
--sport num  匹配来源端口号

iptables命令顺序

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

表名包括:

规则链名包括:

动作包括:

案例

1.禁止服务器被ping,服务器拒绝icmp的流量,给与响应

#给INPUT链添加规则,指定icmp协议,指定icmp类型 是8(回显请求),  -s指定网段范围  -j 跳转的目标,即将做什么
iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j REJECT

#客户端机器
yumac: ~ yuchao$ping 123.206.16.61
PING 123.206.16.61 (123.206.16.61): 56 data bytes
92 bytes from pyyuc (123.206.16.61): Destination Port Unreachable
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 5400 c4b6   0 0000  33  01 6b31 192.168.11.14  123.206.16.61

2.服务器禁ping,请求直接丢弃

[root@chaogelinux ~]# iptables -F
[root@chaogelinux ~]# iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP

yumac: ~ yuchao$ping 123.206.16.61
PING 123.206.16.61 (123.206.16.61): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2

3.检查防火墙规则

[root@chaogelinux ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       icmp --  anywhere             anywhere             icmp echo-request

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

4.清空所有防火墙规则链

[root@chaogelinux ~]# iptables -F
[root@chaogelinux ~]# iptables -L
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

5.注意不要轻易在云服务器上设置,默认拒绝的规则,否则ssh流量进不去,直接断开远程连接了

6.删除第一条规则

[root@chaogelinux ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       icmp --  anywhere             anywhere             icmp echo-request

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
[root@chaogelinux ~]#
[root@chaogelinux ~]# iptables -D INPUT 1

7.禁止访问本机的80端口

#禁止流量进入,指定tcp类型,拒绝的端口是80,动作是拒绝
iptables -A INPUT -p tcp --dport 80 -j DROP

#客户端访问
pythonav.cn

8.禁止服务器的FTP端口,也就是禁止21端口

yumac: ~ yuchao$ftp 123.206.16.61
Connected to 123.206.16.61.
220 (vsFTPd 3.0.2)
Name (123.206.16.61:yuchao): chaoge
331 Please specify the password.
Password:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Jan 08 02:49 haha
drwx------    2 2003     2003         4096 Jan 08 02:50 超哥到此一游
226 Directory send OK.
ftp>


#服务器禁止21端口流量
[root@chaogelinux ~]# iptables -A INPUT -p tcp --dport 21 -j DROP

#此时已经无法连接ftp
yumac: ~ yuchao$ftp 123.206.16.61

9.只允许指定的ip远程连接此服务器,拒绝其他主机22端口流量

#iptables自上而下匹配
iptables -A INPUT -s 222.35.242.139/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j REJECT

[root@chaogelinux ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  222.35.242.0/24      anywhere             tcp dpt:ssh
REJECT     tcp  --  anywhere             anywhere             tcp dpt:ssh reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


#换一台ip的机器,直接被拒绝
[root@web01 ~]# ssh root@123.206.16.61
ssh: connect to host 123.206.16.61 port 22: Connection refused

#只要删除第二条拒绝的规则,即可
[root@chaogelinux ~]# iptables -D INPUT 2

#又可以连接了
[root@web01 ~]# ssh root@123.206.16.61

10.禁止指定的机器ip,访问本机的80端口策略,可以封禁某些恶意请求

#此时的防火墙规则
[root@chaogelinux ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  222.35.242.0/24      anywhere             tcp dpt:ssh
REJECT     tcp  --  anywhere             anywhere             tcp dpt:ssh reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


#在规则链开头,追加一个新规则,禁止某个ip地址,访问本机的80端口
[root@chaogelinux ~]# iptables -I INPUT -p tcp -s 222.35.242.139/24 --dport 80 -j REJECT
[root@chaogelinux ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
REJECT     tcp  --  222.35.242.0/24      anywhere             tcp dpt:http reject-with icmp-port-unreachable
ACCEPT     tcp  --  222.35.242.0/24      anywhere             tcp dpt:ssh
REJECT     tcp  --  anywhere             anywhere             tcp dpt:ssh reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
[root@chaogelinux ~]#


#此时已经无法访问
yumac: ~ yuchao$curl 123.206.16.61
curl: (7) Failed to connect to 123.206.16.61 port 80: Connection refused

11.禁止所有的主机网段,访问本机的8000~9000的端口

[root@chaogelinux ~]# iptables -A INPUT -p tcp -s 0/0 --dport  8000:9000 -j REJECT
[root@chaogelinux ~]#
[root@chaogelinux ~]#
[root@chaogelinux ~]# iptables -A INPUT -p udp -s 0/0 --dport  8000:9000 -j REJECT

firewalld

防火墙是 Linux 系统的主要的安全工具,可以提供基本的安全防护,在 Linux 历史上已经使用过的防火墙工具包括:ipfwadm、ipchains、iptables。在 Firewalld 中新引入了区域(Zones)这个概念。

firewalld 区域

firewalld通过将网络划分为不同的区域,制定出不同的区域之间访问控制策略。

例如公网环境是不可信任的区域,企业内网是高度信任的区域。

例如公共WIFI完全不受信任,家庭网一般完全可信。

image-20200110154606573


firewalld 提供了支持网络 / 防火墙区域 (zone) 定义网络链接以及接口安全等级的动态防火墙管理工具

它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。

这个区域指的就是firewalld预先配置好的防火墙策略模板,用户根据不同的场景选择合适的策略模板。

例如我们一台机器可能会运行在不同的环境,公司中,咖啡馆,家庭。

image-20200110154711396

免费的公共wifi就等同于你把你的车敞开车门停在停车场内,你可以想象下有多不安全。所以在公共场所使用免费wifi时不要使用网上银行,因为电脑黑客无处不在。

如果来回切换多个环境,我们就得反复修改规则,很是麻烦,因此firewalld提供了防火墙规则模板,我们只需要切换不同的区域,即可实现不同的防火墙规则,很是方便。

zone区域 策略
drop(丢弃) 任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制) 任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
public(公共) 在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external(外部) 特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区) 用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work(工作) 用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭) 用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部) 用于内部网络。同于home
trusted(信任) 可接受所有的网络连接。
  说明:firewalld 的缺省区域是 public。

firewalld-cmd命令

请使用public区域,权限放开的较多,便于做实验

启动CentOS/RHEL 7后,防火墙规则设置由firewalld服务进程默认管理。

[root@chaogelinux ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

一个叫做firewall-cmd的命令行客户端支持和这个守护进程通信以永久修改防火墙规则。

# firewall-cmd --list-all-zones    #查看所有的zone信息

# firewall-cmd --get-default-zone     #查看默认zone是哪一个

# firewall-cmd --zone=internal --change-zone=p3p1  #临时修改接口p3p1所属的zone为internal

# firewall-cmd --add-service=http    #暂时开放http

# firewall-cmd --permanent --add-service=http  #永久开放http

# firewall-cmd --zone=public --add-port=80/tcp --permanent  #在public中永久开放80端口

# firewall-cmd --permanent --zone=public --remove-service=ssh   #从public zone中移除服务

# firewall-cmd --reload   #重新加载配置

有关firewalld-cmd命令可以这么查看

[root@chaogelinux ~]# firewall-cmd --help

需要注意的是,firewalld配置的策略是运行时生效(Runtime),系统重启,配置也就丢失了

可以在配置参数的时候,添加--permanent参数,防火墙配置永久生效

案例

# firewall-cmd --zone=public --add-port=80/tcp --permanent    #开放80 端口
--zone #作用域
--add-port=80/tcp  #添加端口,格式为:端口/通讯协议
--permanent   #永久生效,没有此参数重启后失效

firewalld案例

[root@chaogelinux ~]# firewall-cmd --get-default-zone      #服务没有运行
FirewallD is not running

#启动服务
systemctl start firewalld

1.检查当前firewalld的区域

[root@chaogelinux ~]# firewall-cmd --get-default-zone
public

2.设置当前区域为家庭区域,个人学习时候,还是使用public

[root@chaogelinux ~]# firewall-cmd --set-default-zone=home
success

[root@chaogelinux ~]# firewall-cmd --get-default-zone
home

[root@chaogelinux ~]# firewall-cmd --set-default-zone=home
success

3.永久修改eth0网卡为public家庭区域

[root@chaogelinux ~]# firewall-cmd --permanent --zone=public --change-interface=eth0
success

#改完了重新加载服务
[root@chaogelinux ~]# firewall-cmd --reload
success

[root@chaogelinux ~]# firewall-cmd --permanent --zone=public --change-interface=eth0
success

#查询eth0网卡默认区域
[root@chaogelinux ~]# firewall-cmd --get-zone-of-interface=eth0
home

4.拒绝所有流量包

慎用,会断开ssh流量,一般用于服务器被恶意攻击

firewall-cmd --panic-on  #立刻回断开所有的流量连接
firewall-cmd --panic-off    #解封

5.查询public区域是否允许了

#防火墙允许ssh通过
[root@chaogelinux ~]# firewall-cmd  --zone=public--query-service=ssh
yes

#防火墙是否允许了http服务
[root@chaogelinux ~]# firewall-cmd  --zone=public  --query-service=http
no
#此时服务器的80端口是无法访问的

#防火墙是否允许了ftp服务
[root@chaogelinux ~]# firewall-cmd  --zone=public  --query-service=ftp
no

修改firewalld规则,允许http,ftp服务通过,永久生效

添加参数--permanent则是永久生效,必须得重启

#临时配置,立即生效
[root@chaogelinux ~]# firewall-cmd --zone=public --add-service=http
success
#永久配置,需要reload
[root@chaogelinux ~]# firewall-cmd  --permanent --zone=public --add-service=http
success
[root@chaogelinux ~]# firewall-cmd --reload
success

#永久配置ftp规则允许通过
[root@chaogelinux ~]# firewall-cmd --permanent --zone=public --add-service=ftp
success
[root@chaogelinux ~]# firewall-cmd --reload
success


#如果拒绝就删除即可,永久删除,也得reload重新加载
[root@chaogelinux ~]# firewall-cmd --permanent --zone=public --remove-service=ftp
success
[root@linuxprobe ~]# firewall-cmd --reload
success

临时打开某个端口的访问策略

[root@chaogelinux ~]# firewall-cmd --zone=public --add-port=8000-9000/tcp
success

#列出端口情况
[root@chaogelinux ~]# firewall-cmd --zone=public --list-ports
8000-9000/tcp

【防火墙端口转发】

如下管理命令

#列出home区域的端口转发情况
[root@chaogelinux ~]# firewall-cmd --permanent  --zone=public --list-forward-ports

#转发语句,将23344端口的流量,转发给22端口
[root@chaogelinux ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=23344:proto=tcp:toport=22:toaddr=192.168.178.185
success

#记住,firewalld 加上--permanent参数,必须reload才行
[root@chaogelinux ~]# firewall-cmd --reload
success


#如要删除转发语句
firewall-cmd --permanent --zone=public --remove-forward-port=port=23344:proto=tcp:toport=22:toaddr=192

标签:iptables,基本,--,cmd,防火墙,介绍,规则,chaogelinux,root
来源: https://www.cnblogs.com/xiaohaoge/p/16456408.html