iptables 防火墙笔记(二)

承上:iptables 防火墙笔记(一)

常用扩展模块

iprange

  • -s-d选项不能一次性指定一段连续的 IP 地址范围
  • iprange 扩展模块可以实现一次性指定一段连续的 IP 地址范围
  • --src-range:匹配报文的源地址范围
  • --dst-range:匹配报文的目标地址范围

来举一个栗子:

############限制102-105的IP通过访问101的地址
[root@vm-01 ~]# iptables -t filter -I INPUT -m iprange --src-range 192.168.204.102-192.168.204.105 -j DROP

############在102尝试通过SSH登录101:卡住,登录不了
[root@vm-02 ~]# ssh 192.168.204.101


string

可以指定匹配的字符串,报文中包含对应的字符串,就能够匹配上

请看下面:

  • 在 vm02 上面安装好 nginx 并启动(用 docker 撒,方便),用 vm01访问它
[root@vm-01 /]# curl 192.168.204.102
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@vm-01 /]#
  • 添加规则:阻止页面内容带有“Welcome”字符串

    请继续看下面:是这个栗子

[root@vm-01 /]# iptables -I INPUT -m string --algo bm --string "Welcome" -j REJECT
[root@vm-01 /]# curl 192.168.204.102
curl: (56) Recv failure: Connection reset by peer
[root@vm-01 /]#

time

通过 time 扩展模块,根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件

这个比方不好打,我还没学会

待补充

connlimit

使用 connlimit 扩展模块,可以限制每个 IP 地址同时链接到 server 端的链接数量,注意:我们不用指定 IP,其默认就是针对”每个客户端IP”,即对单IP的并发连接数限制

这个比方可以打一下:

  • 限制 ssh 连接远程(一个 IP 只能连接一次)
[root@vm-01 /]# iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 1 -j REJECT
[root@vm-01 /]#

image-20220721163816738

第二个连接就不得行了撒

image-20220721163853290

limit

  • limit 模块是对”报文到达速率”进行限制的
  • 限制单位时间内流入的包的数量,就能用 limit模块
  • 以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制

这个比方也不好打,不打了,太强了

iptables 黑白名单机制

报文在经过iptables的链时,会匹配链中的规则,遇到匹配的规则时,就执行对应的动作,如果链中的规则都无法匹配到当前报文,则使用链的默认策略(默认动作),链的默认策略通常设置为 ACCEPT 或者 DROP 。

当链的默认策略设置为 ACCEPT 时,如果对应的链中没有配置任何规则,就表示接受所有的报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被接受。同理,当链的默认策略设置为 DROP 时,如果对应的链中没有配置任何规则,就表示拒绝所有报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被拒绝。

  • 当链的默认策略为 ACCEPT 时,链中的规则对应的动作应该为 DROP 或者 REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是”黑名单”机制

  • 当链的默认策略为 DROP 时,链中的规则对应的动作应该为 ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是”白名单”机制

默认策略 DROP 的缺点

在对应的链中没有设置任何规则时,这样使用默认策略为 DROP 是非常不明智的,因为管理员也会把自己拒之门外,即使对应的链中存在放行规则,当我们不小心使用”iptables -F”清空规则时,放行规则被删除,则所有数据包都无法进入,这个时候就相当于给管理员挖了个坑,所以,我们如果想要使用”白名单”的机制,最好将链的默认策略保持为”ACCEPT”,然后将”拒绝所有请求”这条规则放在链的尾部,将”放行规则”放在前面,这样做,既能实现”白名单”机制,又能保证在规则被清空时,管理员还有机会连接到主机。

iptables 自定义链

为什么还需要自定义链?

默认链中如果规则太多,不方便我们管理

实际比方一下

我们可以通过-N 选项创建一个自定义链

  • 我们来创建一个关于 web 相关的链
iptables -t filter -N IN_WEB

image-20220721172022662

  • 可以看到创建了一个自定义链,引用计数为0,要引用了才能使用
  • 在自定义链中创建一些规则
[root@vm-02 ~]# iptables -I IN_WEB -s 192.168.204.101 -j REJECT
[root@vm-02 ~]# iptables --line-numbers -vnL IN_WEB
Chain IN_WEB (0 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       192.168.204.101      0.0.0.0/0            reject-with icmp-port-unreachable
[root@vm-02 ~]#
  • 引用一下这个链
[root@vm-02 ~]# iptables -I INPUT -p tcp --dport 22 -j IN_WEB
[root@vm-02 ~]# iptables --line-numbers -vnL IN_WEB
Chain IN_WEB (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       192.168.204.101      0.0.0.0/0            reject-with icmp-port-unreachable
[root@vm-02 ~]#
  • 从192.168.204.101 尝试通过 ssh 登录一下

    从下面的比方可以看出来,登录不了,所以上述的规则意思就是:通过22端口过来的时候匹配交给 IN_WEB 链去处理,自定义链是拒绝了源地址是192.168.204.101的访问

[root@vm-01 /]# ssh 192.168.204.102
ssh: connect to host 192.168.204.102 port 22: Connection refused
[root@vm-01 /]#

如何删除自定义链

使用-X可以删除自定义链,不过有些条件:

  • 自定义链没有被任何默认链引用,即自定义链的引用计数为0
  • 自定义链中没有任何规则,即自定义链为空

来打一个比方:

我们接着上述的规则操作,我要删除 IN_WEB 自定义链

[root@vm-02 ~]# iptables -X IN_WEB
iptables: Too many links.
[root@vm-02 ~]#
###########提示还存在链引用,我们删除链引用
[root@vm-02 ~]# iptables --line-numbers -vnL INPUT
Chain INPUT (policy ACCEPT 160 packets, 10396 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1      158 10228 IN_WEB     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
[root@vm-02 ~]# iptables -D INPUT 1
[root@vm-02 ~]# iptables -X IN_WEB
iptables: Directory not empty.
[root@vm-02 ~]#
###########提示还存在一些问题,我们再删除一些规则
[root@vm-02 ~]# iptables --line-numbers -vnL IN_WEB
Chain IN_WEB (0 references)
num   pkts bytes target     prot opt in     out     source               destination
1        1    60 REJECT     all  --  *      *       192.168.204.101      0.0.0.0/0            reject-with icmp-port-unreachable
[root@vm-02 ~]# iptables -D IN_WEB 1
[root@vm-02 ~]# iptables -X IN_WEB
[root@vm-02 ~]#
###########这下就删除了撒

删除规则后也可以登录了

[root@vm-01 /]# ssh 192.168.204.102
ssh: connect to host 192.168.204.102 port 22: Connection refused
[root@vm-01 /]# ssh 192.168.204.102
root@192.168.204.102's password:
Last login: Thu Jul 21 16:37:27 2022 from 192.168.204.1
[root@vm-02 ~]#

iptables 之网络防火墙

概念回顾

  • 主机防火墙:针对于单个主机进行防护

  • 网络防火墙: 往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网

如果想要使用 iptables 充当网络防火墙,iptables 所在的主机则需要处于网络入口处

我们想要将 iptables 所在的主机打造成”网络防火墙”,而网络防火墙的职责就是”过滤并转发”,要想”过滤”,只能在 INPUT、OUTPUT、FORWARD 三条链中实现,要想”转发”,报文则只会经过 FORWARD 链(发往本机的报文才会经过INPUT链),所以,综上所述,iptables的角色变为”网络防火墙”时,规则只能定义在 FORWARD 链中

  • 充当网络防火墙,需要开启内核 TCP 转发功能
[root@vm-02 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@vm-02 ~]#

然后就可以根据上面的知识进行设置各种规则了

iptables 动作总结1

常用动作

  • ACCEPT
  • DROP
  • REJECT

扩展动作

  • 需要借助扩展模块
  • 扩展是直接可以使用,不需要指定特定的模块,不像扩展匹配那样
  • REJECT 就属于扩展动作

REJECT

REJECT动作的常用选项为--reject-with:可以设置提示信息,当对方被拒绝,会提示对方为什么拒绝

可用值:

icmp-net-unreachable:这是默认值

icmp-host-unreachable

icmp-port-unreachable,

icmp-proto-unreachable

icmp-net-prohibited

icmp-host-pro-hibited

icmp-admin-prohibited

请看下面的比方:

  • 我们增加一条规则,禁止 ping
[root@vm-01 ~]# iptables -t filter -I INPUT -p icmp -j REJECT
[root@vm-01 ~]#
  • 另一台服务 ping vm-01:结果可以看出显示的就是默认的“icmp-net-unreachable”
[root@vm-02 ~]# ping -c 4 192.168.204.101
PING 192.168.204.101 (192.168.204.101) 56(84) bytes of data.
From 192.168.204.101 icmp_seq=1 Destination Port Unreachable
From 192.168.204.101 icmp_seq=2 Destination Port Unreachable
From 192.168.204.101 icmp_seq=3 Destination Port Unreachable
From 192.168.204.101 icmp_seq=4 Destination Port Unreachable

--- 192.168.204.101 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3002ms

[root@vm-02 ~]#
  • 我们删除上面创建的规则,重新设置一条
[root@vm-01 ~]# iptables --line-numbers -vnL INPUT
Chain INPUT (policy ACCEPT 157 packets, 10696 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        4   336 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
[root@vm-01 ~]# iptables -D INPUT 1
[root@vm-01 ~]# iptables -t filter -I INPUT -p icmp -j REJECT --reject-with icmp-host-unreachable
[root@vm-01 ~]#
  • 再来 ping 一下:很明显了撒
[root@vm-02 ~]# ping -c 4 192.168.204.101
PING 192.168.204.101 (192.168.204.101) 56(84) bytes of data.
From 192.168.204.101 icmp_seq=1 Destination Host Unreachable
From 192.168.204.101 icmp_seq=2 Destination Host Unreachable
From 192.168.204.101 icmp_seq=3 Destination Host Unreachable
From 192.168.204.101 icmp_seq=4 Destination Host Unreachable

--- 192.168.204.101 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3001ms

[root@vm-02 ~]#

动作 LOG

这是个啥子东西?

  • 使用动作 LOG 可以将符合条件的报文相关信息记录到日志中
  • LOG 动作只负责记录匹配到的报文的相关信息,不负责对报文的其他处理,如果想要对报文进行进一步的处理,可以在之后设置具体规则,进行进一步的处理

这是个栗子

  • 设置规则看一下
[root@vm-01 ~]# iptables -I INPUT  -p icmp -j LOG
[root@vm-01 ~]#
  • 从另一条进行 ping
[root@vm-02 ~]# ping -c 4 192.168.204.101
PING 192.168.204.101 (192.168.204.101) 56(84) bytes of data.
64 bytes from 192.168.204.101: icmp_seq=1 ttl=64 time=0.550 ms
64 bytes from 192.168.204.101: icmp_seq=2 ttl=64 time=0.350 ms
64 bytes from 192.168.204.101: icmp_seq=3 ttl=64 time=0.746 ms
64 bytes from 192.168.204.101: icmp_seq=4 ttl=64 time=0.490 ms

--- 192.168.204.101 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.350/0.534/0.746/0.142 ms
[root@vm-02 ~]#
  • 查看日志文件:可以看到有相关日志了
[root@vm-01 ~]# tail /var/log/messages
Jul 21 17:45:29 vm-01 systemd-logind: New session 24 of user root.
Jul 21 17:45:29 vm-01 systemd: Started Session 25 of user root.
Jul 21 17:45:29 vm-01 systemd-logind: New session 25 of user root.
Jul 21 18:01:01 vm-01 systemd: Started Session 26 of user root.
Jul 21 19:01:01 vm-01 systemd: Started Session 27 of user root.
Jul 21 20:01:01 vm-01 systemd: Started Session 28 of user root.
Jul 21 20:41:02 vm-01 kernel: IN=ens32 OUT= MAC=00:0c:29:dd:7e:2f:00:50:56:24:e8:e5:08:00 SRC=192.168.204.102 DST=192.168.204.101 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=35507 DF PROTO=ICMP TYPE=8 CODE=0 ID=3061 SEQ=1
Jul 21 20:41:03 vm-01 kernel: IN=ens32 OUT= MAC=00:0c:29:dd:7e:2f:00:50:56:24:e8:e5:08:00 SRC=192.168.204.102 DST=192.168.204.101 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=36489 DF PROTO=ICMP TYPE=8 CODE=0 ID=3061 SEQ=2
Jul 21 20:41:04 vm-01 kernel: IN=ens32 OUT= MAC=00:0c:29:dd:7e:2f:00:50:56:24:e8:e5:08:00 SRC=192.168.204.102 DST=192.168.204.101 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37106 DF PROTO=ICMP TYPE=8 CODE=0 ID=3061 SEQ=3
Jul 21 20:41:05 vm-01 kernel: IN=ens32 OUT= MAC=00:0c:29:dd:7e:2f:00:50:56:24:e8:e5:08:00 SRC=192.168.204.102 DST=192.168.204.101 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37941 DF PROTO=ICMP TYPE=8 CODE=0 ID=3061 SEQ=4
[root@vm-01 ~]#
  • 上述规则表示:通过 icmp 协议过来的报文信息都符合记录 LOG的条件,所以可以看到
  • 也可指定相关日志文件记录,需要修改 rsyslog 服务文件

iptables 动作总结2

NAT

NAT 是 Network Address Translation 的缩写,译为”网络地址转换”,NAT 说白了就是修改报文的 IP 地址,NAT 功能通常会被集成到路由器、防火墙、或独立的NAT设备中

NAT 表:

image-20220721210252549

NAPT:

NAPT 是 NAT 的一种,全称为 Network Address Port Translation,说白了就是映射报文 IP 地址的同时还会映射其端口号

内部网络的报文发送出去时,报文的源IP会被修改,也就是源地址转换:Source Network Address Translation,缩写为SNAT。

外部网络的报文响应时,响应报文的目标IP会再次被修改,也就是目标地址转换:Destinationnetwork address translation,缩写为DNAT。

但是,上述”整个过程”被称为SNAT,因为”整个过程”的前半段使用了SNAT,如果上述”整个过程”的前半段使用了DNAT,则整个过程被称为DNAT,也就是说,整个过程被称为SNAT还是DNAT,取决于整个过程的前半段使用了SNAT还是DNAT。

SNAT不仅能够隐藏网内的主机IP,还能够共享公网IP

下次再演示

iptables 建议

  • 规则顺序的重要性
  • 规则中多个匹配条件默认是“与”关系
  • 主机作为网络防火墙时,在配置规则时,应着重考虑方向性,双向都要考虑,从外到内,从内到外
  • 在配置白名单时,往往会将链的默认策略设置为 ACCEPT,通过在链的最后设置 REJECT 规则实现白名单机制,而不是将链的默认策略设置为 DROP,如果将链的默认策略设置为 DROP,当链中的规则被清空时,管理员的请求也将会被 DROP 掉
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值