netfilter/iptables
netfilter
是Linux
内核中的一个框架,工作在网络层,用于处理ip
数据包,iptables
则是一个命令行工具,通过与netfilter
框架交互,实现对数据包的过滤和转发等操作
常见的UFW
防火墙、firewalld
防火墙都是基于iptables
的,它们提供了更简单的管理iptables
的rules
的命令
Tables 表
filter
过滤本机数据包
管理INPUT
、FORWARD
、OUTPUT
三个链
nat
网络地址转换
管理PREROUTING
、POSTROUTING
、OUTPUT
三个链
mangle
修改数据包的TOS
(``Type Of Service,服务类型)、
TTL(
Time To Live,生存周期)指以及为数据包设置
Mark标记,以实现
Qos(
Quality Of Service`,服务质量)调整以及策略路由等
管理PREROUTING
、POSTROUTING
、INPUT
、OUTPUT
、FORWARD
五个链
raw
决定数据包是否被状态跟踪机制处理
管理OUTPUT
、PREROUTING
两个链
Chain 链
- PREROUTING:预路由,所有数据包进入路由前由此链负责
- INPUT:进站,数据包目标是本机由此链负责
- OUTPUT:出站,数据包从本机发送由此链负责
- FORWORD:转发,数据包的目标地址是其它外部地址由此链负责
- POSTROUTING:后路由,所有数据包离开本机时由此链负责
Rules 规则
- ACCEPT:允许数据包通过
- DROP:直接丢弃数据包
- REJECT:拒绝数据包通过,必要时给数据发送端一个响应信息
- SNAT:源地址转换
- DNAT:目标地址转换
- REDIRECT:重定向
命令
命令 | 解释 |
---|---|
iptables --table filter --list oriptables -t filter -L oriptables -L | 查看当前规则,不指定表默认查看filter 表 |
iptables -L --line-number | 查看当前规则并显示行号 |
iptables -A <chain> <options> | 添加规则 |
iptables -I <chain> <rule_number> <options> | 插入规则 |
iptables -D <chain> <rule_number> | 删除规则 |
iptables -F | 清除规则 |
iptables-save > /etc/iptables/rules.v4 | 保存规则 |
iptables-restore < /etc/iptables/rules.v4 | 从文件中加载规则 |
echo 1 > /proc/sys/net/ipv4/ip_forward | 启动转发 |
加载iptables模块
modprobe iptable_filter
modprobe iptable_nat
modprobe iptable_mangle
modprobe iptable_raw ip_tables
设置每次开机自动加载vim /etc/modules
cat > /etc/modules-load.d/iptables.conf << EOF
iptable_filter
iptable_nat
iptable_mangle
iptable_raw
ip_tables
EOF
验证
lsmod | grep iptable_filter
lsmod | grep iptable_nat
lsmod | grep iptable_mangle
lsmod | grep ip_tables
指定源ip192.168.1.4
到本机的所有协议的数据包都拒绝
iptables --table filter --append INPUT --source 192.168.1.4 --jump REJECT
查看当前规则
iptables -L
指定源ip192.168.1.4
到本机的所有协议的数据包都直接丢弃
iptables --table filter --append INPUT --source 192.168.1.4 --jump DROP
查看当前规则并显示行号
iptables -L --line-number
删除INPUT链的第一个规则
iptables --table filter --delete INPUT 1
or
iptables -t filter -D INPUT 1
iptables开放端口
开放 SSH 端口(22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
开放 HTTP 端口(80)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
开放 HTTPS 端口(443)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
开放 MySQL 端口(3306)
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
端口转发/映射
将所有公网ip84.100.100.111的数据包都映射到私网ip172.27.225.55
iptables -t nat -A PREROUTING -d 84.100.100.111 -j DNAT --to-destination 172.27.225.55
将所有公网ip84.100.100.111:6443的数据包都映射到私网ip172.27.225.55:6443
iptables -t nat -A PREROUTING -p tcp -d 84.100.100.111 --dport 6443 -j DNAT --to 172.27.225.55:6443
查看规则
iptables -t nat -L
拒绝某个国家的ip
段
在https://www.ipdeny.com/ipblocks/右键复制链接,然后wget
下载文件
使用ipset
:apt install ipset
创建一个拒绝阿富汗ip
的网络号集合
ipset create afuhan hash:net
查看集合
ipset list afuhan
保存ipset
和iptables
规则
ipset save > /etc/rules.ipset
iptables-save > /etc/iptables/rules.v4
加载ipset
和iptables
规则
ipset restore < /etc/rules.ipset
iptables-restore < /etc/iptables/rules.v4
清除规则(flush
:清除所有规则,delete
:删除所有自定义链,zero
:将所有链的计数和流量统计清零)
iptables -F & iptables -X & iptables -Z