IPTables

91 阅读16分钟

根据数据包中的源IP、目的IP、PORT、协议、状态、资源、内容

  • 底层核心 netfilter
  • 软件防火墙 iptables
  • 硬件防火墙 PIX
添加不追踪标识[解决nf_conntrack满表异常]
iptables -t raw -I PREROUTING -p tcp --dport 22 -j NOTRACK
iptables -t raw -I OUTPUT -p tcp --sport 22 -j NOTRACK

常用

iptables -nvL INPUT --line-number
iptables -nvL  --line-number -t nat

iptables -D chain rulenum [options]
iptables -D input 4
iptables -D PREROUTING 1 -t nat

1.主机之间通信条件

sip、dip smac、dmac sport、dport syn、ack、fin

2.主机之间通信状态

CLOSED、LISTEN SYN_RECV、SYN_SENT ESTABLISHD FIN_WAIT1、FIN_WAIT2 TIME_WAIT、LAST_ACK、CLOSING

3.iptables防火墙

  • 基本组成 表、链、规则

表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

  • 规则链 ①INPUT——进来的数据包到应用层适用此规则链中的策略 ②OUTPUT——应用层外出的数据包应用此规则链中的策略 ③FORWARD—— 数据包从一个网络转发到另外一个网络应用此规则链中的策略 ④PREROUTING——对数据包作路由选择前应用此链中的规则 (注意:所有的数据包进来的时侯都先由这个链处理) ⑤POSTROUTING——对数据包作路由选择后应用此链中的规则 (注意:所有的数据包出来的时侯都先由这个链处理)

  • 链上规则的秩序: ①同类规则(访问同一应用),匹配范围小的放上面 ②不同类规则(访问不同应用),匹配到报文频率较大的放上面 ③将那些可由一条规则描述的多个规则合并为一个 ④设置默认策略

image.png

第一种情况:入站数据流向

从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

第二冲情况:转发数据流向 来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。

第三种情况:出站数据流向 防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

image.png

  • 语法规则
iptables [-t table] COMMAND [chain] CONDITION -j ACTION
 
-t table   是指'操作的表',filter、nat、mangle或raw,'默认使用filter'
COMMAND    '子命令',定义'对规则的管理'
chain      指明'链路'
CONDITION  匹配的'条件或标准'
ACTION     匹配后'操作动作'
The following 'parameters' make up a 'rule specification'

iptables 规则中'各参数'的含义
-i:指定'数据包进入'的那个网络接口,比如 'eth0、lo' 等,需要'与 INPUT 链'配合使用
-o:指定'传出数据包'的那个网络接口,需要与 'OUTPUT 链'配合使用
匹配条件包括通用'匹配条件''扩展匹配条件'
'条件取反':!  --> Usage: -s ! 172.16.100.6 '源地址除了172.16.100.6以外的所有'
在iptables中,'-j 参数'用来指定要'进行的处理动作'

常用的'处理动作'包括:'ACCEPT''REJECT''DROP''REDIRECT''MASQUERADE'、
LOG、'DNAT''SNAT'、MIRROR、QUEUE、RETURN、MARK
'一条链上有多个规则' --> '如果先匹配,后面的规则就不再处理' --> '跳转到下一个链条'

5.查看规则 

  -L, --list [chain]:列出规则;
  -v, --verbose:详细信息;
    -vv, -vvv  更加详细的信息
  -n, --numeric:数字格式显示主机地址和端口号;
  -x, --exact:显示计数器的精确值;
  --line-numbers:列出规则时,显示其在链上的相应的编号;
  -S, --list-rules [chain]:显示指定链的所有规则;

  iptables的基本语法格式

  iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]   说明:表名、链名用于指定 iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式   比如:插入、增加、删除、查看等;条件匹配用于指定对符合什么样 条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。

  (1)基本命令

  ①-L【链名】列出指定链上的所有规则,默认列出所有链上的规则。

  举例:列出INPUT链上的所有规则

  iptables -L INPUT

-n 以数字方式显示

 -v 列出更详细信息

  通常-vnL(L只能写到最后)一起使用,查看防火墙上面的所有策略。

  iptables -vnL

  ②--line-numbers  以序列号方式列出策略,通常和-vnL一起使用。

  举例:查看防火墙上有多少条策略

  iptables -vnL --line-numbers

  ③-A 追加

  ④-I插入一条策略,默认是第一条策略。

  举例:把禁止172.17.66.66 ping本机写到INPUT规则链的第二条。

  iptables -A INPUT 2  -s 172.17.66.66 -p icmp -j REJECT

  ⑤-R 修改策略

  举例:修改上个例子中禁ping本机的ip地址172.17.66.66为172.17.88.88

  iptables -R INPUT 2 -s 172.17.88.88 -p icmp -j RENECT

 ⑥-D 删除策略  【注意:需要指明规则序号和规则本身】

  举例:删除INPUT规则链上所有策略

watch -n 1 'iptables -D INPUT -p tcp --dport 4001 -m comment --comment "vas-debug" -j ACCEPT'

while true; do /usr/sbin/iptables -D INPUT -p tcp --dport 4003  -j ACCEPT ;done

iptables -D INPUT 2

iptables -D PREROUTING 11 -t nat

 ⑦-F清空所有策略

  举例:清空防火墙上所有策略

  iptables -F

  ⑧-S命令方式显示出策略,可以重定向文件里。

  举例:把所有策略导入到iptables.txt文件里

  iptables -S > iptables.txt

  ⑨-N 自定义规则链(必须放到系统自带的五个规则链中的一个才能生效】

    自定义规则链:iptables -N account

    给自定义规则链添加策略:iptables -A account  -s 172.17.66.66,172.17.88.88 -j ACCEPT

    自定义规则链加到系统规则链里:iptables -A INPUT  -j  account

  ⑩-X 删除自定义的规则链

    从系统规则链里删除自定义链:iptables -D INPUT  (自定义规则序号)

    清空自定义规则链里面的策略:iptables -F account

    删除自定义的规则链:iptables -X account

  fc5884b9c5cc180f7fb124d120e6df0a.jpg

  d49356844b12c64b27df47e3e8014afd.jpg

  (2)基本匹配条件:无需加载模块,由iptables/netfilter自行提供,不需要加-m

①[!] --dport   指定端口

  iptables -A INPUT -p tcp  --dport 22:23:24,80  -j  REJECT

  ②[!] -s--source address[/mask][,...]:源IP地址或范围

  ③[!] -d  --destination address[/mask][,...]:目标IP地址或范围

  ④[!] -p --protocol protocol:指定协议,可使用数字如0(all)

    protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp,

  举例:拒绝172.17.66.66访问172.17.88.88的tcp80端口

  iptables -A FORWARD -s 172.17.66.66 -d 172.17.88.88 -p tcp --dport 80 -j REJECT

  说明:[!]说明可以取反。

  举例:除了172.17.66.66不能ping本机,其它都可以

  iptables -A INPPUT ! -s 172.17.66.66 -p icmp -j REJECT

  ⑤[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链

  举例:【iptables -A INPUT  -s   172.17.66.66  -i eth0  -j REJECT】

  ⑥[!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链

  (3)扩展命令:

  ①multiport扩展

  以离散方式定义多端口匹配,最多指定15个端口

  [!] --source-ports,--sports port[,port|,port:port]...指定多个源端口

  [!] --destination-ports,--dports port[,port|,port:port]...指定多个目标端口

  [!] --ports port[,port|,port:port]...多个源或目标端口

  示例:允许172.17.0.0/16这个段的网络通过20、80端口访问本机

  iptables -A INPUT -s 172.16.0.0/16 -p tcp -m multiport --dports 20,80 -j ACCEPT

  ②iprange扩展

  指明连续的(但一般不是整个网络)ip地址范围

  [!] --src-range from[-to] 源IP地址范围

  [!] --dst-range from[-to] 目标IP地址范围

  示例:拒绝172.16.100.5-172.16.100.10这个网段的ip通过tcp80端口访问本机

  iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP

  ③mac扩展

  指明源MAC地址

  --mac-source XX:XX:XX:XX:XX:XX

  示例:拒绝00:50:56:12:34:56这个mac地址访问本机

  iptables -A INPUT -s 172.16.0.100 -m mac --macsource 00:50:56:12:34:56 -j ACCEPT

  ④string扩展:   【回应报文】

  对报文中的应用层数据做字符串模式匹配检测

  --algo {bm|kmp}:字符串匹配检测算法

    bm:Boyer-Moore

    kmp:Knuth-Pratt-Morris

  [!] --string pattern:要检测的字符串模式

  [!] --hex-string pattern:要检测字符串模式,16进制格式

  示例:拒绝172.16.0.0/16这个网段的ip访问带有goolge字样的网站

  iptables -A OUTPUT -s 172.16.0.0/16 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT

  ⑤time扩展

  根据将报文到达的时间与指定的时间范围进行匹配

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

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

  --timestart hh:mm[:ss] 时间

  --timestop hh:mm[:ss]

  [!] --monthdays day[,day...] 每个月的几号

  [!] --weekdays day[,day...] 星期几

  注意:CentOS7系统默认为UTC 【需要减八个小时是北京时区】

  举例:拒绝172.16.0.0/16这个网段在每周的Sat,Sun的14:30-18:30访问tcp的80端口

  iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

  ⑥connlimit扩展

  根据每客户端IP做并发连接数数量匹配可防止CC(Challenge Collapsar挑战黑洞)攻击

  --connlimit-upto n:连接的数量小于等于n时匹配

  --connlimit-above n:连接的数量大于n时匹配

  示例:当连接数量大于2时拒绝访问172.16.100.10

  iptables -A INPUT -d 172.16.100.10 -p tcp --dport  22 -m connlimit --connlimit-above 2 -j REJECT

  ⑦state扩展

  conntrack机制:追踪本机上的请求和响应之间的关系

  状态有如下几种:

  NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求

  iptables -A INPUT -s 172.17.66.66 -p tcp --dports 80 -m state --state NEW -j REJECT 【正在进行的没事,新连接的拒绝,即重新访问80端口的都不行】

  ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态

  RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系

  INVALID:无效的连接,如flag标记不正确

  UNTRACKED:未进行追踪的连接,如raw表中关闭追踪

  三、网络防火墙

  iptables/netfilter网络防火墙:   (1) 充当网关   (2) 使用filter表的FORWARD链

  ①SNAT   让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装   网络拓扑:

  38f68bfacf1efd3c6b64add156e3409f.png

  基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。

  定义的样式:

  比如我们现在要将所有192.168.0.0/24网段的IP经过路由器(记得开启转发功能,同时连接外网和内网)的时候全都转换成8.8.8.8这个假设出来的外网地址:

命令:iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 8.8.8.8 

  这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成8.8.8.8这个IP.

 ②DNAT

  对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。

  定义的样式:

  比如我们现在在互联网上想访问192.168.0.0/24这个网段的局域网,经过路由器的时候全部转换为192.168.2.2这个内网地址:

  命令:iptables -t nat -A PREROUTING -d 8.8.8.8 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.0/24

  四、控制规则的存放以及开启

  注意:你所定义的所有内容,当你重启机器的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来

  ①service iptables save 命令

  它会保存在/etc/sysconfig/iptables这个文件中

  ②iptables-save 命令

  iptables-save > /etc/sysconfig/iptables

  ③iptables-restore 命令

  开机的时候,它会自动加载/etc/sysconfig/iptabels

  如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:

  iptables-restore < /etc/sysconfig/iptables.2

  则完成了将iptables中定义的规则手动生效

PREROUTING 和 POSTROUTING 的简单关系

源地址发送数据--> {PREROUTING-->路由规则-->POSTROUTING} -->目的地址接收到数据

当你使用:iptables -t nat -A PREROUTING -i eth1 -d 1.2.3.4 -j DNAT --to 192.168.1.40 时,你访问1.2.3.4,linux路由器会在“路由规则”之前将目的地址改为192.168.1.40,并且Linux路由器(iptables)会同时记录下这个连接,并在数据从192.168.1.40返回时,经过linux路由器将数据发送到那台发出请求的机器。所以你的"POSTROUTING"规则没有起作用。 而"POSTROUTING"是“路由规则”之后的动作。

PREROUTING的应用 一般情况下,PREROUTING应用在普通的NAT中(也就是SNAT),如:你用ADSL上网,这样你的网络中只有一个公网IP地址(如:61.129.66.5),但你的局域网中的用户还要上网(局域网IP地址为:192.168.1.0/24),这时你可以使用PREROUTING(SNAT)来将局域网中用户的IP地址转换成61.129.66.5,使他们也可以上网: iptables -t nat -A PREROUTING -s 192.168.1.0/24 -j SNAT 61.129.66.5

POSTROUTING的应用 POSTROUTING用于将你的服务器放在防火墙之后,作为保护服务器使用,例如: A.你的服务器IP地址为:192.168.1.2; B.你的防火墙(Linux & iptables)地址为192.168.1.1和202.96.129.5

Internet上的用户可以正常的访问202.96.129.5,但他们无法访问192.168.1.2,这时在Linux防火墙里可以做这样的设置: iptables -t nat -A POSTROUTING -d 202.96.129.5 -j DNAT 192.168.1.2

最要紧的是我们要记住PREROUTING是“路由规则”之前的动作,POSTROUTING是“路由规则”之后的动作!

PREROUTING是目的地址转换(DNAT),要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的服务器。

POSTROUTING是源地址转换(SNAT),要把你内部网络上受防火墙保护的ip地址转换成你本地的公网地址才能让它们上网。 下面的命令还是来自iptables启动文件/etc/sysconfig/iptables的nat表部分

REF参考

IPtables中SNAT和MASQUERADE的区别

一、SNAT与DNAT概念

IPtables中可以灵活的做各种网络地址转换(NAT),网络地址转换主要有两种:SNAT和DNAT。

SNAT是source network address  translation的缩写,即源地址目标转换。比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接到访问请求的时候,他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip,这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了,所以叫做SNAT,基于源地址的地址转换。

DNAT是destination network address translation的缩写,即目标网络地址转换,典型的应用是,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip,互联网上的访问者使用公网ip来访问这个网站,当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网ip,防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip,然后再把这个数据包发送到内网的web服务器上,这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了,即DNAT,基于目标的网络地址转换。

二、MASQUERADE概念

MASQUERADE,地址伪装,在iptables中有着和SNAT相近的效果,但也有一些区别,但使用SNAT的时候,出口ip的地址范围可以是一个,也可以是多个,例如:

如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去,

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3

如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5

这就是SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址,但是,对于SNAT,不管是几个地址,必须明确的指定要SNAT的ip,假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变,而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址,这个时候如果按照现在的方式来配置iptables就会出现问题了,因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的,每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip,这样是非常不好用的。

MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT。

比如下边的命令:

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

如此配置的话,不用指定SNAT的目标ip了,不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去,这样就实现了很好的动态SNAT地址转换。