目录
[11.7limit 限制流量](#11.7limit 限制流量)
[老用户可以访问 新用户不可以访问](#老用户可以访问 新用户不可以访问)
在使用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
curl 192.168.241.11/index.html
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