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