分页: 1 / 1

[已解决][问题]自写nat脚本

发表于 : 2008-08-22 10:36
ghostry
感谢论坛的各位友人,感谢google。感谢我自己,感谢我老婆,问题解决了,现把代码贴出,大家随便享用。放到/bin下边,一条命令实现网关。

代码: 全选

#!/bin/bash
#文件名firewall
#此网关由狂风寞寞制作,规则比较松。
#检查用户权限
if   [   $UID   !=   "0"   ]  
  then    
            echo "不是root用户"
elif [ "$1" = "-h" ] #检查参数
then
echo "nat 联网出口 要代理的网段"
echo "    联网出口 	链接外网的网卡接口"
echo "    要代理的网段 	格式为‘192.168.15.0’"
elif [ "$1" = "" ]
then
	echo "缺少端口参数"
	echo "使用-h获取帮助"
echo "nat 联网出口 要代理的网段"
echo "    联网出口 	链接外网的网卡接口"
echo "    要代理的网段 	格式为‘192.168.15.0’"
	elif [ "$2" = "" ]
		then
		echo "缺少网段参数"
echo "使用-h获取帮助"
echo "nat 联网出口 要代理的网段"
echo "    联网出口 	链接外网的网卡接口"
echo "    要代理的网段 	格式为‘192.168.15.0’"
		else
#变量传递
		eth=$1
wangduan=$2
#开启nat
 echo 1 > /proc/sys/net/ipv4/ip_forward
#清除现有的规则
 iptables -F
 iptables -X
 iptables -t nat -F
 iptables -t nat -X
 iptables -t mangle -F
 iptables -t mangle -X
#设置为$2网段的网关。
 iptables -t nat -A POSTROUTING -s $wangduan/24 -o $eth -j MASQUERADE
###################################### Filter段开始 #####################################
#防止网络上其它计算机使用Ping命令探测本机:
 iptables -A INPUT -p icmp --icmp-type echo-request -i $eth -j DROP
#
# 防止广播包从IP代理服务器进入局域网:
 iptables -A INPUT -s 255.255.255.255 -i $eth -j DROP
 iptables -A INPUT -s 224.0.0.0/224.0.0.0 -i $eth -j DROP
 iptables -A INPUT -d 0.0.0.0 -i $eth -j DROP
# 屏蔽掉以下的TCP和UDP端口:
# iptables -A INPUT -i $eth -p udp -m udp --dport 3 -j DROP
# iptables -A INPUT -i $eth -p tcp -m tcp --dport 3 -j DROP
# iptables -A INPUT -i $eth -p tcp -m tcp --dport 111 -j DROP
# iptables -A INPUT -i $eth -p udp -m udp --dport 111 -j DROP
# iptables -A INPUT -i $eth -p udp -m udp --dport 587 -j DROP
# iptables -A INPUT -i $eth -p tcp -m tcp --dport 587 -j DROP
###################################### Filter段结束 ##################################### 
fi
以下是原问题。

代码: 全选

#!/bin/bash
#文件名firewall
#此防火墙由狂风寞寞制作,规则比较松,可以做网关(不需要的注释掉),使用前请根据实际情况设置WAN端口。
#设置WAN端口
if [ "$1" = "-h" ]
then
echo "nat 联网出口 要代理的网段"
echo "    联网出口 	链接外网的网卡接口"
echo "    要代理的网段 	格式为‘192.168.15.0’"
elif [ "$1" = "" ]
then
	echo "缺少网段参数"
	echo "使用-h获取帮助"
	elif [ "$2" = "" ]
		then
		echo "缺少网段参数"
		else
		eth=$1
wangduan=$2
#开启nat
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
#清除现有的规则
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
#设置为$2网段的网关。
sudo iptables -t nat -A POSTROUTING -s $wangduan/24 -o $eth -j MASQUERADE
###################################### Filter段开始 #####################################
#防止网络上其它计算机使用Ping命令探测本机:
sudo iptables -A INPUT -p icmp --icmp-type echo-request -i $eth -j DROP
#
# 防止广播包从IP代理服务器进入局域网:
sudo iptables -A INPUT -s 255.255.255.255 -i $eth -j DROP
sudo iptables -A INPUT -s 224.0.0.0/224.0.0.0 -i $eth -j DROP
sudo iptables -A INPUT -d 0.0.0.0 -i $eth -j DROP
# 屏蔽掉以下的TCP和UDP端口:
#sudo iptables -A INPUT -i $eth -p udp -m udp --dport 3 -j DROP
#sudo iptables -A INPUT -i $eth -p tcp -m tcp --dport 3 -j DROP
#sudo iptables -A INPUT -i $eth -p tcp -m tcp --dport 111 -j DROP
#sudo iptables -A INPUT -i $eth -p udp -m udp --dport 111 -j DROP
#sudo iptables -A INPUT -i $eth -p udp -m udp --dport 587 -j DROP
#sudo iptables -A INPUT -i $eth -p tcp -m tcp --dport 587 -j DROP
###################################### Filter段结束 ##################################### 
fi
目前出这个错误。
$ nat eth0 192.168.0.0
/home/momo/bin/nat: line 21: /proc/sys/net/ipv4/ip_forward: Permission denied
也希望大虾看看有没有不严谨的地方/[/code]

发表于 : 2008-08-22 11:35
bones7456
脚本里不应该写sudo.
执行前就判断是不是root身份,不是就退出,并给提示.

发表于 : 2008-08-22 11:59
ghostry

代码: 全选

#!/bin/bash
#文件名firewall
#此防火墙由狂风寞寞制作,规则比较松,可以做网关(不需要的注释掉),使用前请根据实际情况设置WAN端口。
#设置WAN端口
if   [   `logname`   !=   "root"   ]  
  then    
            echo "不是root用户"
echo `logname`
  
elif [ "$1" = "-h" ]
then
echo "nat 联网出口 要代理的网段"
echo "    联网出口 	链接外网的网卡接口"
echo "    要代理的网段 	格式为‘192.168.15.0’"
elif [ "$1" = "" ]
then
	echo "缺少网段参数"
	echo "使用-h获取帮助"
	elif [ "$2" = "" ]
		then
		echo "缺少网段参数"
		else
		eth=$1
wangduan=$2
#开启nat
 echo 1 > /proc/sys/net/ipv4/ip_forward
#清除现有的规则
 iptables -F
 iptables -X
 iptables -t nat -F
 iptables -t nat -X
 iptables -t mangle -F
 iptables -t mangle -X
#设置为$2网段的网关。
 iptables -t nat -A POSTROUTING -s $wangduan/24 -o $eth -j MASQUERADE
###################################### Filter段开始 #####################################
#防止网络上其它计算机使用Ping命令探测本机:
 iptables -A INPUT -p icmp --icmp-type echo-request -i $eth -j DROP
#
# 防止广播包从IP代理服务器进入局域网:
 iptables -A INPUT -s 255.255.255.255 -i $eth -j DROP
 iptables -A INPUT -s 224.0.0.0/224.0.0.0 -i $eth -j DROP
 iptables -A INPUT -d 0.0.0.0 -i $eth -j DROP
# 屏蔽掉以下的TCP和UDP端口:
# iptables -A INPUT -i $eth -p udp -m udp --dport 3 -j DROP
# iptables -A INPUT -i $eth -p tcp -m tcp --dport 3 -j DROP
# iptables -A INPUT -i $eth -p tcp -m tcp --dport 111 -j DROP
# iptables -A INPUT -i $eth -p udp -m udp --dport 111 -j DROP
# iptables -A INPUT -i $eth -p udp -m udp --dport 587 -j DROP
# iptables -A INPUT -i $eth -p tcp -m tcp --dport 587 -j DROP
###################################### Filter段结束 ##################################### 
fi
这样sudo之后还是说不是root。返回值仍然是我的用户名。 :shock: `logname`这个不行的话能用哪个呢?

发表于 : 2008-08-22 12:07
cnkilior
試試檢查環境變量:UID
我用su,UID會變成root的UID
logname 還是原用戶!
-----------------
[/code]

发表于 : 2008-08-22 14:58
ghostry
:D 谢谢,解决了。

代码: 全选

#!/bin/bash
#文件名firewall
#此防火墙由狂风寞寞制作,规则比较松,可以做网关(不需要的注释掉),使用前请根据实际情况设置WAN端口。
#设置WAN端口
if   [   $UID   !=   "0"   ]  
  then    
            echo "不是root用户"
elif [ "$1" = "-h" ]
then
echo "nat 联网出口 要代理的网段"
echo "    联网出口 	链接外网的网卡接口"
echo "    要代理的网段 	格式为‘192.168.15.0’"
elif [ "$1" = "" ]
then
	echo "缺少网段参数"
	echo "使用-h获取帮助"
	elif [ "$2" = "" ]
		then
		echo "缺少网段参数"
		else
		eth=$1
wangduan=$2
#开启nat
 echo 1 > /proc/sys/net/ipv4/ip_forward
#清除现有的规则
 iptables -F
 iptables -X
 iptables -t nat -F
 iptables -t nat -X
 iptables -t mangle -F
 iptables -t mangle -X
#设置为$2网段的网关。
 iptables -t nat -A POSTROUTING -s $wangduan/24 -o $eth -j MASQUERADE
###################################### Filter段开始 #####################################
#防止网络上其它计算机使用Ping命令探测本机:
 iptables -A INPUT -p icmp --icmp-type echo-request -i $eth -j DROP
#
# 防止广播包从IP代理服务器进入局域网:
 iptables -A INPUT -s 255.255.255.255 -i $eth -j DROP
 iptables -A INPUT -s 224.0.0.0/224.0.0.0 -i $eth -j DROP
 iptables -A INPUT -d 0.0.0.0 -i $eth -j DROP
# 屏蔽掉以下的TCP和UDP端口:
# iptables -A INPUT -i $eth -p udp -m udp --dport 3 -j DROP
# iptables -A INPUT -i $eth -p tcp -m tcp --dport 3 -j DROP
# iptables -A INPUT -i $eth -p tcp -m tcp --dport 111 -j DROP
# iptables -A INPUT -i $eth -p udp -m udp --dport 111 -j DROP
# iptables -A INPUT -i $eth -p udp -m udp --dport 587 -j DROP
# iptables -A INPUT -i $eth -p tcp -m tcp --dport 587 -j DROP
###################################### Filter段结束 ##################################### 
fi