一 。了解iptables组成和结构

   iptables是linux系统内嵌的防火墙  是由规则,链和表组成

 1》规则

        当网卡接受到一些数据包 或者 本机上层应用程序对外发送数据包时  需要一些规则对这些包进行处理 数据包中包含 源地址 目标地址

      源端口和目标端口,协议等数据 可以预先对这些包进行一些规则定义 定义的规则决定该数据包是否需要被 放行,拒绝,还是丢弃

2》链

       是iptables中定义的不同时期数据过滤的链  可以在不同的链中 定义不同的规则   每个链都有默认的规则

 

  • PREROUTING:数据包进入本机,进入路由器之前。可以用于目标地址转换(DNAT)。
  • INPUT:通过路由表后目的地为本机。
  • FORWARDING:通过路由表后,目的地不为本机。可以用于转发数据。
  • OUTPUT:由本机产生,向外转发。
  • POSTROUTIONG:通过路由表后,发送到网卡接口之前。可以用于转发数据(SNAT,MASQUERADE)
     

图示 如下 :

 

iptables FORWARD 过滤 iptables forward详解_服务器

   3》表(不指定表 默认表为filter表 就是用于过滤)

 

 

 


     表提供特定的功能 包含4个表 分别是raw表,filter表(包过滤),nat表(网络地址转换),mangle表 (包重构功能)


  1. filter表:主要用于数据报文过滤 用于INPUT链,RORWARD链,OUTPUT链 只能对数据接收和丢弃操作不能修改数据
  2. nat表:主要用于网络地址转换 一般存在SNAT(修改源地址),DNAT(修改目标地址),PNAT(ipv6转换) 用于PREROUTING链,POSTROUTING链,OUTPUT链。
  3. 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 -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

 

三 使用firewall

firewall进行端口转发

#注意一点要开放masquerade才能做端口转发
查看一个masquerade状态,查询命令如下:
firewall-cmd --query-masquerade
假如查到结果为no那么就启动它(加--permanent是永久)
firewall-cmd --add-masquerade --permanent



#防火墙放开端口和取消放开端口,注意修改配置后一定要reload才能生效
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=8081/tcp --permanent
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-all



#端口映射
firewall-cmd --permanent --zone=public --add-forward-port=port=8081:proto=tcp:toport=40080:toaddr=111.177.18.97
firewall-cmd --permanent --zone=public --add-forward-port=port=8080:proto=tcp:toport=8070:toaddr=10.10.0.81

firewall-cmd --permanent --zone=public --remove-forward-port=port=8081:proto=tcp:toaddr=111.177.18.97:toport=40080
firewall-cmd --permanent --zone=public --remove-forward-port=port=8080:proto=tcp:toaddr=10.10.0.81:toport=8070

firewall-cmd --reload
firewall-cmd --zone=public --list-all