iptables 语法以及个参数详解
iptables [-t TABLE] COMMAND CHAIN [num] 匹配条件 -j 处理动作
通用匹配 -s 原地址 -d 目的地址 -p 协议 -i input 网卡名 -o output 网卡名 (数据包流入和流出的网卡)
扩展匹配 ----sport PORT[-PORT]: 源端口 --dport PORT[-PORT]: 目标端口
--tcp-flags mask comp:只检查mask指定的标志位,是逗号分隔的标志位列表;comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;
--tcp-flags SYN,FIN,ACK,RST SYN = --syn #这句就是匹配三次握手的第一次的数据包
-p icmp --icmp-type 0: echo-reply icmp 应答
8: echo-request icmp请求
state: 状态扩展,结合ip_conntrack追踪会话的状态
NEW: 新连接请求
ESTABLISHED:已建立的连接
INVALID:非法连接
RELATED:相关联的
-m state --state NEW,ESTABLISHED -j ACCEPT
-m 装载模块 这里是装载state模块 然后在使用--state参数
multiport: 多端口匹配扩展 -source-ports --destination-ports --ports
如:iptables -I INPUT -p tcp -m multiport -destination-ports 21,22,80 -m state --state NEW -j ACCEPT # 多端口直接用逗号分隔
-m iprange: 连续的多地址匹配 --src-range #原地址 --dst-range #目的地址
iptables -A INPUT -p tcp -m iprange --src-range 192.168.0.1-192.168.0.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-m connlimit 模块功能:#限制每个客户端IP的并发连接数,每个IP同时连接到一个服务器个数 –connlimit-above N #限制N个 –connlimit-mask n #主机的掩码,默认是connlimit-mask 32 ,即每个IP.
如:iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT
连接数在不超过3个允许通过,超过3个后续的请求被拒绝。这个可以控制多线程下载工具对网络带宽的占用,
-m limit --limit 限制特定包传入速度 如: iptables -A INPUT -m limit --limit 3/hour --limit 参数 /second、 /minute、/day。 除了进行封 --limit-burst 参数 限制特定包瞬间传入的峰值
iptables -A INPUT -d 192.168.1.1 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 6 -j ACCEPT
可以一次接收6个ping请求,之后按照速率5个/minute 响应
-m string 实现字符串匹配,URL过滤,安全策略 --algo bm|kmp 设置字符匹配的查询算法,默认使用bm算法,kmp算法,是一种更复杂的算法 iptables -A OUTPUT -p tcp -m string --string "qq.com" --algo bm -j DROP iptables -A OUTPUT -p udp -m string --string "qq.com" --algo kmp -j DROP
一些防止***的规则 iptables -I INPUT 1 -p tcp --dport 80 -m string --string "cmd.exe" --algo bm -j DROP
iptables -I INPUT 1 -p tcp --dport 80 -m string --string "domain.com" --algo kmp -j DROP
recent 模块,防止×××暴力破解
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
每个IP每小时只限连接5次。
这里说一下 -rcheck和update的区别
rcheck从第1个包开始计算时间,update是在rcheck的基础上增加了从最近的DROP包开始计算阻断时间,具有准许时间和阻断时间,update会更新last-seen时间戳。
iptables 设置端口转发/映射 默认内核禁止ip转发 开启方式
2.1.临时开启,(写入内存,在内存中开启) echo "1" > /proc/sys/net/ipv4/ip_forward
3.2.永久开启,(写入内核) vim /sysctl.conf 下 加入此行 net.ipv4.ip_forward = 1 sysctl -p ---加载 sysctl -a |grep "ip_forward" ----查看
转发 iptables -t nat -A PREROUTING -p tcp -d 192.168.1.3 --dport 8080 -j DNAT --to 192.168.1.1:8001
将目的地址192.168.1.3 目的端口号 8080 的请求转发到 局域网内地址为192.168.1.1端口为8001
本地端口转发 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
管理规则 -A:在链的尾部添加一条规则 -I CHAIN [num]: 插入一条规则,不指定num默认插入到顶部,指定num在对应的CHAIN中num指出的位置插入 -D CHAIN [num]: 删除指定链中的第num条规则; -R CHAIN [num]: 替换指定的规则; 管理链: -F [CHAIN]:清空指定规则链,如果不指定,默认清除所有链规则 -P CHAIN: 设定指定链的默认策略; -N:自定义一个新的空链 -X: 删除一个自定义的空链 -Z:置零指定链中所有规则的计数器 -E: 重命名自定义的链 查看: -L: 显示指定表中的规则; -n: 以数字格式显示主机地址和端口号; -v: 显示链及规则的详细信息 -vv: -x: 显示计数器的精确值 --line-numbers: 显示规则号码
动作(target): ACCEPT:放行 DROP:丢弃 REJECT:拒绝 DNAT:目标地址转换 SNAT:源地址转换 REDIRECT:端口重定向 MASQUERADE:地址伪装 LOG:日志 MARK:打标记
------------------------------------------------示例------------------------------------------- iptables 将filter表的INPUT和OUTPUT默认策略设置为DROP,
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
允许yum安装软件数据包通过,需要如下规则
在filter表的INPUT链中放行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
在filter表的OUTPUT链中放行
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp -m state --state NEW --dport 80 -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p tcp --sport 10000:65535 -j ACCEPT
service iptables save 保存 不保存重启后规则失效
放行 SSH流量 由于出入口的策略是DROP,所以放行也是双向的
iptables -A INPUT -s 172.17.0.0/16 -d 172.17.100.1 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 172.17.100.1 -d 172.17.0.0/16 -p tcp --sport 22 -j ACCEPT
放行 httpd服务80端口 流量
iptables -A INPUT -s 172.17.0.0/16 -d 172.17.100.1 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -s 172.17.100.1 -d 172.17.0.0/16 -p tcp --sport 80 -j ACCEPT
允许ping自己 放行本地环路接口数据包
iptables -t filter -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEP
iptables -t filter -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
做ping屏蔽 你可以ping别人,别人不能ping你
iptables -A INPUT -d 172.168.100.1 -p icmp --icmp-type 0 -j ACCEPT
iptables -t filter -A OUTPUT -s 172.168.100.1 -p icmp --icmp-type 8 -j ACCEPT
放行FTP服务流量通行
简单说一下FTP协议,FTP协议是一个简单的tcp协议,数据的连接分为主动模式和被动模式
主动方式的连接过程:客户端向服务器的FTP端口(默认是21)发 送连接请求建立连接(命令链路),当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器所开放传输数据的端口,然后服务器从20端口向客户端开放的数据端口发送连接请求,建立数据链路传输数据
被动方式的连接过程:客户端向服务器的FTP端口(默认是21)发送连接请求建立连接(命令链路)。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端所开放传输数据的端口,客户端向服务器开放的传输数据端口发送连接请求,建立数据链路传输数据
ftp默认是被动模式,主动和被动之间使用"pass"命令切换,主动模式通过20端口与客户端相连,而被动模式却使用1024以后的端口与客户端相连,由于1024以后的端口是随机分配的,所以在被动模式下我们是不知道服务端是使用什么端口与客户端连接的
放行FTP 21端口,允许连接 vim /etc/sysconfig/iptables-config //先修改配置文件将模块加载进去,必须修改,否则ftp服务数据包没办法通过
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
添加如下规则:
iptables -t filter -A INPUT -d 172.168.100.7 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -s 172.168.100.7 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -d 172.168.100.7 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
service iptables save service iptables restart
状态追踪规则
防止反弹式病毒
redhat系统上在 /proc/net/ip_contrack文件中记录 /proc/sys/net/ipv4/ip_conntrack_max 设置可以记录的链接总条数
对sshd服务进行状态追踪 允许新建的和已连接的数据包进入 iptables -A INPUT -d 192.168.1.100 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
允许已连接的数据出去 iptables -A OUTPUT -s 192.168.1.100 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
对httpd,ping命令等做状态追踪都是和实列一样,举一反三
日志记录功能,在系统日志/var/log/messages里
iptables -I INPUT -d 192.168.1.100 -p icmp --icmp-type 8 -j LOG --log-prefix "---firewall log for icmp---"
将目的ip是192.168.1.100 并且协议是icmp的 是别人ping我的数据包。我要把它的信息记录到我的日志里边
--log-prefix 参数你要标识的字符串,在系统日志中可以方便的找到你要查询的记录
防止××××××我们的22号端口服务,这些规则前面最好没有drop和reject的规则,否则可能失效
1、iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH //--set记录IP --name 记录到哪,记录到名字为SSH的内存缓冲文件中 2、iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --seconds 300 --hitcount 4 -j LOG --log-prefix "-----SSH NOLOGAIN-----------" //将300秒内 连续登陆4次的记录的 系统日志文件中 3、iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 4 --name SSH -j DROP //如果300秒内连续尝试登陆4次失败,放入小黑屋5分钟
自定义链
iptables -N new ##创建一条自定义连 iptables -A new -s 192.168.1.100 -j ACCEPT #添加一条规则 iptables -A new -d 192.168.1.100 -j RETURN #没有匹配到就返回主链 iptables -I INPUT -j new #放入主链 自定义链用好了,可以提升很高的数据包处理速度
删除自定义规则链:iptables -X new
注意删除自定义规则链之前请先删除链上的所有规则,之后还要清除调用这个自定义链的规则,清理完毕后就可以清除自定义链了
iptables-save > /etc/sysconfig/iptables.bak ##这个命令也可以存储规则,是重定向到别的文件
iptables-restore < /etc/sysconfig/iptables.bak ##加载规则文件,因为默认iptables是从/etc/sysconfig/iptables文件加载的。
lsmod | grep ip 查看这些功能模块是否存在。从而确定iptables是否开启
iptables功能强大而灵活,已经能够满足我们的大部分需求。但是它本身不能对应用层协议的数据包进行处理。(比如qq、×××、msn)
需要修改重新编译内核,后续看完部分内核源码在补充