Iptables 防火墙
iptables 防火墙 安装
# systemctl disable firewalld.service \\ 关闭 firewalld开机启动
# systemctl stop firewalld.service \\ 停止 firewalld 服务 停止后iptables会被清空
# yum install iptables iptables-services \\ 安装 一般默认就有
# service iptables save \\ 保存规则 即使是空规则 会生成配置文件 /etc/sysconfig/iptables
# systemctl restart iptables
# systemctl enable iptables \\ 加入开机启动
# systemctl list-unit-files | grep iptables \\ 查看所有服务的状态
# iptables -L -n
# iptables-save > /iptables.1 \\ 备份 保存到文件
# iptables-restore < /iptables.1 \\ 导入 重新装载回来
# vim /etc/sysconfig/iptables \\ iptables 配置文件 可以直接使用
# Generated by iptables-save v1.4.7 on Tue Nov 19 09:59:12 2019
*nat
:PREROUTING ACCEPT [96:4544]
:POSTROUTING ACCEPT [6:312]
:OUTPUT ACCEPT [6:312]
COMMIT
# Completed on Tue Nov 19 09:59:12 2019
# Generated by iptables-save v1.4.7 on Tue Nov 19 09:59:12 2019
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [559823219:59422546554]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 65522 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 81 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80:81 -j ACCEPT
-A INPUT -s 47.91.219.64/32 -p tcp -m state --state NEW -m tcp --dport 10050 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Tue Nov 19 09:59:12 2019
常用 iptables 防火墙命令
# iptables -I INPUT 5 -p tcp -m state --state NEW --dport 443 -j ACCEPT
# iptables -I INPUT 5 -p tcp -m state --state NEW --dport 80,81,82 -j ACCEPT
# iptables -I INPUT 5 -p tcp -m state --state NEW -m multiport --dports 80,81,82 -j ACCEPT
# iptables -I INPUT 5 -p tcp -m state --state NEW -m multiport --dports 80:82 -j ACCEPT \\ 与下面一样 放行多个端口
# iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 80:82 -j ACCEPT
# iptables -I INPUT 5 -p tcp -s 47.91.219.64 -m state --state NEW --dport 80 -j ACCEPT
# iptables -I INPUT 5 -p tcp -s 47.91.219.0/24 -m state --state NEW --dport 80 -j REJECT
# iptables -I INPUT 5 -p tcp -s 47.91.219.64 -m state --state NEW --dport 80 -j DROP
# iptables -I IN_public_allow 5 -s 47.91.219.64 -p tcp --dport 80 -m conntrack --ctstate NEW,UNTRACKED -j DROP \\宝塔
# service iptables save \\ 保存规则
# vim /etc/sysconfig/iptables \\ 配置文件 直接修改即可
........................................................................................................................
iptables 端口转发 \\ 把本机所有的 7410 端口转发到 172.21.34.33 的22端口
❶. 单个端口转发 不同端口转发
# iptables -L -n
# iptables -I FORWARD -p tcp -m state --state NEW -m tcp --dport 7410 -j ACCEPT
# iptables -I FORWARD -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
# iptables -L -n -t nat
# iptables -I PREROUTING -d 172.21.34.204/32 -p tcp -m tcp --dport 7410 -j DNAT --to-destination 172.21.34.33:22
# iptables -I POSTROUTING -d 172.21.34.33/32 -p tcp -m tcp --dport 22 -j SNAT --to-source 172.21.34.204
❷. 端口段 转发 相同端口转发
# iptables -L -n
# iptables -I FORWARD -p tcp -m state --state NEW -m tcp --dport 900:1000 -j ACCEPT
# iptables -L -n -t nat
# iptables -I PREROUTING -p tcp -m tcp --dport 900:1000 -j DNAT --to-destination 172.21.34.204
# iptables -I POSTROUTING -d 172.21.34.204/32 -p tcp -m tcp --dport 900:1000 -j SNAT --to-source 192.168.10.13
❸. 单个端口转发 详解
# vim /etc/sysctl.conf \\ 开启内核转发
net.ipv4.ip_forward = 1
# sysctl -p
# iptables -L -n \\ FORWARD 转发链 只放行需要 转发的端口及ip 不用在INPUT链放行7410端口
Chain FORWARD (policy ACCEPT)
# iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT \\ 允许所有 已连接的状态
# iptables -A FORWARD -p tcp -m state --state NEW -m tcp --dport 7410 -j ACCEPT \\ 所有ip到 7410 放行
# iptables -A FORWARD -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT \\ 所有ip到 22 放行
# iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited \\ 拒绝所有 在最后添加
# iptables -L -n
# iptables -L -n -t nat \\ 查看 转发表 规则 未添加的时候为空
# iptables -A PREROUTING -d 172.21.34.204/32 -p tcp -m tcp --dport 7410 -j DNAT --to-destination 172.21.34.33:22
# iptables -A POSTROUTING -d 172.21.34.33/32 -p tcp -m tcp --dport 22 -j SNAT --to-source 172.21.34.204
# iptables -L -n -t nat \\ 查看 转发表 规则
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 172.21.34.204 tcp dpt:7410 to:172.21.34.33:22
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT tcp -- 0.0.0.0/0 172.21.34.33 tcp dpt:22 to:172.21.34.204
注:
prerouting 路由前 把所有目标ip为本机端口为7410的 做DNAT 进来的时候改变目标地址为 172.21.34.33:22
postrouting 路由后 回源的目标ip为34.33端口为22的 做SNAT 源地址转换 就是做 nat 为 172.21.34.204
# vim /etc/sysconfig/iptables \\ iptables 关于 端口转发的配置文件 可以直接使用
*nat
:PREROUTING ACCEPT [6987:545148]
:INPUT ACCEPT [2:58]
:OUTPUT ACCEPT [2:152]
:POSTROUTING ACCEPT [2:152]
-A PREROUTING -d 172.21.34.204/32 -p tcp -m tcp --dport 7410 -j DNAT --to-destination 172.21.34.33:22
-A POSTROUTING -d 172.21.34.33/32 -p tcp -m tcp --dport 22 -j SNAT --to-source 172.21.34.204
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [559823219:59422546554]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 172.21.34.0/24 -p tcp -m state --state NEW -m tcp -j ACCEP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Tue Nov 19 09:59:12 2019
.......................................................................................................................
iptables 内网转发 \\ iptables 作为路由 转发内网的流量 使得内网机器可以上网
内网机器设置
# route -n
# vi /etc/sysconfig/static-routes \\ 路由的配置文件 可永久添加路由 没有需要创建
any net 0.0.0.0/0 gw 192.168.116.129
# systemctl restart network
# route -n
# vim /etc/sysconfig/network-scripts/ifcfg-ens33 \\ 永久修改 DNS
DNS1=8.8.8.8
# route add default gw 192.168.116.129 \\ 临时添加 加个默认 ip 指向 转发服务器
# route -n
# vim /etc/resolv.conf \\ 临时修改 dns 重启网络 或重启服务器会变
nameserver 8.8.8.8
转发 机器 配置 \\ 有两块网卡 ens33 连接的是外网 ens37连接内网
# iptables -I FORWARD 2 -i ens37 -o ens33 -m state --state NEW -j ACCEPT \\ 放行 内网网卡 到 外网网卡
# iptables -t nat -I POSTROUTING -o ens33 -j MASQUERADE \\ 只要通过外网的网卡 都做 伪装
# vim /etc/sysconfig/iptables \\ 完整的防火墙配置文件 可直接使用
# Generated by iptables-save v1.4.21 on Wed Jun 23 05:00:41 2021
*nat
:PREROUTING ACCEPT [4:336]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ens33 -j MASQUERADE
COMMIT
# Completed on Wed Jun 23 05:00:41 2021
# Generated by iptables-save v1.4.21 on Wed Jun 23 05:00:41 2021
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [194:32248]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i ens37 -o ens33 -m state --state NEW -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Jun 23 05:00:41 2021
# systemctl restart iptables \\ 配置文件中只放行了 22 端口 需求其他端口自行添加
.......................................................................................................................
iptables 防火墙 基础
选择表
-t filter 可以是 filter nat mangle raw 省略为filter
链管理
-F: 清空
-X: 删除空自定义链
-P: 默认规则 ACCEPT DROP REJECT
-N: new 新建自定义链
-Z: zero 清零计数器
-E: rename 重命名计数为0的自定义链
查看
-L: 显示规则
-n: 不反解
-v: 详细信息 -vv -vvv
--line-numbers: 显示规则编号
-x: exactly 显示计数器结果的精确值
规则管理
-A: 添加规则到尾部
-I: 添加到某一条规则之上
-D: 删除某一条规则
-R: 替换指定链上的指定规则
匹配条件
-s: 源IP地址
-d: 目标IP地址
-i: 报文的流入接口
-o: 报文的流出接口
-p: 协议 tcp udp icmp
-p tcp --dport 源端口
-p tcp --sport 目标端口
-p icmp --icmp-type 8 用于别人ping他 请求回送
-p icmp --icmp-type 0 用于他ping别人 回显应答 回送应答
显示扩展匹配
1 multiport 扩展 以离散方式定义多端口匹配 最多指定15个端口
-m multiport --sports 22,80 指明多个源端口
-m multiport --dports 22:30 指明多个目标端口
-m multiport --ports 22,80 既可以指明源 也可以指明目标 很少用
2 iprange 扩展 指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用
-m iprange --src-range 192.168.10.1-192.168.10.120 指明连续的源地址范围
-m iprange --dst-range 192.168.10.1-192.168.10.120 指明连续的目标地址范围
3 string 扩展 检查报文中出现的字符串 kmp 可以 已测试 bm不行 待测试
--dport--dportm string --algo kmp --string 'movie' \\ 字符串匹配 kmp 为算法
4 time 扩展 匹配时间 date查看时间注意是 CST时间是东八区 设置的时间为UTC时间是0时区
-m time --timestart 14:00 -m time --timestop 16:00
-m time --datestart
-m time --datestop
-m time --monthdays 1-31
-m time --weekdays 1-7
5 connlimit 扩展 并发连接数限制 根据每客户端IP(也可以说地址块) 做并发连接数量匹配
-m connlimit --connlimit-above 3 \\ 大于 超过的连接数目 一般做拒绝 相对默认放行一般做拒绝
-m connlimit --connlimit-upto 3 \\ 小于等于此上限 一般做放行 相对默认拒绝一般做放行
6 limit 扩展 基于收发报文的速率做检查
-m limit --limit 10/minute \\ 设定速率是10个每分钟 还有 /hour /day /second
-m limit --limit-burst 3 \\ 设定一开始的峰值是3 不做限制
7 state 扩展 根据连接追踪机制检查连接的状态 ***
/proc/sys/net/nf_conntrack_max 调整连接追踪功能所能够容纳的最大连接数量
/proc/net/nf_conntrack 已经追踪到并记录下的连接
/proc/sys/net/netfilter/ 目录下有不同协议或连接类型追踪的时长
可追踪的连接状态
-m state --state NEW: 新发出的请求 连接追踪模板中不存此连接相关的信息条目 因此 将其识别为第一次发出的请求
-m state --state ESTABLISHED: new状态后 连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态
-m state --state RELATED: 相关的连接 如ftp协议的命令连接与数据连接之间的关系
-m state --state INVALIED: 无法识别的连接
# iptables -I INPUT -d 192.168.10.14 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -I OUTPUT -s 192.168.10.14 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
可以优化规则 简化
# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT \\ 是这种状态的都放行 后面可以加new 的规则做放行
# iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT \\ 是这种状态的都放
目标:
-j: 跳转至指定 处理目标
accept: 接受
drop: 丢弃
reject: 拒绝
return: 返回调用链
redirect: 端口重定向
log: 记录日志
mark: 做防火墙标记
dnat: 目标地址转换
snat: 源地址转换
masquerade: 地址伪装
...
自定义链: 由自定义链上的规则进行匹配检查
基本命令
# systemctl restart firewalld.service \\ 重启服务
# iptables -L -n -v --line-numbers \\ 显示
# iptables -F \\ 清空链
# iptables -X \\ 删除自定义规则
# iptables -D INPUT 9 \\ 删除 第9条规则
示例:
放行所有访问本机的 tcp协议
# iptables -A INPUT -d 192.168.10.11 -p tcp -j ACCEPT
# iptables -A OUTPUT -s 192.168.10.11 -p tcp -j ACCEPT
修改链的 默认值
# iptables -P INPUT DROP \\ 把 filter 表中3个链 默认状态都改为drop
打开 ping 协议
# iptables -A INPUT -d 192.168.10.11 -p icmp -j ACCEPT \\ 如果上面默认为丢弃 则不能ping通 可开通下两条 使之能ping通
# iptables -A OUTPUT -s 192.168.10.11 -p icmp -j ACCEPT
禁 ping
# iptables -A OUTPUT -s 192.168.10.11 -p icmp --icmp-type 8 -j ACCEPT
\\ 只允许类型为8请求会送 的出去 其他不能出去 只能ping别人 其他人ping不了自己
# iptables -A INPUT -d 192.168.10.11 -p icmp --icmp-type 0 -j ACCEPT\\ 只允许类型为0 请求应答 的进来 其他不允许 禁ping
限制报文流入流出 网卡
# IPTABLES -A INPUT -d 192.168.10.11 -i ens33 -j ACCEPT \\ 来着于ens33 网卡 访问本机的所有流量 都放行 -i 数据报文流入接口
# iptables -A OUTPUT -s 192.168.10.11 -o ens33 -j ACCEPT \\ -o 数据报文流出接口
放行22端口 ssh服务
# iptables -I INPUT -d 192.168.10.11 -p tcp --dport 22 -j ACCEPT \\ -I插入最前面 --dport 目标 --sport 源端口
# iptables -I OUTPUT 2 -s 192.168.10.11 -p tcp --sport 22 -j ACCEPT \\ 放行了22端口 -I OUTPUT 2 插入到第2条
同时放行22 23 和 80端口
# iptables -I INPUT -s 192.168.10.0/32 -d 192.168.10.14 -p tcp -m multiport --dports 22:23,80 -j ACCEPT \\ 同时打开多端口
# iptables -I OUTPUT -s 192.168.10.14 -d 192.168.10.0/32 -p tcp -m multiport --sports 22:23,80 -j ACCEPT
只放行某一IP段
# iptables -I INPUT -d 192.168.10.14 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 192.168.10.1-192.168.10.120 -j ACCEPT
# iptables -I OUTPUT -s 192.168.10.14 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 192.168.10.1-192.168.10.120 -j ACCEPT
根据字符串匹配
# iptables -I OUTPUT -m string --algo kmp --string 'movie' -j REJECT \\ 无论是谁访问的 基于哪种协议 只要有movie都做拒绝
根据时间匹配
# iptables -I INPUT -d 192.168.10.14 -p tcp --dport 80 -m time --timestart 14:00 --timestop 16:00 -j REJECT \\ 时间段拒绝
限制22端口并发连接数 单IP
# iptables -I INPUT -d 192.168.10.14 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
限制ping速率是10个每分钟
# iptables -A INPUT -d 192.168.10.14 -p icmp --icmp-type 8 -m limit --limit-burst 2 --limit 10/minute -j ACCEPT
禁止访问百度
# iptables -I OUTPUT -m string --string "baidu.com" --algo kmp -j DROP
# vim /etc/sysconfig/iptables \\ 防火墙默认配置文件
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
手动添加以上命令:
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m state --state NEW -p tcp --dport 65522 -j ACCEPT
# iptables -A INPUT -s 47.90.1.83 -m state --state NEW -p tcp --dport 10050 -j ACCEPT
# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
# iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited \\ 拒绝所有端口
# iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
保存及重载规则
iptables-save > /iptables.1 \\ 保存到文件
iptables-restore < /iptables.1 \\ 重新装载回来
CentOS 7:
引入了新的iptables前端管理服务工具 firewalld 是以iptables为基准生成规则的
对于本机的简单防火墙实现 建议使用iptables 首先先要禁用firewalld
# systemctl disable firewalld.service \\ 关闭 开机启动
# systemctl stop firewalld.service \\ 停止服务 停止后iptables会被清空
# yum install iptables iptables-services
# systemctl start iptables
# service iptables save \\ 保存规则 即使是空规则 会生成配置文件 /etc/sysconfig/iptables
# systemctl restart iptables
# systemctl status iptables \\ 查询状态
# systemctl enable iptables \\ 加入开机启动
# systemctl list-unit-files \\ 查看所有服务的状态
CentOS 6:
service iptables save \\ 保存
iptables-save > /etc/sysconfig/iptables \\ 相当于 保存
service iptables restart \\ 重新启动
iptables-restore < /etc/sysconfig/iptables \\ 相当于重载
# service iptables start
# service iptables save \\ 保存规则 即使是空规则 会生成配置文件 /etc/sysconfig/iptables
# chkconfig --list \\ 查看是否开机启动
# chkconfig --level 345 zabbix_agentd on \\ 添加开机启动
/etc/sysconfig/iptales \\ 配置文件
/etc/sysconfig/iptables-config \\ 加载模块 配置文件
/etc/init.d/iptables \\ 启动脚本
iptables 端口转发
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
echo 'net.ipv4.ip_forward = 1' >> / etc/sysctl.conf
-----------------------------------------------------------------------------------------------------------------
iptables 命令详解 为以上命令详解版本
-t: filter nat mangle raw 省略时 filter
链管理
-F: flush清空规则链 省略链 表示清空指定表上的所有的链
-N: new 创建新的自定义规则链
-X: drop 删除用户自定义的空的规则链 可先用-F清空在删除
-Z: zero 清零 置零规则计数器
-P: policy 为指定链设置默认策略 对filter表中的链而言 默认策略通常有 accept允许放行报文 drop丢弃报文 reject拒绝报文
-E: rename 重命名自定义链 引用计数不为0的自定义链 无法改名 也无法删除
规则管理
-A: append 将新规则追加于指定链的尾部
-I: insert 将新规则插入至指定链的指定位置 不指明插入第几条时 插入到第一条
-D: delete 删除指定链上的指定规则
有两种指定方式:
1 指定匹配条件
2 指定规则编号
-R: replace 替换指定链上的指定规则
查看:
-L: lsit 列出指定链上的所有规则 默认显示为filter表
-n: numberic 以数字格式显示地址和端口号 不反解
-vv -vvv v越多 显示信息越详细
--line-numbers: 显示规则编号
-x: exactly 显示计数器结果的精确值
规则示例1:
# iptables -L \\ 显示filter表上链的规则 虚拟中会显示出很多 自定义链 带有(0 references) 如果使用-F情况
# iptables -X \\ 默认清楚filter表上 自定义的规则
# iptables -L -n \\ 查看
# iptables -t nat -L \\ 显示 nat 表上链的规则
# iptables -t mangle -L
# iptables -t raw -L
# iptables -t filter -N IN_public \\ 在filter表上 创建 自定义规则
# iptables -L -n \\ 查看
# iptables -t filter -E IN_public OUT_public \\ 改名 自定义链
# systemctl restart firewalld.service \\ 重启防火墙服务 重启后 改动的规则就回来了
# iptables -L -n \\ 显示的时候详解
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) \\ 但凡不能被本地所指定的规则所匹配的 那么都匹配成默认规则
链 哪个链 默认策略为 accept 还可以是 drop reject
target prot opt source destination
处理目标 哪种协议(一般三种tcp,udp,icmp) 选项 源地址 来自哪个地址 目标地址0.0.0.0/0 表上所有地址
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
表示接受 所有协议 所有地址 所有地址 连接追踪状态
INPUT_DIRECT
把自定义链 当 target 由这个自定义链所检查去了
# iptables -L -n -v \\ 加入 -v选项 会多两个计数器 匹配到的
pkts bytes
报文个数 字节数
# iptables -P FORWARD DROP \\ 修改默认filter表中 FORWARD链中 默认规则为DROP 可以加入-t 现在修改哪张表 的哪条链
# iptables -L -n --line-numbers \\ 查看链规则上的编号
# iptables -D FORWARD 9 \\ 删除 FORWARD链上的 第9条规则
# iptables -L -n -v -x \\ -v 查看详细的信 -x 计数器不做单位换算
匹配条件:
基本匹配:
[!] -s --src --source IP|Netaddr: 检查报文中源IP地址是否符合此处指定的地址范围
[!] -d --dst --destination IP|Netaddr: 检查报文中源IP地址是否符合此处指定的地址范围
-p --protocol{tcp|udp|icmp}: 检查报文中的协议 即ip首部中的protocols所标识的协议
-i --in-interface IFACE: 数据报文的流入接口: 仅能用于prerouting input及forward链上
-o --out-interface IFACE: 数据报文的流出接口: 仅能用于forward output及postrouting链上
扩展匹配: -m macth_name --spec_options
例如: -m tcp --dport 22 \\ sport 源端口 dport 目标端口
隐式扩展: 对 -p protocol指明的协议进行的扩展 可省了-m 选项
-p tcp
--dport 目标端口匹配 可以是单个端口或连续多个端口
--sport 源端口匹配
--tcp-flage LIST1 LIST2: 检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1
而余下的必须为0 没有LIST1中指明的 不作检查
SYN ACK FIN RST PSH URG
--syn: 相当于--tcp-flags SYN,ACK,FIN,RST SYN 相当于 tcp三次握手的第一次
-p udp
--dport
--sport
-p icmp
--icmp-type 可用数字表示其类型
0 echo-reply 回显应答 回送应答 用在他ping别人
8 echo-request 请求回送 用在别人ping他
显式扩展: 必须使用 -m 选项指定使用的扩展
# man iptables \\ CentOS 6 获取帮助
# man iptables-extensions \\ CentOS 7 获取帮助
1 multiport 扩展 以离散方式定义多端口匹配 最多指定15个端口
-m multiport --sports 22,80 指明多个源端口 22和80 下面有示例
-m multiport --dports 22:30 指明多个目标端口 22到30
-m multiport --ports 22,80 既可以指明源 也可以指明目标 很少用
2 iprange 扩展 指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用
-m iprange --src-range 192.168.10.1-192.168.10.120 指明连续的源地址范围
-m iprange --dst-range 192.168.10.1-192.168.10.120 指明连续的目标地址范围
3 string 扩展 检查报文中出现的字符串 \\ 使用kmp 可以 使用 bm不行
-m string --algo kmp --string 'movie' \\ kmp bm 两种算法 都差不多 用一个就行
4 time 扩展 匹配时间 date查看时间注意是 CST时间是东八区 设置的时间为UTC时间是0时区
-m time --timestart 14:00 -m time --timestop 16:00
-m time --datestart
-m time --datestop
-m time --monthdays 1-31
-m time --weekdays 1-7
5 connlimit 扩展 并发连接数限制 根据每客户端IP(也可以说地址块) 做并发连接数量匹配
-m connlimit --connlimit-above 3 大于 超过的连接数目 一般做拒绝 相对默认放行一般做拒绝
-m connlimit --connlimit-upto 3 小于等于此上限 一般做放行 相对默认拒绝一般做放行
6 limit 扩展 基于收发报文的速率做检查
-m limit --limit 10/minute 设定速率是10个每分钟 还有 /hour /day /second
-m limit --limit-burst 3 设定一开始的峰值是3 不做限制
7 state 扩展 ***根据连接追踪机制检查连接的状态
/proc/sys/net/nf_conntrack_max 调整连接追踪功能所能够容纳的最大连接数量
/proc/net/nf_conntrack 已经追踪到并记录下的连接
/proc/sys/net/netfilter/ 目录下有不同协议或连接类型追踪的时长
可追踪的连接状态
-m state --state NEW: 新发出的请求 连接追踪模板中不存此连接相关的信息条目 将其识别为第一次发出的请求
-m state --state ESTABLISHED: new状态后 连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态
-m state --state RELATED: 相关的连接 如ftp协议的命令连接与数据连接之间的关系
-m state --state INVALIED: 无法识别的连接
# iptables -I INPUT -d 192.168.10.14 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -I OUTPUT -s 192.168.10.14 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
可以优化规则 简化
# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT \\ 可以加new 的规则做放行
# iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT \\ 是这种状态的都放行
开启被动模式的ftp服务 26天4 没看 已跳过
1 装载ftp追踪时的专用模块
# modprobe nf_conntrack_ftp
2 放行请求报文
命令连接: NEW ESTABLISHED
数据连接: RELATED ESTABLISHED
# iptables -A INPUT -d 192.168.10.14 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -d 192.168.10.14 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
3 放行响应报文:
ESTABLISEHD
# iptables -A OUTPUT -s 192.168.10.14 -p tcp -m state --state ESTABLISHED -j ACCEPT
目标:
-j jump至指定的 target处理目标
accept: 接受
drop: 丢弃
reject: 拒绝
return: 返回调用链
redirect: 端口重定向
log: 记录日志
mark: 做防火墙标记
dnat: 目标地址转换
snat: 源地址转换
masquerade: 地址伪装
...
自定义链: 由自定义链上的规则进行匹配检查
规则示例2:
# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 192.168.10.11 -p tcp -j ACCEPT \\ 凡是访问本机的报文属于tcp协议都放行
首先 放行 就是 过滤 所以是-t filter表 可以省略
访问本机 就是到本机内部来的 在-A规则后面 添加到 INPUT链上 到本机内部只有两个一个inpu 一个是perrouting 第二个不能过滤
源地址是 所有主机 -s 0.0.0.0/0 可以省略 写的时候要有掩码
目标地址是 本地主机 -d 192.168.10.11
协议是 -p tcp 目标 -j accept 都放行
# iptables -t filter -A OUTPUT -s 192.168.10.11 -d 0.0.0.0/0 -p tcp -j ACCEPT
凡是由本机发出的tcp协议报文跟任何主机通信都允许出去