防火墙与NAT

55TCP  Wrappers
    /etc/host.{allow | deny}
#如果主机写进的是 allow 就是允许的,如果是 deny 就是 被拒绝的。
当收到一个数据包的时候,首先会到allow里去匹配。如果匹配成功了,就不会到 deny里面去了。
如果没有在allow里匹配成功,就会到deny中去匹配,如果在deny中匹配成功了,就是拒绝的。
如果都没有匹配成功,则是允许通过的。
 

allow  和  deny的文件格式:
     sshd:  192.168.30.10

只有支持了TCPwarppers模块的服务才可以在 /etc/hosts.{allow | deny}中设置
格式:
     这里拿telnet说明:
daemon名:  192.168.88.70

daemon名:   192.168.88.

daemon名:   .example.com
## 名字后面冒号后必须至少有一个空格
in.telnetd:  192.168.88.70
in.telnetd:  192.168.88.
in.telnetd:  example.com

如果在 allow 中 /etc/hosts.allow
 in.telnetd:  192.168.88.70: deny
#拒绝生效 ,如果在 deny 中 :allow 则匹配允许的。

in.telnetd:  192.168.88.70: spawn echo "11111" | mail -s "test" root
## spawn 表示 : 如果匹配成功 执行后面的命令。

in.telnetd:  192.168.88.70: spawn echo "%c  access  %s" mail -s "test" root
# %c表示客户端,%s表示服务端

in.telnetd:  192.168.88.70: twist echo "22222222222222222222"
# twist:用在deny中。表示匹配失败后在客户端显示的内容。


netfileter:是内核的一个功能模块。要实现这个功能,要使用不通的软件才可以。
在2.6使用的软件是 iptables:
     iptables需要设置规则,规则是从上到下,逐条匹配,如果上一条匹配成功了,就不会匹配下面的规则了。
     防火强规则---同一个服务的规则顺序很重要。
不同的服务顺序不重要,但是,同一个服务下的规则顺序非常重要。

当防火墙想要实现过滤功能的话,要调用一张表:叫做  filter表(做过滤用),哪些数据包可以过来,哪些包是不可以进来的。
     进防火墙需要调用:INPUT (外网到防火墙)
     当防火墙自身有数据包出去时,也是过滤,需要调用:OUTPUT(防火墙到外网)

     当内网主机的数据包经过防火墙与外网进行通信时,哪些数据包可以通过,哪些数据包不可以通过,或外网到内网,这个过程调用的连是:FORWARD

     NAT表:(网络地址转换)私有地址在互联网上是不能路由的,这时候就需要做NAT了。
#当内网IP访问外方的时候,在经过防火墙的时候会将源地址改变成公网的IP地址,叫做:SNAT,(源地址转换)
使用的连是:POSTROUTING

     如果从外网访问内网的WEB,源地址是 公网地址,而WEB是内网地址,当经过防火墙的时候,防火墙会判断是80端口,从而修改源地址,将源地址修改成内网的WEB地址。叫做DNAT(目的地址转换):PREROUTING连

     只要在防火墙上做了DNAT,就会将目的地址转换成私有地址,而防火墙访问自己的共有地址的时候,是不会给自己做 DNAT的
     如果外网访问内网地址的时候,防火墙会正常做DNAT的。如果防火墙访问自己的外网地址时是不会将外网共有地址转换为私有地址的。这时候就会报错。
这时候可以给防火墙加一条OUTPUT这条连
这时候在NAT里,调用了3条连,
     1、POSTROUTING:作用:源地址转换的(内网访问外网时,将内网地址转换成外网地址)
     2、PREROUTING:作用:目的地址转换(外网访问内网时,将公网地址转换成内网地址)
     3、OUTPUT :只解决一件事情:当防火墙自己访问自己的公网地址的时候,也可以转换成私有地址。


iptables  -t   filter  -A{ I , D }   INPUT{ OUTPUT , FORWARD }  {n}  -p  tcp{ udp,icmp}   {!}-s  192.168.0.0/24   { -d }   --sport  m:n  --dport  x:y  -j  ACCEPT
     1、大括号是或:-A  或  -I  或 -D  ,  n:只有 I   D  的时候有。
     2、-t:指明表:默认filter(过滤表)
     3、指明:-A :添加一条规则 ,如果是添加是在后面追加的。
            -D:删除一条规则,跟数字:删除第几条
            -I:  插入一条规则,跟数字:插入在第几条
     4、-s:源 ,前面加 叹号  表示:取反。
          如果未指定,则匹配的是所有地址。
     5、-d :目的地址:如果未指明就是防火墙自身
     6、--sport :源端口
          --sport  m:n:源端口m到n;
      7、--dport :目标端口
            --dport  x:y :目标端口 x 到 y
      8、-j :指明动作
                ACCEPT:允许
                DROP:丢弃,没有通知
                REJECT:拒绝,明确通知是拒绝对
                LOG:表示如果匹配成功则记录到日志中。


查询防火墙规则:
     iptables  -L   -n
#不指定表默认显示的是  fileter表。

     iptables   -L   -n   --line-numbers
#查看是显示行号。

     iptables  -D  INPUT   6
#删除INPUT表中的  第六条规则

     iptables  -I  INPUT  1  -p  tcp  -s  192.168.30.10  --dport  22  -j  REJECT
#拒绝指定IP主机

     iptables-save  >  iptables.bak
#备份防火墙规则

     iptables-restore  <  iptables.bak
#备份恢复防火墙规则

命令行中设置规则后,如果想要保存:
     service  iptables  save
##保存命令行中输入的规则。

指定拒绝指定的MAC地址:
     iptables -I INPUT 1 -p tcp -m mac=11:33:33:34:c3 --dport  22  REJECT
#指定的MAC地址访问时都拒绝。

这里默认的策略都是允许的 ,但是在最后一条规则 :拒绝了所有

修改INPUT表的默认策略:
   iptables -P INPUT  DROP
#只修改了INPUT表的默认策略

私有地址:
     10.0.0.0  ~  10.255.255.255
     172.16.0.0  ~  172.31.255.255
     192.168.0.0  ~  192.168.255.255

设置指定的外出数据包:
  iptables -I OUTPUT 1 -p tcp -m state -state=RELATED,ESTABLISHED --sport 22 -j  ACCEPT
#设置允许出去的数据包源端口是 22的
##如果这时,主动给外连是不能建立连接的,这条规则是:只有建立连接的22端口才可以发送出去数据包。
##如果从外建立一个连接是允许的。


NAT,DNAT,SNAT
     SNAT:源地址转换。开启转发功能:内网主机可以访问外网。
  /etc/sysctl.conf  将  net.ipv4.ip_forward = 1
#sysctl  -p  :设置的立即生效。

  iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.1.1
#当外网地址固定时设置,将10.0.0.0网段的内网地址全部转换成  192.168.1.1 
##这里只对 10.0.0.0 这个网段进行转换
#这里的  -j  表示动作: 只有 :SNAT  DNAT  2个动作。
#如果不指定 -s 就会对内网当中的所有网段都会做 SNAT 的转换。

查看是否开启转发功能:
     cat  /proc/sys/net/ipv4/ip_forward
# 1 表示转发开启。

内网与外网通信的时候,用的是FORWARD 这条连。
###这是防火墙的地址是固定的。可以直接SNAT成固定的IP地址。 也就是: 公网地址是固定的IP地址。

  iptables -t  nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
#当外网地址不是固定时设置,设置一个伪装,公网地址变成什么,就将源地址转换成什么。

DNAT:
   iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-dest  10.0.0.2
#没有指明 -d 就是表示防火墙本身,凡是指向端口 80 的,全部转发给内网的 10.0.0.2默认端口是80的。
#如果内网的端口是80 或 8080
   iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-dest 10.0.0.2:80


当防火墙自身访问内网地址的时候,是不会给自己做NAT的,它会认为访问的是自深的端口。
这时候就需要加上 OUTPUT  连。
   iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-dest 10.0.0.2




查询固定IP访问服务的进程数:
     netstat -an | grep 80 | grep 192.168.10.123 | grep EST -c
# 监听 80 端口, grep  -c :统计列数。

  iptables -I INPUT -p tcp --dport 80 -s 192.168.10.123 -m connlimit --connlimit-above  10  -j  REJECT
#192.168.10.123主机访问 本机的目标端口是80的,对访问的连接做一个限制最大只允许有10个,否则拒绝掉。


内核处理网卡:
     Hook  point?
数据包在NetFilter中的挂载点。
(PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING)


-L(显示当前规则)与 -n(禁止反向解析)经常连用
-F 清空
-P 设置一个默认的iptables的规则
-I :插入,默认的是插入到第一条

-s:发起源
-d:目标地址

iptables规则组成:
     组成部分:四张表  +  五条链(Hook  point) + 规则
四张表filer表、nat表、mangle表、raw表
     filter表: 访问控制、规则匹配  --- 常用到
     nat表:地址转发 --- 常用到
     Mangle表:修改数据包,改变包头中内容(TTL,TOS,MARK)
     raw表:做数据包状态的跟踪 和  分析。
五条链:INPUT 、 OUTPUT 、 FORWARD 、 PREROUTING 、 POSTROUTING

数据包访问控制:ACCEPT(允许通过) 、DROP(丢弃) 、REJECT(拒绝:有返回对应消息)
数据包改写(改写地址):SNAT(源地址改写) 、DNAT(目标地址改写)
信息记录:LOG

如果是本机:走INPUT链,如果通过路由转发给别的机器的,走 FORWARD链。
常用到的表:nat表,进行目的地址的转发,如果要对目的地址转发,可以在PREROUTING链中的nat表中进行修改。就会走FORWARD链


Iptables配置 -1  --- 顺序很重要,必须设置允许,然后都是拒绝的。
     1、对所有地址开放本机tcp(80、22、10-21)端口的访问
          iptables  -I  INPUT  -p  tcp  --dport  80  -j  ACCEPT
          iptables  -I  INPUT  -p  tcp   --dport   22  -j   ACCEPT
          iptables  -I  INPUT  -p  tcp   --drpot  10:21  -j  ACCEPT
     2、允许对所有的地址开放本机的基于ICMP协议的数据包反问
          ICMP(能ping通)
          iptables  -I  INPUT  -p  icmp  -j   ACCEPT
     3、其他未被允许的端口则禁止访问。
          iptables   -A   INPUT  -j  REJECT
     4、允许指定设备通过的数据包
          iptables   -I   INPUT  -i  lo  -j   ACCEPT
     #允许本机的回环网卡数据包通过。
     5、允许本机指定状态连接的数据包向外发送
          iptables  -I  INPUT  -m  state  --state  ESTABLISHED,RELATED   -j  ACCEPT
     #允许本机已经建立连接的数据包给外发。
     6、允许指定IP主机访问指定端口号
          iptables  -I  INPUT   -p  tcp  -s  192.168.10.123  --dport   80   -j   ACCEPT
     #只允许192.168.10.123主机访问本机的  80  端口。

需要注意如果通过  lo  访问本机的话,无论是网络管理,或是很多服务,如果程序部署的是webServer,都需要设置 4  。 本地给外发送数据包 5.
扫描指定IP地址的主机,是否开启了对应的端口号
     nmap  -sS   -p  0-100  192.168.10.123
#扫描192.168.10.123主机中打开的  0到100之间的端口号。


Iptables配置-2
     1、ftp主动模式下iptables的规则配置。
     2、ftp被动模式下iptables的规则配置。
被动模式只需要开放21端口就可以。
为什么默认采用被动模式:
     如果服务器处于不同网段,服务端无法主动的给这个台客户端高端口直连,


     iptables  -I   INPUT   -p  tcp   -dport  21  -j   ACDEPT
     iptables  -I   INPUT   -p  tcp   --dport  22  -j  ACCEPT
     iptables   -I  INPUT   -p  icmp   -j   ACCEPT
     iptables   -I   INPUT  -m  state  --state  ESTABLISHED,RELATED   -J   ACCEPT
     iptables   -I   INPUT  -j   ACCEPT 


被动模式;




Iptables配置-3
     要求1.员工在内部可以访问服务器上的任何服务
     要求2.出差到上海,通过v*n链接到公司。外网====拨号等====>v*n服务器===>内网FTP,SAMBA,NFS,SSH
     要求3.有个门户网站需要允许公网访问。



iptables   -I    INPUT -i  lo -j  ACCEPT
iptables  -I   INPUT  -m  state   --state  ESTABLISHED,RELATED   -j   ACCEPT 

iptables  -A  INPUT  -s  192.168.10.0/24  -j  ACCEPT
iptables  -A  INPUT  -s   192.168.11.0/24   -j   ACCEPT
##允许指定网段的主机访问

iptables  -A  INPUT  -p   tcp   --dport  80   -j   ACCEPT
#允许所有主机访问本机的 80  端口

iptables   -A  INPUT  -p   tcp   --dport   1723  -j   ACCEPT
#允许v*n访问本机端口。

iptables   -I   INPUT   -p   icmp   -j   ACCEPT
#允许ping。

iptables  -A   INPUT   -j   REJECT
#如果上面的规则都没有匹配成功,则拒绝。

iptables  -t  nat   -A   POSTROUTING  -s  192.168.100.123 -j  SNAT  --to  192.168.10.123
# 将源(内网过来的要出去的)地址:192.168.100.123转换成本机的 192.168.10.123地址。

iptables -t  nat  -A  PREROUTING -d  192.168.10.123  -p  tcp  --dport 80  -j  DNAT  --to  192.168.100.123:80
#将目标(外网要进来的)地址:192.168.10.123  转换成:192.168.100.123



SNAT:转发功能:
     iptables  -t  nat   -A   POSTROUTING  -s  192.168.100.123 -j  SNAT  --to  192.168.10.123
# 将源(内网过来的要出去的)地址:192.168.100.123转换成本机的 192.168.10.123地址。

DNAT:转发:
     iptables -t  nat  -A  PREROUTING -d  192.168.10.123  -p  tcp  --dport 80  -j  DNAT  --to  192.168.100.123:80
#将目标(外网要进来的)地址:192.168.10.123  转换成:192.168.100.123


利用iptables防CC攻击
connlimit模块
     作用:用于限制每一个客户端IP的并发连接数。
     参数:-connlimit-above  n  # n限制的并发个数
例子:
     iptables  -I  INPUT  -p  tcp -syn  -dport  80  -m connlimit  --connlimit-above 100  -j  REJECT

     iptables -I INPUT -p tcp --dport 80 -s 192.168.10.123 -m connlimit --connlimit-above 10 -j REJECT

Limit模块:
     作用:限速,控制流浪
 例子:
     iptables -A INPUT -m limit --limit  3/hour
# 允许一个小时 3个并发过来。 对并发的控制。
--limit-burst 默认值是:5 。

     iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
#只允许10个数据包通过,是允许的,如果超过10个 ,则每分钟只允许通过一个。
     iptables -A INPUT -p icmp -j DROP
#结合上一条规则:如果仍有连接过来,则直接丢弃。