Skip to main content

 路由器设置 > 新闻资讯 >

第一次写iptable防火墙小记

2014-05-24 01:30 浏览:


纠结了一天终于把这玩意搞定了,其实代码很简单,但是却走了好多弯路。但是成功的一瞬间的确有种成就的喜悦。拓扑简化一下就是这个样了 主机A——linux——主机B,iptable的作用是让主机B作为adsf server,可以远程桌面,可以连外网,同时禁止访问内网资源。


从最开始就是麻烦不断,首先是linux ping主机A能通,主机B不通。然后发现是两个网卡不知怎么全绑到一个物理网卡上。上网查了一下全是做双网卡绑定的,和我这个问题还有不同。这时候忽然想起一句话,“网上找不到的问题都是SB问题”,仔细看看了下ifconfig后发现第二块网卡的mac地址是FF晕晕,看来是网卡没有识别。然后从安装盘找了个linux的驱动后搞定,果然是SB问题。


终于搞定网络问题,linux可以ping通两个主机,开始写iptable。最开始想要把INPUT OUTPUT还有FORWARD全DROP掉,然后就开必要端口之后发现了很多问题,想了想既然主机A和主机B在不同网段,根本就不用DROP,本身就不能互访……


想通之后就简单多了,先做了个地址转换让主机B能上网,然后把3389,80和443端口映射了出去,基本上就达成目的了。对于安全性,只有3389映射到外网(需求),所以这里就没有在做什么限制,仅仅是禁止主机B ssh到linux进行配置。因为主机B是要给外面的人做adsf,主要目的是禁止它访问内网资源。

其实是对于安全性的规则我还不是十分了解,能想到的也就是限制端口,希望大神指点。

  #!/bin/bash

  #这是拦截对内流量的防火墙

  ##定义变量

  in_if="eth0"

  in_ip="10.1.1.249"

  out_if="eth1"

  out_ip="192.168.0.1"

  ipt="/sbin/iptables"

  gw="10.1.0.1"

  work="192.168.0.2"

  #清空iptable

  for table in filter nat mangle raw; do

  $ipt -t $table -X

  $ipt -t $table -F

  $ipt -t $table -Z

  done

  #####开启路由转发

  CTL="/sbin/sysctl"

  $CTL -w net.ipv4.ip_forward=1

  #远程桌面映射

  $ipt -t nat -A PREROUTING -d $in_ip -p tcp --dport 3389 -j DNAT --to $work:3389

  $ipt -t nat -A POSTROUTING -d $work -p tcp --dport 3389 -j SNAT --to $in_ip

  #web映射

  $ipt -t nat -A PREROUTING -d $in_ip -p tcp --dport 80 -j DNAT --to $work:80

  $ipt -t nat -A POSTROUTING -d $work -p tcp --dport 80 -j SNAT --to $in_ip

  $ipt -t nat -A PREROUTING -d $in_ip -p tcp --dport 443 -j DNAT --to $work:443

  $ipt -t nat -A POSTROUTING -d $work -p tcp --dport 443 -j SNAT --to $in_ip

  #动态地址转换

  $ipt -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

  #禁止目标主机ssh#因为做了地址转换,感觉这几条可以注释掉了?

  $ipt -A INPUT -s $work -p tcp --dport 22 -j DROP

  $ipt -A OUTPUT -s $work -p tcp --dport 22 -j DROP

  $ipt -A OUTPUT -s $work -p tcp --dport 80 -j ACCEPT

  $ipt -A OUTPUT -s $work -p tcp --dport 443 -j ACCEPT

  #禁止连接内网

  $ipt -t nat -A PREROUTING -d 10.1.0.0/22 -j DROP

  #drop非法连接

  $ipt -A INPUT -m state --state INVALID -j DROP

  $ipt -A OUTPUT -m state --state INVALID -j DROP

  $ipt -A FORWARD -m state --state INVALID -j DROP

  #允许所有已经建立的和相关的连接

  $ipt -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

  $ipt -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

  #禁止目标主机进行远程桌面#因为做了地址转换不知道这条还有没有效果

  $ipt -t nat -A PREROUTING -s $work -p tcp --dport 3389 -j DROP

  感觉还是有不少逻辑混乱的地方,尤其是主机B做了地址转换之后,下面的规则是不是还应该写转换之前的,还是没有必要在写了?

  PS:测试了下,注释掉最后一条和前面DROP整个10网段那条后可以远程连接,取消注释两条的任何一条都无法进行远程连接,也就是地址转换之后原来的地址依然是有效的。