IPTABLES命令使用学习

iptables命令常用规则汇总

Zgao 运维网工 2023-03-14 09:00 发表于重庆
iptables非常强大,但是参数选项多,学习成本较高。本文将常用的iptables的命令进行汇总,在关键时刻方便拿来即用。
防火墙的作用:
1.封端口,封IP
2.实现NAT功能
3.共享上网
4.端口映射(端口转发),IP映射
学习之前,关闭firewalld,禁用开机自启firewalld
安装iptables-services防火墙软件包: yum -y install  iptables-services         启动防火墙iptables服务: systemctl enable iptables --now

 防火墙的种类:硬件,软件,云三种防火墙

 几个名词

 

 iptables执行流程:

 

 filter表:

nat表:

 架构图:

 安装IPTABLES:

356 root '2023-11-09 09:39:58 'yum -y install iptables-services
357 root '2023-11-09 09:40:55 'rpm -q iptables
358 root '2023-11-09 09:44:41 'systemctl status iptables
362 root '2023-11-09 09:45:31 'rpm -q iptables
363 root '2023-11-09 09:45:34 'systemctl status iptables
364 root '2023-11-09 09:45:40 'systemctl start iptables;
365 root '2023-11-09 09:45:43 'systemctl status iptables

 

[root@zabbix-agent ~]# rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables                 主配置文件
/usr/lib/systemd/system/ip6tables.service
/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

 

/usr/sbin/iptables  iptables#命令执行文件   添加删除查看 规则(四表五链)

find / -name "iptables-save"
/usr/sbin/iptables-save  #iptables规则输出(保存)

[root@source ~]# find / -name "iptables-restore"
/usr/sbin/iptables-restore   #iptables恢复

 查看/etc/sysconfig//iptables主配置文件

 启动并开机自启iptables : systemctl start iptables && systemctl enable  iptables

将IPTABLES防火墙墙模块添加到内核中

[root@source ~]# 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

modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

检查是否在内核中:

lsmod |egrep 'filter|nat|contrack|ftp|state|tables'

 

 ###查NAT表的规则有哪些?

[root@source ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

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

 ###查FILTER表的规则有哪些?

[root@source ~]# 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
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
[root@source ~]#

 iptables默认是filter规则

 iptables命令参数:

 

 

 

 

 配置filter规则:

举例:拦截TCP协议的22端口 

iptables -t filter -I INPUT -p tcp  --dport 22  -j DROP

 结果:

本机查询(vmware相当于是机旁直连服务器,查询)

 

 开发22端口:

iptables -t filter -I INPUT -p tcp  --dport 22  -j  ACCEPT

##上面的accept优先级高于下面的drop,所以此时应该是可以远程登陆的

 结果:

 案例1:封ip,屏蔽某个IP,屏蔽网段:

 执行:

#屏蔽IP

iptables -t filter -I INPUT -s 192.168.8.101 -j DROP          #DROP拒绝,没有回应,就是丢弃!!

实现效果:

 

 

iptables -D INPUT 1

 

 #屏蔽IP

iptables -t filter -I INPUT -s 192.168.8.101 -j REJECT

 #屏蔽网段:

iptables -t filter -I INPUT -s 192.168.8.0/24 -j REJECT(DROP)

 

 

 案例02:禁止网段连入(禁止10.0.0.0/24网段访问8888端口)

 

 

 

iptables -t filter -I INPUT -s 192.168.8.0/24 -p tcp --dport 8888 -j DROP

 案例03:只允许指定网段连入(指定网段)

实现阿里云白名单功能:

allow   XXXXXXXXXXXXX.0/24;

deny all

 

案例04:指定多个端口

 案例5:icmp禁止ping

 1为禁止ping  0为开放ping

 

 

 

案例06:匹配网络状态,通过防火墙控制连接状态

 

 修改并发量限制:

iptables -t filter -I INPUT -p icmp -m limit --limit 10/min --limit-burst 5 -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -P INPUT DROP  #修改默认规则

 

########案例8防火墙规则的报存与恢复:

 

 恢复

 

 

 

 

 

 

 

 

 

 

 

iptables的四表五链

iptables的四表五链是指iptables中的四个表和五个链。四个表分别是:

  1. filter表:用于过滤数据包,控制网络流量。

  2. nat表:用于对数据包进行地址转换,实现网络地址转换(NAT)功能。

  3. mangle表:用于修改数据包的头部信息,比如TTL、TOS等。

  4. raw表:用于处理数据包的连接状态,对于未建立连接的数据包进行处理。

五个链分别是:

  1. PREROUTING:数据包进入路由之前进行处理。

  2. INPUT:数据包进入本机之前进行处理。

  3. FORWARD:数据包转发到其他主机之前进行处理。

  4. OUTPUT:数据包从本机发出之前进行处理。

  5. POSTROUTING:数据包离开路由之后进行处理。

iptables中需要用 -t <表名> 来指定查看对应表的规则,不指定默认为filter表的规则。例如查看nat表的规则:

iptables -t nat -L

图片

查看表的详细规则

iptables -t nat -nvL --line-numbers

图片

显示编号方便删除指定的规则。

端口转发

开启内核转发

echo "net.ipv4.ip_forward = 1">>/etc/sysctl.conf

sysctl -p

本地端口转发

本地端口转发,只涉及一台机器。比如外部访问本机的2222端口转发到本地的22端口。

iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-port 22

图片

添加上面的规则后,外部可以访问,但是本地127.0.0.1无法访问。因为本地的请求不经过PREROUTING。

多主机端口转发

A的ip是192.168.1.2,B的ip是192.168.1.1,A和B是内网互通的,现在有一个外部ip(1.2.3.4)为C,C想通过访问B的2222端口从而访问到A的22端口。

图片

iptables -t nat -A POSTROUTING -d 192.168.1.2 -p tcp --dport 22 -j SNAT --to-source 192.168.1.1

该命令很重要!将所有从A机器返回的TCP流量的源地址改为B机器的IP地址,不管单端口还是多端口转发都需要执行。

单端口转发

iptables -t nat -A PREROUTING -s 1.2.3.4 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.2:22

第一条命令将所有目的地为1.2.3.4且端口为2222的TCP流量重定向到A机器的22端口。

注意:这两条都要在B机器上执行,因为它是外部访问的目标机器。

如果不想限制外部访问的来源是C,可以不指定-s选项。

iptables -t nat -A PREROUTING  -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.2:22

这样任意外部ip访问都可以请求转发了。

多端口转发

针对上面的命令,如果是多端口转发,可以分为多对一和多对多的情况。

注意:经测试,iptables不支持在一条命令中实现不同主机的多端口的不同映射。比如同时将B的80转发到A的8080,将B的443转发到A的4443。

多对一端口转发

例如将B的50000到60000的端口全部转发到A的443端口,命令如下:

iptables -t nat -I PREROUTING  -p tcp  -m multiport --dport 50000:60000 -j DNAT --to-destination 192.168.1.2:443

注意:”–dports” 参数指定端口范围,使用冒号 “:” 表示起始端口和结束端口之间的范围。

多对多端口转发

例如将B的50000到60000的端口全部转发到A的50000到60000的端口,命令如下:

iptables -t nat -I PREROUTING -p tcp -m multiport --dport 50000:60000 -j DNAT --to-destination 192.168.1.2:50000-60000

当然多个端口也可以是不连续的,比如80、443、8080同端口转发,端口用逗号”,”隔开,–to-destination后面的ip不用再指定端口。

iptables -t nat -I PREROUTING -p tcp -m multiport --dport 80,443,8080 -j DNAT --to-destination 192.168.1.2

注意:–to-destination 参数后,使用”-“表示起始端口和结束端口之间的范围。

iptables增加、插入、删除规则

  • -A 在最后一条规则后新增规则

  • -I 默认将新规则插入到第一条

  • -F 不指定<链名>,默认清空整个表的规则

  • -D <链名> <规则编号> 删除指定编号的规则

在第n条规则后插入规则

iptables -I <chain><rule_number><new_rule>

比如要在nat表的POSTROUTING链的第三条规则后增加一条规则。

iptables -t nat -I POSTROUTING 3<new_rule>

删除指定表中某个链的全部规则

iptables -t 表名 -F 链名

其中,表名可以是filter、nat、mangle、raw等,链名可以是INPUT、OUTPUT、FORWARD等。

例如,要清空filter表中INPUT链的所有规则,可以使用以下命令:

iptables -t filter -F INPUT

注意这个操作是不可逆的,清空后所有的规则都将被删除。

让iptables规则永久生效

默认iptables的规则在重启后会失效,所以需要将规则持久化。

使用 iptables-persistent

iptables-persistent 是一个 Debian/Ubuntu 系统上的工具,可以在重新启动后自动加载 iptables 规则。使用以下命令安装:

apt-get install -y iptables-persistent

在安装过程中,会被要求保存当前的 iptables 规则。安装完毕后,可以使用以下命令来保存新的 iptables 规则。

service netfilter-persistent save

使用iptables-save 保存规则

iptables-save > /etc/iptables.rules

将 iptables 规则保存到 /etc/iptables.rules 文件中,可以使用以下命令来加载。

iptables-restore < /etc/iptables.rules

为了在系统启动时自动加载 iptables 规则,可以将上述命令添加到 /etc/rc.local 文件中。该文件中的命令将在每次系统启动时自动执行。

iptables 拒绝入方向流量

拒绝ip段访问本机端口段的请求

例如将源IP为47.100.0.0/16的TCP流量目的端口为40000-60000的数据包丢弃,命令如下:

iptables -A INPUT -s 47.100.0.0/16 -p tcp --dport 40000:60000 -j DROP

拒绝指定ip的所有请求

例如拒绝 47.100.0.1 的所有请求,命令如下:

iptables -A INPUT -s 47.100.0.1 -j DROP

限制只有指定IP段能访问

白名单:先允许,再拒绝。

例如只允许192.168.0.0/16的ip段访问本机,其他ip的请求都拒绝,命令如下:

iptables -I INPUT -s 192.168.0.0/16 -j ACCEPT

iptables -I INPUT -s 0.0.0.0/0 -j DROP

iptables 拒绝出方向流量

拒绝出方向的域名请求

一般 iptables 自带的都有 string 模块,这个模块的作用就是匹配字符串,匹配到泛域名的 URL,然后就把数据包丢弃,就实现了屏蔽泛域名的功能。

例如要限制访问 youtube.com,命令如下:

iptables -A OUTPUT -m string --string "youtube.com" --algo bm --to 65535 -j DROP

对命令的参数进行解释。

-m string

# 指定模块;

--string "youtube.com"

# 指定要匹配的字符串(域名、关键词等);

--algo bm

# 指定匹配字符串模式/算法(还有一种更复杂的算法:kmp);

--to 65535

# 指定端口,这里代表所有端口(1-65535);

-j DROP

# 指匹配到数据包后处理方式,这里是丢弃数据包。

图片

作者:Zgao,来源:https://zgao.top/

运维网工
分享网络运维、运维规划、运维开发、Python运维、Linux运维、devops工具链、k8s容器化技术、自动化监控、日志收集等知识,推广围绕DevOps理念的自动化运维、高效运维、智能运维等优秀实践,让运维工程师更加专注于自动化。
收录于合集 #iptables
 4
上一篇Iptables 介绍与使用
阅读 742
 
posted @ 2023-03-15 19:53  往事已成昨天  阅读(424)  评论(0编辑  收藏  举报