一、参考
The Beginner’s Guide to iptables, the Linux Firewall
Iptables Tutorial – Securing Ubuntu VPS with Linux Firewall
Per-IP rate limiting with iptables
Limit outgoing bandwidth on an specific interface
二、iptables介绍
简单说来,iptables
就是一个Linux系统的防火墙应用,它使用table
监控服务器发出或者接收的流量,这些表包含规则链chain
,规则链中包含有多条规则rule set
, 利用这些规则过滤发出或者接收的数据包
当检测到某个数据包满足规则时候,这个数据包被指定给一个目标target
,目标可以有下列选项:
(1) accept
-- 允许数据包通过
(2) drop
-- 不让数据包通过
(3) return
-- 阻止数据包穿过这个规则链,告知其返回到前一个规则链
(4) 规则链名称,即该数据包转到另外一个规则链
常用的三条规则链:
(1) input
-- 过滤服务器接收的数据包
(2) forward
-- 过滤通过服务器转发的数据包
(3) output
-- 过滤服务器发出的数据包
2.1 安装
sudo apt-get install iptables
sudo yum install iptables
可以通过命令 sudo iptables -L -v
查看当前iptables
配置状态, 其中 -L
表示列出(list
)所有的规则, -v
表示详细展示信息
由上可得,现在所有的规则链都是accept
,并且现在还没有规则,这样是不安全的,因为任何数据包都可以通过服务器。
2.2 定义规则
如果需要添加规则,需要在iptables
命令后面紧跟参数-A
添加一条规则,还可以指定下面的参数
(1) -i
, 表示interface
网卡,要过滤经过哪个网卡的数据包,例如: eno1, eth0等等;
(2) -p
, 表示protocol
协议,过滤哪些协议产生的ip数据包(主要是传输层协议, 例如: tcp
, udp
, icmp
等等,可以使用all
表示所有的协议)
(3) -s
, 表示source
,数据包中的源地址,可以使用主机名或者IP
地址
(4) -sport
, 表示source port
, 数据包中的源端口号
(5) -d
, 表示destination
, 数据包中的目标地址
(6) -dport
, 表示destination port
, 数据包中的目标端口,例如: 22(ssh)
, 443(https)
等等
(7) -j
,表示jump
转发到其他target
, target
选项上面已经列出,主要是accept
, drop
, return
, 其他chain
, 需要注意,每一条规则必须要有-j
参数
下面是一条规则的格式sudo iptables -A
2.3 规则示例
2.3.1 允许所有本机上的数据包
sudo iptables -A INPUT -i lo -j ACCEPT
当本地通信时候,例如:访问本机的数据库或者web应用,需要通过网卡 lo, lookback
,设置所有经过lo
网卡的数据包accept
,即可以使得本地访问数据库或者web应用正常
2.3.2 开放特定端口
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
由上,开放了80, http
, 443, https
, 22, ssh
3个端口,即表示对应的三种服务可以正常运行
2.3.3 指定IP范围
sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
iptables -A INPUT -d 192.168.1.5,192.168.1.6 -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
IP范围有3种方式:
(1) 192.168.1.100-192.168.1.200,通过连字符指定IP范围
(2) 通过逗号指定多个IP地址
(3) 通过子网段(子网掩码)实现
2.3.4 拒绝其他数据包
sudo iptables -A INPUT -j DROP
通过上面规则和2.3.2中规则,可以实现只允许指定应用可以访问服务器
2.4 删除规则
2.4.2 删除所有规则
sudo iptables -F
由上,F
表示flush
删除所有规则
2.4.3 删除特定规则
首先,需要使用sudo iptables -L --line-numbers -v -n
查看各个规则链具体情况,例如上图,可以看到input
规则链有1条规则,output
规则链有2条规则
然后,使用sudo iptables -D INPUT 1
删除具体规则链(INPUT
)的具体规则(1
)
2.5 规则持久化
上面定义删除规则,都是在内存中实现,即如果重启机器,规则将不存在,可以使用/usr/sbin/iptables-save
将内存中现有规则保存到iptalbes
的配置文件中(/etc/sysconfig/iptables
)
通过规则持久化命令,可以禁用iptables
,只需要执行
sudo iptables -F
sudo /sbin/iptables-save