IPTABLES命令使用学习
iptables命令常用规则汇总
防火墙的种类:硬件,软件,云三种防火墙
几个名词
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中的四个表和五个链。四个表分别是:
-
filter表:用于过滤数据包,控制网络流量。
-
nat表:用于对数据包进行地址转换,实现网络地址转换(NAT)功能。
-
mangle表:用于修改数据包的头部信息,比如TTL、TOS等。
-
raw表:用于处理数据包的连接状态,对于未建立连接的数据包进行处理。
五个链分别是:
-
PREROUTING:数据包进入路由之前进行处理。
-
INPUT:数据包进入本机之前进行处理。
-
FORWARD:数据包转发到其他主机之前进行处理。
-
OUTPUT:数据包从本机发出之前进行处理。
-
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/