iptables学习理解
一 。了解iptables组成和结构
iptables是linux系统内嵌的防火墙 是由规则,链和表组成
1》规则
当网卡接受到一些数据包 或者 本机上层应用程序对外发送数据包时 需要一些规则对这些包进行处理 数据包中包含 源地址 目标地址
源端口和目标端口,协议等数据 可以预先对这些包进行一些规则定义 定义的规则决定该数据包是否需要被 放行,拒绝,还是丢弃
2》链
是iptables中定义的不同时期数据过滤的链 可以在不同的链中 定义不同的规则 每个链都有默认的规则
3》表(不指定表 默认表为filter表 就是用于过滤)
- PREROUTING:数据包进入本机,进入路由器之前。可以用于目标地址转换(DNAT)。
- INPUT:通过路由表后目的地为本机。
- FORWARDING:通过路由表后,目的地不为本机。可以用于转发数据。
- OUTPUT:由本机产生,向外转发。
- POSTROUTIONG:通过路由表后,发送到网卡接口之前。可以用于转发数据(SNAT,MASQUERADE)
图示 如下 :
- filter表:主要用于数据报文过滤 用于INPUT链,RORWARD链,OUTPUT链 只能对数据接收和丢弃操作不能修改数据
- nat表:主要用于网络地址转换 一般存在SNAT(修改源地址),DNAT(修改目标地址),PNAT(ipv6转换) 用于PREROUTING链,POSTROUTING链,OUTPUT链。
- mangle表 一般用于修改报文的6个标志位(tcp的三次握手等的状态标识比如SYN)可以作用于左右的链
规则表之间的优先顺序:raw > mangle > nat > filter
二 使用iptables
常用的命令帮助
1 》使用表
-t 表名(filter|nat|mangle 若未指定,则默认使用filter表)
2 》在链上操作规则(这些命令后 必须跟上链(INPUT|PREROUTING|FORWARDING|OUTPUT|POSTROUTIONG))
-P (--policy) 定义默认策略。
-L (--list) 查看规则列表。
-A (--append) 在规则列表的最后增加规则。
-I (--insert) 在指定的位置插入规则。
-D (--delete) 从规则列表中删除规则。
-R (--replace) 替换规则列表中的某条规则。
-F (--flush) 清楚指定的规则。
-Z (--zero) 将指定链(如未指定,则认为是所有链)的所有计数器归零。
-X (--delete-chain) 删除指定用户自定义链。
3》数据包过滤匹配项
匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号,如下所示:
-i --in-interface 网络接口名 指定数据包从哪个网络接口进入。
-o --out-interface 网络接口名 指定数据包从哪个网络接口输出。
-p ---proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source 源地址或子网 指定数据包匹配的源地址
--sport 源端口号 指定数据包匹配的源端口号
-d 目标地址或子网 指定数据包匹配的目标地址
--dport 目的端口号 指定数据包匹配的目的端口号
-m --match 匹配的模块 指定数据包规则所使用的过滤模块
4》匹配后的数据包处理跳转
target/jump决定符合条件的包到何处去,语法是--jump target或-j target。
jump的目标是一个在同一个表内的链。。
target指定要对包做的操作,比如DROP和ACCEPT。不同的target有不同的结果。一些target会使包停止前进,也就是不再继续比较当前链中的其他规则或 父链中的其他规则。而另外一些target在对包做完操作之后,包还会继续和其他的规则比较,如LOG,ULOG和TOS。它们会对包进行记录,然后让包通过, 以便匹配这条链中的其他规则。有了这样的target,就可以对同一个包既改变它的TTL又改变它的TOS。有些target必须要有准确的参数(如TOS需要确定的 数值),有些就不是必须的,但如果我们想指定也可以(如日志的前缀,伪装使用的端口,等等)。
常用Target简述(该内容抄录于网络)
ACCEPT
当包满足了指定的匹配条件,就会被ACCEPT,允许包前往下一个目的地。不会再去匹配当前链中的其他规则或同一个表内的其他规则,但包还要通过其他表中的链,可能会被DROP。
DROP
当信息包与具有DROP目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为-j DROP。
若包符合条件,该target就会将target丢掉,也就是说包的生命到此结束,效果就是包被阻塞了。
在某些情况下,这个target会引起意外的结果,因为它不会向发送者返回任何信 息,也不会向路由器返回信息,这就可能会使连接的另一方的sockets因苦等回音而亡:) 解决这个问题的较 好的办法是使用REJECT target,(译者注:因为它在丢弃包的同时还会向发送者返 回一个错误信息,这样另一方就能正常结束),尤其是在阻止端口扫描工具获得更多的信息时,可以隐蔽被 过滤掉的端口等等(译者注:因为扫描工具扫描一个端口时,如果没有返回信息,一般会认为端口未打开或 被防火墙等设备过滤掉了)。还要注意如果包在子链中被DROP了,那么它在主链里也不会再继续前进,不管 是在当前的表还是在其他表里。总之,包死翘翘了。
REJECT
REJECT和DROP基本一样,区别在于它除了阻塞包之外, 还向发送者返回错误信息。target还只能用在INPUT、FORWARD、OUTPUT和它们的子链里,而且包含 REJECT的链也只能被它们调用,否则不能发挥作用。它只有一个选项,是用来控制 返回的错误信息的种类的。虽然有很多种类,但如果你有TCP/IP方面的基础知识,就很容易理解它们。
拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 范例如下:
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
RETURN
在规则中设置的RETURN目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如INPUT之类的主链,则使用该链的默认策略处理信息包。它被指定为-jump RETURN。
结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
REDIRECT
将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理或用来保护web服务器。
例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
LOG
将数据包相关信息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其它规则。
例如:
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
MASQUERADE
改写封包来源IP为防火墙的IP,可以指定port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有用。
例如:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
SNAT
改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。
例如:iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
DNAT
改写数据包包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。
例如:iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
MIRROR
镜像数据包,也就是将来源 IP与目的地IP对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。
QUEUE
中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用.......等。
MARK
将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。
例如:iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22
常用举例
>>>filter表过滤
iptables -A INPUT -p icmp -j DROP --表示不允许使用协议icmp 也就是禁止了ping
iptables --flush 清空所有的规则
iptables -P INPUT DROP --表示默认禁用所有的数据包 也就是禁用了所有的远程数据
iptables -P OUTPUT ACCEPT --表示默认允许发送数据包
iptable -A INPUT -p icmp -s 192.168.86.0 -j ACCEPT
如果input链中存在两条规则 最先被插入的规则先进行过滤
如果ACCEPT 其他的规则就不会在进行判断 直接认为 通过input链进入其他链
如果DROP 其他的规则不会进行判断 表示该数据从input链被丢弃了 不会进入其他链
如果LOG (记录日志到/var/log文件中) 会继续对下一条规则进行判断
举例 比如允许 192.168.58段ip ping当前主机 其他主机都无法ping通
iptables -A INPUT -p icmp -s 192.168.58.0/24 -j ACCEPT 58.0段ip先添加规则 优先判断 一定要加子网掩码
iptables -A INPUT -p icmp -i lo -j ACCEPT 允许当前网卡 lo 回环地址 ping通
iptables -A INOUT -p icmp -j DROP 其他都拒绝
>>>nat 路由修改
iptables -t nat --flush 清空nat规则
在当前服务器 开启tomcat 端口80 假设方法这台机器的8080端口时 需要将端口修改为 80端口能直接访问tomcat
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-ports 80 - -其中j -j REDIRECT表示跳转到80端口 --dport是 -p协议的子命令
内网机器对外发布WEB网站
内网WEB服务器IP地址为192.168.58.136,当公网客户端访问服务器(假设服务器是外网部署在外网)时,外网服务器防火墙将请求映射到内网的58.136的80端口
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.58.130:80