
iptables教程
如果一个数据包没有匹配到一个链中的任何一个规则,那么将对该数据包执行这个链的默认策略(default policy),默认策略可以是 ACCEPT 或 DROP。链中默认策略的存在使得我们在设计防火墙时可以有两种选择:设置默认策略 DROP 所有的数据包,然后添加规则接受(ACCEPT)来自可信 IP 地址的数据包,或访问我们的服务监听的端口的数据包,比如 bittorrent、FTP 服务器、W
1 iptables安装
1.1 iptables和iptables-service的关系
iptables 是基于内核的,和 iptables-services 没有关系,不用安装任何工具包就可以使用 iptable 命令添加的防火墙规则,
但是iptables添加的规则是临时的,基于内存的,在系统重启后会消失,所以需要 iptables.service 服务来对添加的规则进行保存,
这样在系统重启后重载对应的防火墙规则。
1.2 安装iptables和iptables-service
第一步:1、关闭防火墙
[root@localhost ~]# systemctl status firewalld
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
第二步:查看 iptables 是否安装,安装iptables-services
[root@localhost ~]# rpm -qa iptables
iptables-1.4.21-34.el7.x86_64 # 系统默认装有 iptables
[root@localhost ~]# yum install iptables # 有新版本会安装最新版本
[root@localhost ~]# rpm -qa iptables
iptables-1.4.21-35.el7.x86_64
[root@localhost ~]# yum install iptables-services # 安装 iptables-services
[root@localhost ~]# rpm -qa iptables-services
iptables-services-1.4.21-35.el7.x86_64
第三步:启动iptables
[root@localhost ~]# systemctl enable iptables.service # 设置 iptables 开机启动
[root@localhost ~]# systemctl start iptables # 开启 iptables
[root@localhost ~]# systemctl status iptables # 查看 iptables 状态
● iptables.service - IPv4 firewall with iptables
Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
Active: active (exited) since Fri 2023-10-06 13:05:53 CST; 2s ago
第四步:#防火墙相关模块 加载到内核中,写入到开机自启动.
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
sysctl -p
2 什么是iptables
iptables是Linux的防火墙管理工具而已,真正实现防火墙功能的是Netfilter,我们配置了iptables规则后Netfilter通过这些规则来进行防火墙过滤等操作
Netfilter模块:
它是主要的工作模块,位于内核中,在网络层的五个位置(也就是防火墙四表五链中的五链)注册了一些钩子函数,用来抓取数据包;把数据包的信息拿出来匹配各个各个链位置在对应表中的规则:匹配之后,进行相应的处理ACCEPT、DROP等等。
2.1 iptables的工作流程
- 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
- 如果匹配成功规则,即明确表示是拒绝(DROP)还是接收(ACCEPT),数据包就不再向下匹配新的规则。
- 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
- 防火墙的默认规则是所有规则都匹配完才会匹配的。
3 具体的四表五链
3.1 四表五链定义
四表:filter、nat、managle、raw,默认是filter表。表的处理优先级:raw>managle>nat>filter
四表 | filter | 过滤数据包 |
nat | 网络地址转换(端口映射、地址映射等。) | |
mangle | 用于对特定数据报的修改。 | |
raw | 优先级最高,设置raw时一般是为了不再让iptables做数据报的链接跟踪处理,提高性能。 |
五链 | PREROUTING | 数据包进入路由表之前,对数据包做路由选择前应用此链路中的规则,所有的数据包进来的时候都先由这个链处理 |
INPUT | 通过路由表后目的为本机,进来的数据报应用此规则链上的策略 | |
FORWARD | 通过路由表后,目标地址不为本机,做转发数据报时应用此规则链上的策略 | |
OUTPUT | 由本机产生的外出的数据包向外转发时,应用此规则链中的策略 | |
POSTROUTING | 数据报做路由选择后发送后到网卡接口之前应用此链中的规则,所有的数据包出来的时候都先由这个链处理 |
3.2 表与链之间的包含关系:
filter | INPUT、FORWARD、OUTPUT |
nat | PREROUTING(DNAT)、OUTPUT、POSTROUTING(SNAT) |
mangle | PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING |
raw | PREROUTING、OUTPUT |
3.3 数据包在4张表和5条链的流向:
4. iptables规则介绍
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法
-t:说明,不指定的时候,默认就是filter表
添加删除替换规则:
-A:附加一条规则,添加在链的尾部
-I CHAIN [num]:插入一条规则,插入为对应CHAIN上的第num条,不指定默认为第一条
-D CHAIN [num]:删除指定链中的第num条规则
-R CHAIN [num]:替换指定的规则
例: iptables -A INPUT -p tcp --dport 22 -j ACCEPT #放行访问本机22端口(ssh)
------------------------------------------------------------------------------------------------------------------------
管理规则链:
-F [CHAIN]:flush,情况指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链
-P CHAIN:设定指定链的默认策略
-N:自定义一个新的空链
-X:删除一个自定义的空链
-Z:置零指定链中所有规则的计数器
-E:重命名自定义的链
例: iptables -t nat -F #清空NAT表中所有链上的规则
例: iptables -t nat -F PREROUTING #清空NAT表中PREROUTING链上的规则
例: iptables -P INPUT ACCEPT #指定filter表INPUT链默认策略是放行
例: iptables -t nat -X #删除NAT表中所有链上的规则
-N案例(一个抵御洪水攻击的方案):
1.在filter表中建一个名为tcp_packets的链:
iptables -N syn-flood
2.然后可以在自定义链中添加规则:
iptables -A syn-flood -m limit --limit 100/s --limit-burst 150 -j RETURN
iptables -A syn-flood -j DROP
3.然后再把它作为jump的目标,这样我们就会从INPUT链跳入syn-flood链:
#iptables -I INPUT -j syn-flood
------------------------------------------------------------------------------------------------------------------------
查看规则:
-L:显示指定表中的规则
-n:以数字格式显示主机地址和端口号
-v:显示链及规则的详细信息
-x:显示计数器的精确值
--line-numbers:显示规则号码
例: iptables -t nat -nL --line-numbers #查看NAT表中所有链上的规则,并显示规则序号
------------------------------------------------------------------------------------------------------------------------
通用匹配:
-s,--src :指定源地址
-d,--dst :指定目标地址
-p{tcp|udp|icmp} :指定协议
-i interface :指定数据报文流入的接口(eth0)
可用于定义标准的链:PREROUTING,INPUT,FORWARD
-o interface :指定数据报文流出的接口
可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD
例: iptables -t filter -A INPUT -s 192.168.1.1 -d 192.168.1.2 -p icmp -j DROP #禁止源地址为192.168.1.1 ping 目的地址192.168.1.2
------------------------------------------------------------------------------------------------------------------------
隐含扩展匹配:不用特别指明由哪个模块进行的扩展,因为此时使用{tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]: 源端口
--dport PORT[-PORT]: 目标端口
--tcp-flags mask comp: 只检查mask指定的标志位,是逗号分隔的标志位列表;comp:
此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;
--tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN
第一部分表示:我们需要匹配报文tcp头中的哪些标志位,这6个标志位分别为为”SYN、ACK、FIN、RST、URG、PSH”。
第二部分表示:第二部分为SYN,则表示,第一部分需要匹配的标志位列表中,SYN标志位的值必须为1,其他标志位必须为0
--syn
例: iptables -t filter -A INPUT -s 192.168.1.1 -d 192.168.1.2 -p tcp --dport 22 -j DROP #禁止源地址为192.168.1.1 ping 目的地址192.168.1.2
例: iptables -A INPUT -p tcp --dport 18:80 -j DROP #拒绝访问本机端口18到80之间的所有端口
-p icmp (ping)
--icmp-type
0: echo-reply ping应答
8: echo-request ping请求
例: iptables -A INPUT -p icmp --icmp-type 8 -s 192.168.239.0/24 -j DROP
例: iptables -A INPUT -p icmp --icmp-type any -s 192.168.239.0/24 -j DROP
-p udp
--sport
--dport
例: iptables -A INPUT -p udp --dport 45 -j DROP #不允许访问本机udp45端口
------------------------------------------------------------------------------------------------------------------------
显示扩展匹配:使用额外的匹配机制,必须指明由哪个模块进行的扩展,在iptables 中使用-m选型可完成此功能
-m state:状态扩展
结合ip_conntrack追踪会话状态
NEW:新连接请求
ESTABLISHED:已建立的链接
INVALID:非法链接
RELATED:相关联的 (ftp,需要加载模块)
例: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许连接状态为ESTABLISHED,RELATED的连接进入
例: iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ##允许连接状态为ESTABLISHED,RELATED的连接出去
-m multiport:离散的多端口匹配扩展
--source-ports
--destination-ports
--ports
-m multiport --destination-ports 21,22,80 -j ACCEPT
例: iptables -A INPUT -p tcp -m multiport --destination-ports 21,22,80 -j ACCEPT #允许访问本机21,22,80端口
-m iprange 指定范围
--src-range
--dst-range
例: iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-m connlimit 作用:用于限制每一个客户端ip的并发连接数
--connlimit-above n //超过n个并发连接数
! --connlimit-above n //未超过n个并发连接数
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT #同一IP超过100以上并发时,就拒绝连接
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit ! --connlimit-above 100 -j ACCEPT #同一IP未超过100以上并发时,就接受连接(和上面一个意思)
-m limit 限制并发及速率
--limit rate[/second|/minute|/hour|/day] 指定要隔多长时间才能签发一个新的通行证。
--limit-burst number the default is 5 指定刚开始时有多少通行证可用,不指定默认为5
--limit 5/minute --limit-burst 3 意思是开始时有3个通行证,用完之后,1分钟只生成5个令牌,即每12秒生成一个,
这期间没有剩余令牌的时候,到来的封包,无法匹配此条规则,就会继续往下匹配其他规则,如果有令牌了,则新到的封包就会匹配此条规则
例: iptables -A INPUT -d 192.168.2.102 -p tcp --dport 80 -m limit --limit 5/minute --limit-burst 3 -j ACCEPT
-m string
--string pattern:指定要匹配的字符串。
! --string pattern:反向匹配。
--algo:指定匹配的查询算法,有bm和kmp两种算法。
String模块的作用是来匹配请求报文中指定的字符串,经常应用于拦截用户访问某些网站的场景,将防火墙当做路由器使用,例如上班时间不允许用户访问淘宝网站等等场景
例: iptables -t filter -I OUTPUT -p tcp -m string --string "taobao.com" --algo bm -j DROP #拒绝数据包中包含taobao.com内容的数据包。
------------------------------------------------------------------------------------------------------------------------
动作(target):
-j
ACCEPT:放行
DROP:丢弃
REJECT:拒绝
DNAT:目标地址转换
SNAT:源地址转换
REDIRECT:端口重定向
MASQUERADE:地址伪装
LOG:日志 --log-prefix prefix
MARK:打标记
-j SNAT
--to-source ipaddr[-ipaddr][:port[-port]]
例: iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 172.16.100.1 #(共享上网方案)把数据包中源地址是192.168.2.0/24转变为172.16.100.1
-j DNAT
--to-destination [ipaddr][-ipaddr][:port[-port]]
例: iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.7:8080 #(端口映射)把数据包中目的地址是172.16.100.7:80转变为192.168.100.7:8080
-j MASQUERADE (外网地址动态获取时使用)
例: iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE #(共享上网方案)把数据包中源地址是192.168.2.0/24转变为MASQUERADE,效果和SNAT一样
------------------------------------------------------------------------------------------------------------------------
-P 设置默认策略
iptables [-t table] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
-P 选项用来定义默认策略(Policy)。注意,这是大写字母 P。ACCEPT 表示接受数据包,DROP 表示丢弃数据包。
一般情况下,我们会把 filter 表的 INPUT 链的默认策略制订的严格一些,比如设为 DROP。而 FORWARD 和 OUTPUT 可以宽松些,设为 ACCEPT。比如我们可以通过下面的命令把 filter 表的 INPUT 链的默认策略设置为 DROP:
例: iptables -P INPUT DROP
5.规则保存与恢复:
注意,我们通过 iptables 命令设置的规则都保存在内存中,也就是说系统重启的话所有的配置都会丢失。
我们可以通过 iptables-save 命令把 iptables 的配置保存到文件中:
$ sudo iptables-save > /etc/sysconfig/iptables
在需要时再通过 iptables-restore 命令把文件中的配置信息导入:
$sudo iptables-restore < /etc/sysconfig/iptables
6.生产环境中iptables的设置
#把三个表清空,把自建的规则清空。默认规则(iptables -F命令会把所有规则情况,但是不会修改默认规则,如果默认规则当前是DROP,执行iptables -F会导致立马无法连接机器,因为所有数据包都被拒绝了)
iptables -t filter -F
iptables -t filter -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t nat -F
iptables -t nat -X
#1.允许本机回环lo接口数据流量流出与流入
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#2.允许ssh连接
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#3.允许访问本机80,443端口
iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT
#4.修改INPUT链默认的规则为拒绝(如果要把默认策略设置为DROP的时候,一定要先放行远程登录等一系列权限后再设置为DROP,否则就会立马断开远程连接,也无法再次远程连接)
iptables -P INPUT DROP
#5.内存里规则保存到默认的规则文件里
iptables-save > /etc/sysconfig/iptables
7.iptables NAT实现共享上网和端口映射
7.1 NAT实现为内部服务器提供上网功能(共享上网)
iptables -t nat -A POSTROUTING -s 172.16.1.7 -j SNAT --to-source 10.0.0.61
1. 指定nat表,配置POSTROUTING链
2. 源ip是172.16.1.7这台主机进行共享上网,如果是多台(-s 172.16.1.0/24)
3. 指定使用SNAT功能,源地址转换.
4. 通过SNAT功能把数据包中的源ip地址改为防火墙公网的ip地址.(10.0.0.61)
5.如果公网ip不固定, -j SNAT --to-source 10.0.0.61 可以写为 -j MASQUERADE 伪装成公网ip.
环境介绍: 172.16.1.7 想要上网的机器,有2个网卡,eth0为外围,eth1为内网 172.16.1.61 实现NAT功能的防火墙机器,eth0为外围,eth1为内网 |
172.16.1.7 操作步骤 1.把机器上能上网的网卡关闭 sed -i 's/ONBOOT=yes/ONBOOT=no/' /etc/sysconfig/network-scripts/ifcfg-eth0 2.把不能上网的这张网卡配一个网关地址,地址为实现NAT的防火墙机器IP vim eth1 GATEWAY=172.16.1.61 3.重启network systemctl restart network |
172.16.1.61操作步骤 1.由于是要把数据从eth1网卡转发到eth1,所以要开启ip_forward功能(内核转发功能) echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf sysctl -p 2.防火墙转发规则配置 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE |
测试: 172.16.1.7 上ping 8.8.8.8看能不能通 |
7.2 NAT实现外部访问本机端口请求转发到内部其他机器特定的端口(端口映射)
iptables -t nat -A PREROUTING -p tcp --dport 6666 -j DNAT --to-destination 172.16.1.7:80
只要访问本机的6666端口,就会把请求转发到 172.16.1.7:80端口
更多推荐
所有评论(0)