文章目录
- 常用扩展模块
- iprange
- string
- time
- connlimit
- limit
- iptables 黑白名单机制
- iptables 自定义链
- iptables 之网络防火墙
- iptables 动作总结1
- iptables 动作总结2
- 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 /]#
第二个连接就不得行了撒
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
- 可以看到创建了一个自定义链,引用计数为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 表:
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 掉