iptables是Linux中功能最为强大的防火墙软件之一,使用灵活,可以对流入和流出服务器的数据包进行很精细的控制。
在 iptables 中,规则是按照从上到下的顺序匹配的,一旦匹配到某条规则,后续的规则将不再检查。
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
# 说明
[-t 表名]为可选参数,-t用来指定具体操作那张表,不指定的话默认是Filter表
命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则,常用的命令选项如下:
-A:在规则列表的最后增加1条规则 #简写(一个横杠)和全称(两个横杠),敲对了使用那个都可以,推荐使用简写不容易犯错
-D:从规则列表中删除1条规则
-F:删除表中所有规则
-I {number}:在指定的位置插入1条规则, 默认是开头
-L:查看iptables规则列表
-P:定义默认策略
-R:替换规则列表中的某条规则
-X:删除自定义链
-Z:将表中数据包计数器和流量计数器归零
匹配条件用来实现更为精细和具体的条件,如网络接口名称,协议名称,源目的端口号等,高频匹配条件如下:
-i:网卡名称 匹配从这块网卡流入的数据
-m:匹配的模块 #指定数据包规则所使用的过滤模块
-o:网络接口名称 #指定数据包从哪个网络接口输出
-p:协议名称 #指定数据包匹配的协议,如TCP、UDP和ICMP等
-s:源地址或子网地址 #指定数据包匹配的源地址,加叹号"!"表示除这个IP外。
-d 匹配目标地址
-state:数据包当前状态 #指定ESTABLISHED,RELATED等
-sport:源端口号 #指定数据包匹配的源端口号
-dport:目的端口号 #指定数据包匹配的目的端口号iptables规则的动作
对于符合过滤规则或条件的数据包,需要进行相应的操作,如下:
-ACCEPT:接受数据包
-DNAT:目标地址转换,即改变数据包的目的地址。例如:将的广域网IP(222.101.98.54/24) ==> 局域网的IP(.1/24),且在NAT表的PREROUTING链上进行该动作
-DROP:丢弃数据包
-LOG:日志功能,将符合规则的数据包的相关信息记录在日志中,便于分析和排错
-MASQUERADE:IP伪装,改写数据包来源IP为防火墙的IP及端口,和SNAT不同的是,当进行IP伪装时,不需指定要伪装成哪个IP,IP会从网卡直接读取
-EDIRECT:与DROP基本一样,区别在于它除了阻塞包之外,还向发送者返回错误信息
-SNAT:源地址转换,即改变数据包的源地址
sudo iptables -L
# iptables -L 默认会尝试将 IP 地址解析为主机名,并将端口号解析为服务名称。
# 如果系统配置了 DNS 服务器,但 DNS 查询较慢或无法访问,会导致命令输出卡顿。
# 可以通过添加 -n 选项来禁用 DNS 解析,直接显示 IP 地址和端口号,从而加快输出速度。
sudo iptables -L -n
允许外部访问指定端口(3306)
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
需要注意的是,使用iptables时,规则添加的顺序至关重要。
# 只允许指定ip(192.168.1.123、192.168.1.124)访问指定端口(50079)
# 第一步:在tcp协议中,禁止所有的ip访问本机的50070端口。
iptables -A INPUT -p tcp --dport 50070 -j DROP
# 第二步:允许192.168.1.123访问本机的50070端口
iptables -A INPUT -s 192.168.1.123 -p tcp --dport 50070 -j ACCEPT
# 第三步:允许192.168.1.124访问本机的50070端口
iptables -A INPUT -s 192.168.1.124 -p tcp --dport 50070 -j ACCEPT
# 注意以上3条命令的顺序不能错。
通常服务器不允许其他主机ping自己,实现方法如下:
sudo iptables -A INPUT -p icmp -j DROP
可使用iptables封杀指定IP,关键操作如下:
sudo iptables -A INPUT -s 192.168.1.4 -j DROP #DROP掉来自192.168.1.4的所有数据包
要添加IP段到封停列表中,使用下面的命令:
sudo iptables -A INPUT -s 192.168.1.0/24 -j DROP #DROP掉所有来自192.168.1.0网段的数据包
sudo iptables -A INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的数据包
sudo iptables -A INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的数据包
sudo iptables -A INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的数据包
可使用iptables封杀指定IP端口,关键操作如下:
sudo iptables -A INPUT -p tcp --dport 1234 -j DROP #封杀1234端口
如果要放行某些IP的1234端口,可以进行如下操作:
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 1234 -j ACCEPT #放行源地址来自192.168.1.0网段1234端口的所有数据包
服务器大多需要SSH服务,iptables需要开启SSH端口,具体操作如下:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
服务器大多需要访问Web服务的,可用如下规则打开Web服务访问:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
对于电子邮件的发送和接收比较麻烦,这里采用默认和安全两种方式,关键操作如下:
SMTP
sudo iptables -A INPUT -i ens33 -p tcp --dport 25 -j ACCEPT
sudo iptables -A INPUT -i ens33 -p tcp --dport 465 -j ACCEPT
POP3
sudo iptables -A INPUT -i ens33 -p tcp --dport 110 -j ACCEPT
sudo iptables -A INPUT -i ens33 -p tcp --dport 995 -j ACCEPT
IMAP
sudo iptables -A INPUT -i ens33 -p tcp --dport 143 -j ACCEPT
sudo iptables -A INPUT -i ens33 -p tcp --dport 993 -j ACCEPT
如果是上述之外的服务,如MySQL或Postgre等,请用相应端口替换即可。
需要的端口和协议都开启了,最后就需要iptables绝对拒绝上面规则之外的数据包内容,参考操作如下:
sudo iptables -A INPUT -j REJECT
sudo iptables -A FORWARD -j REJECT
sudo iptables -A OUTPUT -j REJECT
# 展示带编号的所有iptables规则
sudo iptables -L -n --line-number
# 对指定编号规则进行删除
sudo iptables -D INPUT {num}
# 比如要删除INPUT里序号为8的规则,执行:
sudo iptables -D INPUT 8
或直接
iptables -D INPUT -s ***.***.***.*** -j DROP
你可以使用iptables-persistent
软件包来实现iptables规则在开机时自动加载。
以下是设置iptables自定义规则开机自动加载的步骤:
iptables-persistent
软件包: sudo apt update
sudo apt install iptables-persistent
/etc/iptables/rules.v4
和/etc/iptables/rules.v6
是IPv4和IPv6的规则文件,你可以根据需要选择其一或两者都配置。例如,使用以下命令备份iptables规则到IPv4规则文件: sudo su
iptables-save >/etc/iptables/rules.v4
启用iptables规则的自动加载:
sudo systemctl enable netfilter-persistent
重启系统以验证规则是否成功自动加载:
sudo reboot
在系统重新启动后,iptables规则应该会自动加载。可以使用以下命令来检查规则是否加载成功:
sudo iptables -L
sudo ip6tables -L
注意:在使用iptables-persistent
时,避免直接使用iptables
和ip6tables
命令来修改规则,以免在下次系统启动时丢失自定义规则。可以通过编辑规则文件/etc/iptables/rules.v4
和/etc/iptables/rules.v6
来进行规则的修改。
你可以使用iptables
服务来实现iptables规则在开机时自动加载。
以下是设置iptables自定义规则开机自动加载的步骤:
配置iptables规则:
编辑/etc/sysconfig/iptables
文件,该文件保存了IPv4的iptables规则。
sudo vi /etc/sysconfig/iptables
在文件中添加自定义规则。例如,允许SSH连接的规则:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
保存并关闭文件。
启用iptables服务:
sudo systemctl enable iptables
重启系统以验证规则是否成功自动加载:
sudo reboot
在系统重新启动后,iptables规则应该会自动加载。可以使用以下命令来检查规则是否加载成功:
sudo iptables -L
如果你使用的是IPv6规则,可以编辑/etc/sysconfig/ip6tables
文件,并执行类似的步骤来配置和启用IPv6的iptables规则。
注意:在使用iptables
服务时,避免直接使用iptables
命令来修改规则,以免在下次系统启动时丢失自定义规则。建议通过编辑规则文件/etc/sysconfig/iptables
和/etc/sysconfig/ip6tables
来进行规则的修改。