Linux系统安全——iptables相关总结
目录
1.查看iptables规则
2.删除规则
3.插入规则
4.黑白名单
5.添加回环网卡
6.清空规则
7.基本匹配条件
8.扩展匹配条件
9.tcp
10.icmp
11.显式扩展
11.1multiport扩展
11.2iprange扩展
11.3mac
11.4string扩展
11.5time
11.6连接最大数
11.7limit 限制流量
11.8state状态
11.8.1实现功能
老用户可以访问 新用户不可以访问
延伸
11.9target
12.规则保存
12.1开机自动加载
12.2测试
12.3备份工具
13.自定义链
14.永久开启路由转发功能
15.SNAT
16.DNAT
在使用iptables时注意要先关闭firewalld(systemctl stop firewalld.service)
1.查看iptables规则
iptables -vnL
选项 | 含义 |
---|---|
-v | 查看时显示更多详细信息 |
-n | 所有字段以数字形式显示 |
-L | 查看规则列表 |
例,拒绝来自192.168.241.22的源地址 直接丢弃
iptables -t filter -A INPUT -s 192.168.241.22 -j DROP
其中-t filter是指filter表,常用的还可以替换为-t nat表
-A | |||||
-D | 链 | 编号 | 规则 | -j | target |
-I | 链 | 规则 | |||
-R | 链 | 编号 | 规则 |
target:
选项 | 含义 |
---|---|
DROP | 已读不回 |
REJECT | 回不合适 |
ACCEPT | 允许 |
LOG | 生成日志 |
SNAT | 使用snat;source 修改源ip |
DNAT | 使用dnat; 修改目的ip |
例,拒绝来自192.168.241.22的源地址 不回复 241网段的主机都无法访问
iptables -A INPUT -s 192.168.241.0/24 -j REJECT
tcpdump -i ens33 icmp -nn 在22主机上抓包只能看到去的包,看不到回的包
注意:配错策略无法远程登录服务器
登录本地 查看规则编号
iptables -vnL --line-numbers
2.删除规则
iptables -D INPUT 2
删除第二条规则
3.插入规则
iptables -I INPUT 编号 -s 192.168.241.22 -j DROP
iptables -I INPUT -s 192.168.241.1 -j ACCEPT 允许本地
iptables -A INPUT -s 192.168.241.0/24 -j REJECT 拒绝所有241网段的主机
4.黑白名单
修改默认规则为白名单后自己也无法访问
iptables -P INPUT DROP
访问127.0.0.1也不行
5.添加回环网卡
iptables -I INPUT 2 -i lo -j ACCEPT
6.清空规则
iptables -F 不包括默认规则 清空全部规则
iptables -P INPUT DROP 修改INPUT链的默认规则为拒绝,清空规则后又无法登录(因为此时的INPUT链的默认规则是拒绝)
手动白名单
iptables -A INPUT -s 192.168.241.1 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -j REJECT 最后再添加拒绝所有,比较安全,也不会影响自己本机登录
7.基本匹配条件
-s, --source address[/mask][,...]:源IP地址或者不连续的IP地址
-d, --destination address[/mask][,...]:目标IP地址或者不连续的IP地址
-p, --protocol protocol:指定协议,可使用数字如0(all)protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp,mh or“all“
iptables -I INPUT 2 -p icmp -s 192.168.91.241 -j REJECT 禁止icmp协议,ssh协议可以继续使用
-i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
-o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
8.扩展匹配条件
rpm -ql iptables |grep time
man iptables 看不到扩展
man iptables-extensions 扩展模块
隐式扩展 -p tcp 指定了特殊的协议无需再次使用-m 选项
显示扩展 必须加 -m 选项
9.tcp
iptables -I INPUT 3 -s 192.168.241.22 -p tcp --dport 80 -j REJECT 指定端口号
iptables -I INPUT 3 -s 192.168.241.22 -p tcp --dport 80:82 -j REJECT 连续的端口号
tcp的标记位:
--tcp-flags
--syn:用于匹配第一次握手,相当于:--tcp-flags SYN、ACK、FIN、RST、SYN
10.icmp
A可以ping B B不可以ping A
iptables -A INPUT -s 192.168.241.22 -j REJECT 双方都不可以ping
iptables -A INPUT -s 192.168.241.22 -p icmp --icmp-type 8 -j REJECT 拒绝请求包
iptables -A INPUT -s 192.168.241.22 -p icmp --icmp-type 0 -j REJECT 拒绝回复包
拒绝请求包要好用
11.显式扩展
11.1multiport扩展
混合端口,以离散的方式定义多个端口
yum install epel-release.noarch -y 安装额外源
systemctl start redis 开启redis
ss -natp | grep 6379
vim /etc/redis.conf
在第61行 bind 0.0.0.0 修改绑定地址
redis-cli -h 192.168.241.11 主机二登录
拒绝源地址为192.168.241.22访问本机80和6379端口
iptables -A INPUT -s 192.168.241.22 -p tcp -m multiport --dports 80,6379 -j REJECT
11.2iprange扩展
ip地址范围,之前只能指定网段
iptables -A INPUT -m iprange --src-range 192.168.241.22-192.168.241.24 -j REJECT
指定源地址为192.168.241.22-192.168.241.24 三个地址无法访问当前主机
11.3mac
根据mac地址
iptables -A INPUT -m mac --mac-source 00:0c:29:51:4b:b5 -j REJECT
只有源mac没有目标mac
11.4string扩展
根据字符串过滤
vim /var/www/html/index.html www.google.com
vim /var/www/html/index.html www.baidu.com
www.google.com
curl 192.168.241.11/index.html
www.baidu.com
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "google" -j REJECT
11.5time
时间是UTC时间 世界协商时间
date -u
man iptables-extensions
iptables -A INPUT -m time --timestart 16:00 --timestop 18:00 -j REJECT
11.6连接最大数
gcc flood connect.c -o flood
./flood 192.168.241.11
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
11.7limit 限制流量
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
每分钟允许10个 前5个不限制
iptables -A INPUT -p icmp -j REJECT
11.8state状态
- NEW:无论是我发出的第一个包还是收到的第一个包 都叫NEW
- ESTABLISHED:NEW 之后都叫ESTABLISHED,除了第一个
- RELATED:ftp 权限端口会自动打开数据端口
- NVALID:无效的连接,如flag标记不正确
- UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
- cat /proc/net/nf_conntrack 默认连接跟踪功能需要开启 state功能
11.8.1实现功能
老用户可以访问 新用户不可以访问
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
已在ping的可以继续ping,ping停止的话不可以再ping,xshell也不可以连
iptables -A INPUT -m state --state NEW -j REJECT 新用户拒绝
lsmod | grep comn 内核模块可以看到,调用state状态时可以看到
cat /proc/sys/net/netfilter/nf_conntrack_max 记录的用户数为65536
echo 1 > /proc/sys/net/netfilter/nf_conntrack_max 修改最大记录数
tail /var/log/messages 查看日志
iptables -A INPUT -m state --state ESTABLISHED ACCEPT
iptables -A INPUT -m state --state NEW -j REJECT
延伸
报错Feb 5 09:41:49 localhost kernel: nf_conntrack: table full, dropping packet
A不能访问我,我可以访问A 单向通讯
iptables -A INPUT -s 192.168.91.101 -j REJECT 不行都不可以了
iptables -A INPUT -s 192.168.91.101 -m state --state NEW -j REJECT 第一个包是请求包只要禁止请求包即可
11.9target
log
iptables -I INPUT -s 192.168.91.101 -p tcp -m multiport --dports 80,21:23 -m state --state NEW -j LOG --log-prefix "hello:"
12.规则保存
iptables-save 此条命令会将所有规则打印在屏幕上
iptables-restore 支持标准输入
iptables-save > /data/iprule
iptables-restore < /data/iprule
iptables -A INPUT -s 192.168.241.1 -j ACCEPT
iptables -A INPUT -s 192.168.241.0/24 -j ACCEPT
iptables -A INPUT -j REJECT
将这三条规则加入到规则表中
iptables-save > /data/iprule 备份
iptables-restore < /data/iprule 导入
12.1开机自动加载
vim ~/.bashrc
vim /etc/rc.d/rc.local
iptables-restore < /data/iprule
chmod +x /etc/rc.d/rc.local
12.2测试
iptables -F
/etc/rc.d/rc.local
iptables -vnL
12.3备份工具
yum install iptables-services.x86_64 -y
rpm -ql iptables-service
/etc/sysconfig/iptables 存放系统自带的规则
systemctl start iptables-services
systemctl enable iptables-services
13.自定义链
将规则分类 web链 db链 java链
iptables -N web 自定义链
iptables -vnL 可以看到自己定义的链
iptables -E web WEB 修改名称
iptables -A INPUT -s 192.168.241.0/24 -j WEB
input链调用将自定义链和INPUT链修改也可以保存
删除自定义链
iptables -F INPUT
iptables -F WEB 删除
iptables -X WEB 清空自定义链的规则
curl http://ip.sh 查看本机主机访问公网时使用的ip
14.永久开启路由转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 将此写入配置文件
15.SNAT
iptables -t nat -A POSTROUTING -s 192.168.241.0/24 -o ens36 -j SNAT --to 12.0.0.1
将源地址为192.168.241.0网段的私网地址全部转化为网关地址
iptables -t nat -A POSTROUTING -s 192.168.241.0/24 -o ens36 -j MASQUERADE
如果地址不固定可以设置
16.DNAT
iptables -t nat -A PREROUTING -i ens36 -d 12.0.0.10 -p tcp --dport 80 -j DNAT --to 192.168.241.22
iptables -t nat -A POSTROUTING -o ens36 -s 192.168.241.0/24 -j SNAT --to 12.0.0.254
有去有回踩可以ping通 所以要加SNAT
iptables -t nat -A PREROUTING -i ens36 -d 12.0.0.254 -p tcp --dport 80 -j DNAT --to 192.168.241.11:8080