前言

iptables作为Linux内核级别的防火墙,可以说在功能和实用性上还是非常强大的,但是在操作时上小白上手还是有少许难度的,如果只是简单的端口开放、关闭,更推荐你使用UFW指令。今天这篇文章带你浅用一下iptables(因为我也只会平时需要用到的iptables指令, 所以这篇文章可能不是很严谨 ),让你了解下iptables下的端口关放行、端口转发、流量监控,下面开始吧!

前置知识

你需要知道Linux命令行的基本操作、服务器搭建服务的端口访问方式(ip:port,你之所以大部分时候看不到端口因为大部分服务都有默认端口,那些默认端口都被隐藏了)以及一些简单的计算机网络知识

iptables 中的 INPUT 表示进入本机的数据包,OUTPUT 表示从本机发出的数据包。也就是说,当有数据包进入本机时,会先通过 INPUT 链的规则进行过滤,而当本机向外发送数据包时,会先经过 OUTPUT 链的规则进行过滤。

iptables指令参数

-A:指定链名
-p:指定协议类型(一般为udp或者tcp)
-d:指定目标地址
--dport:指定目标端口(destination port 目的端口)
--sport:指定源端口(source port 源端口)
-j:指定动作类型(ACCEPT、DROP、DENY)
-s:指定ip地址

端口放行问题

大部分国外服务器应该是默认放行所有端口的。
所以我们有两个选择,一个是白名单模式,一个是黑名单模式,所以就根据你自己的想法去选择了。

查看端口放行模式

iptables -L

默认放行情况
可以看到policy后面跟的是DROP那么就是丢弃所有端口就是不放行,如果是ACCEPT就是默认放行所有

黑名单模式

确保你的服务器已默认放行所有端口,否则执行下面的命令

# 如果你的iptables已经默认放行所有端口,请跳过下面的三个指令
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

然后仅将指定的端口丢弃也就是不放行。

iptables -A OUTPUT -p tcp --sport 8001 -j DROP # 一般使用这条指令就可以禁止此端口访问了
iptables -A INPUT -p tcp --dport 8001 -j DROP

白名单模式

下面的操作是非常危险的行为,将关闭所有未放行的端口访问。
确保你放行了ssh(22)端口,否则执行下面指令时,以免无法进行ssh

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT # 一般使用这条指令就可以了
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 如果不放心也可以执行下这条命令
# 如果你的iptables已经默认阻止新端口放行,请跳过下面的三个指令
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

查看端口放行情况

iptables -nL --line-number
可以看到有3个链表规则,分别是 INPUT、FORWARD、OUTPUT

删除规则

假设要删除OUTPUT表中的第一个规则

假设要删除OUTPUT表中的第一个规则

iptables -D OUTPUT 1

如果要删除其他规则,可以看到我们只需要修改这个指令中的两个地方

  1. 链表名,也就是这三个 INPUT、FORWARD、OUTPUT
  2. 需要删除规则的序号 1

修改规则

修改规则

假设要修改OUTPUT表中的第一个 规则从 DROP 变为 ACCEPT

iptables -R OUTPUT 1 -p tcp --sport 8001 -j ACCEPT

可以看到只需要将前面的执行的过的指令中加上 -R OUTPUT 1 -R的意思就是修改了
执行这段指令后target将变成ACCEPT
注意:如果只执行 iptables -R OUTPUT 1 -j ACCEPT 会怎么样呢

这样是不行的

可以看到变成所有端口放行了,所以在修改规则的时候我们要将参数写全才行

端口转发

顾名思义就是将一个端口转发到另一个端口访问,在nat鸡或者natv4+ipv6的鸡上使用比较多,假设我们开放了一个443端口,可以用[ipv6]:443去访问,但是nat鸡的ipv4并不能用这个端口去访问,nat鸡一般只会给你1w+(例如17010)以上端口,我们只需要将443转发到1w+的端口上就行了
指令:

iptables -t nat -A PREROUTING -p tcp --dport 17010 -j REDIRECT --to-ports 443

使用这条指令即可用ipv4:17010就可以访问443端口的服务了

规则查看与删除

#查看规则
iptables -t nat -L --line-number

#查看相应端口对应的规则
iptables -t nat -L --line-number | grep 17010

#删除规则(其中1为对应的num)
iptables -t nat -D PREROUTING 1

流量监控

一般分为输入输出流量(服务器的下载和上传)

假设我们需要监控8080端口使用的流量,我们需要现在iptables中添加规则

#输入流量 / 下载
iptables -A INPUT -p tcp --dport 8080 
#输出流量 /  上传
iptables -A OUTPUT -p tcp --sport 8080

再使用指令

iptables -L -v -n | grep 8080

就可以看到相应端口使用的流量了

移除端口

#移除输入端口
iptables -D INPUT -p tcp --dport 8080

#移除输出端口
iptables -D OUTPUT -p tcp --sport 8080

防止开机重置

service iptables save

最后

如果你认真看完,相信你大致掌握了iptables的基本使用,当然iptables不光是这些指令和用法,更深层次的使用需要靠你自己了,或许在我今后的学习会再次完善这篇文章,也欢迎你继续回访或者收藏本页!
PS: 不过iptables还有蛋疼的一点,就是只能管理ipv4的端口 如果需要管理ipv6的端口情况,你需要将指令中的iptables改为ip6tables