22、iptables学习笔记

netfilter: 工作内核中,让规则能够生效网络框架        

iptables: 工作于用户空间,编写规则并且发送到netfilter


四表:

raw,mangle,nat,filter(默认表)

五链:

PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING


表和链的对应关系:

filter:

INPUT, FORWARD, OUTPUT


nat:

PREROUTING, OUTPUT, POSTROUTING


mangle:

PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING


检查条件:

IP:SIP, DIP

TCP:SPORT, DPORT, Flags

UDP:SPORT, DPORT

ICMP:ICMP-TYPE


扩展机制:

time,string, state(connection-tracking)


处理机制:

DROP

REJECT

ACCEPT

SNAT

DNAT

RETURN

REDIRECT

LOG


iptables [-t table] -N chain

创建一条自定义的规则链

iptables [-t table] -X [chain]

删除自定义的空链

iptables [-t table] -E old-chain-name new-chain-name

修改自义链名


iptables [-t table] -P chain target

为链指定默认策略,指定默认规则


iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

-F: 清空链中的规则

规则有编号,在链中自上而下,从1开始;

-L: list,列出表中的所有规则;

-n: 数字格式显示IP和Port

-v: 以详细格式显示

  pkts bytes target     prot opt in     out     source               destination 

pkts: packets, 被本规则所匹配到的报文的个数;

bytes: 被本规则所匹配到的所有报文的大小之和,会执行单位换算;

target: 目标,即处理机制;

prot: 协议,一般为{TCP|UDP|ICMP}; 

opt: 可选项

in: 数据包的流入接口;

out: 数据包的流出接口;

source: 源地址;

destination: 目标地址;

-vv

-vvv

-x: exactly, 精确值,不执行单位换算;

--line-numbers: 显示各规则的行号;

-Z: zero, 把规则的计数器清零


iptables [-t table] {-A|-I|-D|-R} chain rule-specification


规则命令:

追加规则

iptables [-t table] -A chain [rulenum] rule-specification

删除规则

iptables [-t table] -D chain rulenum

插入规则

iptables [-t table] -I chain [rulenum] rule-specification

替换指定规则

iptables [-t table] -R chain rulenum rule-specification

只显示指定链上的规则添加命令:

iptables [-t table] -S [chain [rulenum]]


rule-specification

匹配条件 -j 处理机制


匹配条件:

通用匹配:

-s :匹配原地址,可以IP,也可以网络地址;可以使用!操作符取反, ! 172.16.0.0/16; -s 相当于 --src, 或 --source

-d : 匹配目标地址

-p : 匹配协议,通常只使用{TCP|UDP|ICMP}三者之一;

-i :数据报文流入的接口;通常只用于INPUT、FORWARD和PREROUTING

-o :流出的接口;通常只用于OUTPUT、FORWARD和POSTROUTING


  扩展匹配

 隐含扩展: 使用-p {tcp|udp|icmp}指定某特定协议后,自动能够对协议进行的扩展

-p icmp

--icmp-type

8: ping请求

0:ping响应


放行ping其它主机

iptables -A OUTPUT -s 192.168.130.61 -p icmp  --icmp-type 8 -j ACCEPT

iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 0 -j ACCEPT

放行其它主机ping自己

iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 8 -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61 -p icmp  --icmp-type 0 -j ACCEPT

-p udp

--dport

--sport


放行本机dns服务,自己作为DNS客户端

iptables -A OUTPUT -s 192.168.130.61 -p udp --dport 53 -j ACCEPT

iptables -A INPUT -d 192.168.130.61 -p udp --sport 53 -j ACCEPT


放行本机dns服务,自己作为DNS服务器

iptables -A INPUT -d 192.168.130.61 -p udp --dport 53 -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61 -p udp --sport 53 -j ACCEPT


放行本机的tftp服务,自己作为tftp服务器(测试不成功,无法传输数据)

iptables -A INPUT -d 192.168.130.61 -p udp --dport 69 -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61  -p udp --sport 69 -j ACCEPT


 -p tcp

 --dport m[-n] :匹配的目标端口,可以是连续的多个端口;

 --sport       :匹配的源端口     

 --tcp-flags rst,syn,ack,fin syn


放行本机web服务,自己作为web客户端

iptables -A OUTPUT -s 192.168.130.61 -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -d 192.168.130.61 -p tcp --sport 80 -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61 -p tcp --dport 443-j ACCEPT

iptables -A INPUT -d 192.168.130.61 -p tcp --sport 443 -j ACCEPT

 

 放行本机ss服务,自己作为ss服务器

 iptables -t filter -A INPUT -d 192.168.130.61 -p tcp --dport 22 -j ACCEPT

 iptables -t filter -A OUTPUT -s 192.168.130.61 -p tcp --sport 22 -j ACCEPT



  显式扩展:必须要明确指定的扩展模块

  -m 扩展模块名称 --专用选项1 --专用选项2

  

  multiport: 多端口匹配,一次指定多个(15个以内)离散端口

  --sports  port[,port|,port:port]

  --dports

  --ports


[root@localhost ~]# 

[root@localhost ~]# iptables -S

-P INPUT DROP

-P FORWARD DROP

-P OUTPUT DROP

-A INPUT -d 192.168.130.61/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT 

-A INPUT -d 192.168.130.61/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT 

-A INPUT -d 192.168.130.61/32 -p udp -m udp --sport 53 -j ACCEPT 

-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --sport 80 -j ACCEPT 

-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --sport 443 -j ACCEPT 

-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --dport 22 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p udp -m udp --dport 53 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --dport 80 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --dport 443 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --sport 22 -j ACCEPT  

  使用multiport将80,443这3条合并为1条

  iptables -A INPUT -d 192.168.130.61 -p tcp -m multiport --dports 80,443 -j ACCEPT

  iptables -A OUTPUT -s 192.168.130.61 -p tcp -m multiport --sports 80,443 -j ACCEPT

  

  iprange: ip地址范围

  [!] --src-range from[-to]

  [!] --dst-range from[-to]

  

  只允许192.168.130.1-192.168.130.60范围内的IP能ssh访问192.168.130.61

  iptables -A INPUT -d 192.168.130.61 -p tcp --dport 22 -m iprange --src-range 192.168.130.1-192.168.130.60 -j ACCEPT

      iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 22 -m iprange --dst-range 192.168.130.1-192.168.130.60 -j ACCEPT

  

      time: 指定时间范围

      --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

         --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 

  

         --timestart hh:mm[:ss]

          --timestop hh:mm[:ss]

  

          [!] --weekdays day[,day...]

  

          只有每周的周一至周五的8点到18点可以访问192.168.130.61的web服务器

          iptables -A INPUT -d 192.168.130.61 -p tcp --dport 80 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT

          iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 80 -j ACCEPT

  

          string: 字符串匹配

          --algo {bm|kmp}:字符匹配查找时使用算法

          --string "STRING": 要查找的字符串

          --hex-string “HEX-STRING”: 要查找的字符,先编码成16进制格式

          

          禁止访问192.168.130.61含有google字符的网站

          iptables -I OUTPUT -s 192.168.130.61 -p tcp --sport 80 -m string --algo kmp --string "google" -j DROP


        connlimit: 每IP对指定服务的最大并发连接数;

        [!] --connlimit-above [n]

iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 3 -j DROP

       

ab -c 200 -n 2000 https://172.16.100.7/test.html 

  

  

          limit: 报文速率控制

          --limit #[/second|/minute|/hour|/day]

          --limit-burst #

          iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 5 -j ACCEPt

  初始可以达到每秒ping 5次,平均每秒不能超过2个

  

          state: 状态匹配  

          --state  

          NEW

          ESTABLISHED

          RELATED

          INVALID


    调整连接追踪功能所能容纳的追踪的最大连接数:

        # cat /proc/sys/net/nf_conntrack_max 

        定义了连接追踪的最大值,因此,建议按需调大此值;

        # cat /proc/net/nf_conntrack

        记录了当前追踪的所有连接

        # cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established

        法则:

        1、对于进入的状态为ESTABLISHED都应该放行;

        2、对于出去的状态为ESTABLISHED都应该放行;

        3、严格检查进入的状态为NEW的连接;

        4、所有状态为INVALIED都应该拒绝;

        如何放行工作于被动模式下的FTP服务?

        1、确保iptables加载ftp协议支持的模块:ip_nat_ftp, ip_conntrack_ftp

        编辑/etc/sysconfig/iptables-config文件,定义如下参数:

        IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

        modprobe ip_nat_ftp

        modprobe ip_conntrack_ftp

        2、放行请求报文的RELATED和ESTABLISHED状态,放行响应报文的ESTABLISHED状态;

iptables -A INPUT -d 192.168.130.61 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61 -m state --state ESTABLISHED -j ACCEPT 

iptables -A INPUT -d 192.168.130.61 -p tcp --dport 21 -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 21 -j ACCEPT       

       

        -j target

        RETURN: 返回调用链


练习:判断下述规则的意义:

# iptables -N clean_in

# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP

# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP


# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP

# iptables -A clean_in -d 192.168.130.61 -j RETURN 



# iptables -A INPUT -d 192.168.130.61 -j clean_in


# iptables -A INPUT  -i lo -j ACCEPT

# iptables -A OUTPUT -o lo -j ACCEPT



# iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP

# iptables -A INPUT  -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP

# iptables -A INPUT  -i eth0 -p udp --dport 1026 -j DROP

# iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP


# iptables -A INPUT  -p icmp -m limit --limit 10/second -j ACCEPT





利用iptables的recent模块来抵御DOS***: 22,建立一个列表,保存有所有访问过指定的服务的客户端IP



ssh: 远程连接,


iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP



iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP


1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;


2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。


下面对最后两句做一个说明:


1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH

--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目


2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。

--update 是指每次建立连接都更新列表;

--seconds必须与--rcheck或者--update同时使用

--hitcount必须与--rcheck或者--update同时使用


3.iptables的记录:/proc/net/xt_recent/SSH



也可以使用下面的这句记录日志:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"




路由:对于Linux主机来说,设定/proc/sys/net/ipv4/ip_forward的值为1,即为开启了路由功能;

NAT: 过载技术

Basic NAT: 静态NAT;

NAPT:动态NAT,网络地址端口转换;

源地址转换:SNAT,用于让内网主机访问互联网

目标地址转换:DNAT,让互联网上主机访问本地内网中的某服务器上的服务,(发布)


iptables基于SNAT和DNAT这两个目标实现地址转换技术;

-j SNAT --to-source SIP

规则添加:POSTROUTING链

-j MASQUERADE


-j DNAT --to-destination DIP[:PORT]

支持端口映射


例子:

# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.20.11

# iptables -A FORWARD -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo kmp --string "hello" -j REJECT

# iptables -t nat -A PREROUTING -d 192.168.130.61 -p tcp --dport 22022 -j DNAT --to-destination 192.168.20.12:22


保存规则:

service iptables save

规则会被保存至/etc/sysconfig/iptables文件中;

默认,start时也会读取此文件中的内容以设置规则;

# iptables-save > /path/to/some_rulefile

# iptables-restore < /path/from/some_rulefile


猜你喜欢

转载自blog.51cto.com/kaiyuandiantang/2301672