纠结了一天终于把这玩意搞定了,其实代码很简单,但是却走了好多弯路。但是成功的一瞬间的确有种成就的喜悦。
拓扑简化一下就是这个样了 主机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网段那条后可以远程连接,取消注释两条的任何一条都无法进行远程连接,也就是地址转换之后原来的地址依然是有效的。