欢迎各位兄弟 发布技术文章
这里的技术是共享的
匹配条件:
通用匹配 (普通匹配)
-s,--src 指定源ip地址,源网络
-d,--dst 指定目标ip地址,目标网络
-p {tcp|udp|icmp} 指定协议
-i INTERFACE (input interface)(比如 ethX网卡,pptX网络接口):指定数据报文流入的接口 (进来的)
PREROUTING,INPUT,FORWARD 用在这些链上,可用于定义的标准链
-o INTERFACE (output interface)(比如 ethX网卡,pptX网络接口):指定数据报文流出的接口 (出去的)
POSTROUTING,OUTPUT,FORWARD 用在这些链上,可用于定义的标准链
扩展匹配:使用netfilter的扩展模块才能完成的匹配
隐含扩展:(当我们使用-p实施某协议之后)不需要明确指定(特别指明)由哪个模块扩展,因为此时使用了 -p {tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]:源端口, (source port) 例如 80-100 只能是连续的端口,不能是隔开的端口
--dport PORT[-PORT]:目标端口,(destination port) 例如 80-100 只能是连续的端口,不能是隔开的端口
--tcp-flags: mask comp:只检查mask指定的标志位,是逗号分隔的标志位列表. comp:此列表中的位必须为1,而comp中未出现且mask中出现的必须为0
--tcp-flags SYN,FIN,RST,ACK SYN,ACK ( 这里SYN,ACK必须为1,FIN,RST必须为0)
--tcp-flags SYN,FIN,RST,ACK SYN = --syn (这是三次握手的第一次因为它用得比较多,所以用 --syn来简写它)
--syn (--tcp-flags SYN,FIN,RST,ACK SYN 的简写,因为它用得比较多) 这是三次握手的第一次
-p icmp
--icmp-type:(icmp报文的类型) 类型对照表 /node-admin/12464
0:echo-replay 响应报文
8:echo-request 请求报文
-p udp
--sport PORT[-PORT]:源端口, (source port)
--dport PORT[-PORT]:目标端口,(destination port)
隐含扩展也可以使用显式扩展的(比如 -p tcp --dport 可以写成 -p tcp -m tcp --dport)
显式扩展:必须指明由哪个模块进行的扩展,在 iptables中使用-m选项可完成此功能 使用额外的条件匹配机制(比如报文的速度,追踪会话连接的状态,可以根据时间来放行数据报文的) -m 是match的意思 MATCH EXTENSIONS 匹配扩展
-m EXTENSION --spe-opt (--spe-opt 指定选项,指定独有选项)
-m state: 状态扩展
结合ip_conntrack追踪会话的状态 (与TCP协议状态其实不一样,是根据ip来的)(可以追踪三种协议 tcp udp icmp)
NEW: 新连接请求 (相当于TCP/IP握手的第一次),但是ping别人第一次也是NEW,udp第一次也是NEW
ESTABLISHED: 已建立的连接 (对新请求的响应)
INVALID: 非法连接(非法报文) (比如报文 SYN=1,FIN=1)
RELATED: 相关联的 (比如 ftp 命令连接和数据连接,数据连接由于命令连接中的某个命令激活的,比如get mget,put,mput都可以激活) 由命令连接激活的另一个连接,这种两个关系叫做RELATED (它其实是专为ftp服务器而设定的)
(例子 -m state --state NEW -j ACCEPT ,,,,-m state --state NEW,ESTABLISHED -j ACCEPT)
(NEW,ESTABLISHED 可以用逗号隔开两个状态,表示这两个状态的都一律放行)
要使用 ftp 功能,首先要装载 ip_conntrack_ftp和 ip_nat_ftp模块
-m multiport:离散的多端口匹配扩展
--source-ports
--destination-ports
--ports (不指定源或目标端口,只要是端口就行,包括源和目标)
(比如 -m multiport --destination-ports 21,22,80 -j ACCEPT)
(这里端口不连续用逗号)(端口连续的话 用冒号) (最多支持15个端口)
-m iprange:ip的范围
--src-range
--dst-range
-s,-d
-s IP,NET
cadr格式(172.16.0.0/16)
172.16.100.3-172.16.100.100
iptables -t filter -A INPUT -p tcp -m iprange --src-range 192.168.1.0-192.168.1.244 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
感叹号 ! 放行给这个地址范围之外的地址访问了
iptables -t filter -A INPUT -p tcp -m iprange ! --src-range 192.168.1.0-192.168.1.244 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-m connlimit:连接数限定(限制) (感觉是对于一个客户端而言的)
! --connlimit-above n (above 达到)连接上限,最多多少连接(通常前面加感叹号!,ACCEPT的情况下加叹号)
iptables -t filter -A INPUT -d 192.168.1.15 -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT
没有达到2个就接受(但意味着达到2个就拒绝吗?未必) (--connlimit-above 2 -j DROP)
-m limit: (感觉是对于所有客户端而言的)
--limit RATE: 速率(单位时间 每秒每分每小时)
--limit-burst 7: 一批进来的上限 (第一批爆发7个)(超出的话连接可能会重置,要求用户重新发送请求)
-m string:
--algo:(Algorithm 算法) (bm或kmp)
--string "STRING": 包含的字符串 (不仅仅是字符串,而是当作一个模式pattern(正则表达式)来匹配的)
-j TARGET
ACCEPT
DROP
REJECT
LOG:记录日志信息的(它是不管允许还是拒绝的) (LOG一定要放在相应的ACCEPT,DROP,REJECT前面,否则的话人家允许或拒绝后执行不到LOG)
(日志频率要降低,防止磁盘IO开销太大,而导致磁盘性能下降)
--log-level level
Level of logging (numeric or see syslog.conf(5)).
--log-prefix prefix 前缀
Prefix log messages with the specified prefix; up to 29 letters
long, and useful for distinguishing messages in the logs.
--log-tcp-sequence
Log TCP sequence numbers. This is a security risk if the log is
readable by users.
--log-tcp-options
Log options from the TCP packet header.
NAT
FORWARD
# man iptables
# man iptables
http 是连接无状态的,尤其是没有使用长连接的情况下,用户下载后,就立即关闭了
像 ssh telnet 长连接 -m connlimit ! --connlimit-above 2 -j ACCEPT 效果是比较明显的
tc: traffic control (流量控制) reshape 流量整形,流量重塑
并没有限定最多有多少人同时在线,
1)可以限定每秒钟,每分钟,每小时(单位时间)可以接进来的请求数,
2)并发涌至的请求数
不能限定总体上限,但可以限定流量上限
# man iptables
[root@localhost ~]# iptables -L -n
[root@localhost ~]# iptables -I INPUT -d 192.168.0.15 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 3 -j ACCEPT
上面使用 22 这种长连接的端口对于 limit 模块 好像看不出效果
[root@localhost ~]# iptables -I INPUT -d 192.168.0.15 -p icmp --icmp-type 8 -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT -s 192.168.0.15 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -L -n --line-numbers
可以ping了
(--limit 1/second 这个每秒钟应该看不出来效果吧)
[root@localhost ~]# iptables -R INPUT 1 -d 192.168.0.15 -p icmp --icmp-type 8 -m limit --limit 1/second -j ACCEPT
(--limit-burst 默认为5)
默认 ping 4次
windows中 ping -t 可以 ping 无数次
# ping -h #windows中的命令帮助
(切记 下面的规则要删除其它有对这个icmp 有影响的其它的iptables规则,否则即使它没有起作用,其它的规则可以对它起作用,会导致下面的规则好像看起来失效)
[root@localhost ~]# iptables -R INPUT 1 -d 192.168.0.15 -p icmp --icmp-type 8 -m limit --limit 3/minute -j ACCEPT
[root@localhost ~]# iptables -R INPUT 1 -d 192.168.0.15 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 6 -j ACCEPT
# man iptables
(algo Algorithm 的简写) bm 是两个人简写 kmp 是三个人简写 它们几乎相当,差不多,没有好坏
--hex-string 十六进制字符串,效率更高一点
[root@localhost ~]# vim /var/www/html/test.html
h7n9
hello world
~
[root@localhost ~]# iptables -I INPUT -d 192.168.0.15 -m string --algo kmp --string "h7n9" -j REJECT
[root@localhost ~]# iptables -L -n
[root@localhost ~]# iptables -L -n -v
http://192.168.0.15/test.html 这是可以打开的,虽然里面有内容 h7n9 ,但是它可以打开
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# ls -la
总计 12
drwxr-xr-x 2 root root 4096 09-12 20:35 .
drwxr-xr-x 6 root root 4096 09-11 21:39 ..
-rw-r--r-- 1 root root 17 09-12 20:35 test.html
[root@localhost html]# mv test.html h7n9.html
[root@localhost html]#
此时打不开了,
当然 http://192.168.0.15/ 是可以打开的
( iptables -I INPUT -d 192.168.0.15 -m string --algo kmp --string "h7n9" -j REJECT )所以 INPUT 里面如果出现 h7n9 就会屏蔽掉,如果INPUT 没有 h7n9 就不会屏蔽
( iptables -I OUTPUT -s 192.168.0.15 -m string --algo kmp --string "h7n9" -j REJECT )所以 OUTPUT 里面如果出现 h7n9 就会屏蔽掉,如果OUTPUT 没有 h7n9 就不会屏蔽
[root@localhost html]# cd /var/www/html/
[root@localhost html]# mv h7n9.html test.html
http://192.168.0.15/test.html 此时不能打开 (好像这个有缓存时间,要过几分钟才可以的)
此时是能够匹配到报文的
# man iptables
当然有 Recent 模块 限制在某段时间最多尝试几次登陆 (ssh 等)
比如5分钟最多登陆两次, 过了5分钟再尝试,尝试多了,加入黑名单列表
[root@localhost html]# iptables -L -n --line-numbers
[root@localhost html]# iptables -I INPUT 2 -d 192.168.0.15 -p icmp --icmp-type 8 -j LOG --log-prefix "--firewall log for icmp--"
[root@localhost html]# tail /var/log/messages
[root@localhost html]# tail -f /var/log/messages (tail -f: 查看文件尾部,不退出,等待其它进程追加进来的新内容 ,比如apache 的日志文件)
LEN ping包长度 TOS是服务质量(服务类型)