#!/bin/sh
# SHELL脚本的的开始
PATH=/bin:/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:~/bin
#为PATH赋值
export PATH #bin path
#定义环境变量,就是可执行文件的目录的位置
#IFCONFIG=`ifonfig |send '1,d' |awk '4' -d' '9'|PRINT{ IPADD } |echo $1 `
#应该是给变量IFCONFIG赋值,感觉这句话有错误,应该是
#IFCONFIG1=`ifconfig |sed '1,d' |awk '4' -d' '9'|PRINT{ IPADD } |echo $1 `
#`ifconfig命令手输出9行如下

#|sed '1,d'|的意思是删除第一行,为空白行
#|awk '4' -d' '9'|个人理解应该是把4-9行都删除,因为2行是IPV4地址,3行是IPV6地址
#但是感觉语法错误。应该写成 |awk '4,9 d'|其实'4,9 d'是和sed和grep相似的语法结构,个人理解,没有找到响应#的手册,在AWK手册上没有找到匹配的说明,不知道'4,9 d'的d应该在什么位置
#PRINT{ IPADD }这句没有明白
#echo $1第一个变量参数,因为前面不明白,所以不知道这个参数是什么
#这个是标准的输入IP和子网掩码的句子
#ifconfig |awk 'BEGIN{RS=""} /eth0/ {print "ipadd:" substr($7,6) "\nmacadd:" $5}'#输出的结果是
#ipadd:192.168.1.11
#macadd:00:11;34:AA:A6:DA
#如果想得到仅仅是IP地址的参数,再加awk 'BEGIN {FS=":"} {print $2 }'删除子网掩码就能得到纯正的IP地址,#ifconfig |awk 'BEGIN{RS=""} /eth0/ {print "ipadd:\n" substr($7,6) "\nmacadd:" $5}'|awk 'BEGIN {FS=":"} {print $2 }'#结果是
#192.168.1.11
#00
#下面的语句的结果是
#ifconfig |awk 'BEGIN{RS=""} /eth0/ {print "ipadd:" substr($7,6) }'|awk 'BEGIN {FS=":"} {print $2 }'
#192.168.1.11
#所以就可以把IP地#址赋值给变量IPCONFIG
#IPCONFIG= ifconfig |awk 'BEGIN{RS=""} /eth0/ {print "ipadd:" substr($7,6) }'|awk 'BEGIN {FS=":"} {print $2 }'
#{IPTABLES} -t nat -A POSTROUTING -p tcp --dport 3389 -j DNAT --to $IFCONFIG
#这句话的意思是
#把从本地出去的的目的地址是3389的数据包的目的IP改成IPCONFIG的地址,这句话是典型的错误,在
#IPTABLE中postrouting不能和DNAT连用,我们想一下把出去的目的地址改成本地,那好比把邮寄地址写成自己,#这封信还能邮寄出去吗?
#{IPTABLES} -t nat -A PREROUING -s 192.168.10.0/24 -j ACCEPT
#这句话的意思是从外面进来的源地址是192.168.10.0/24网段的全部接受,但是接受了,做什么处理,怎么做
#NAT处理没有说
正确的IPTABLE的数据报的流程是这样的,先判断目的地址是不是本机器的包如果是就进去INPUT,如果不是就FORWARD了。

INET_IFACE="ppp0"
#给INET_IFACE赋值PPP0
LO_IFACE="lo"
#给LO_IFACE赋值lo
#调用模块,这些模块全是网络用到的,网络转发,网络地址过滤,数据报状态的改变等等。详细的以后给你文档
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_nat
/sbin/modprobe iptable_mangle
/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ipt_MARK
/sbin/modprobe ipt_TOS
/sbin/modprobe ipt_TCPMSS
/sbin/modprobe ipt_mark
/sbin/modprobe ipt_tos
/sbin/modprobe ipt_state
INET_IP=`ifconfig ppp0 |sed -e '1d' -e '3,$d' |awk '{print $2 }' |awk 'BEGIN {FS=":"} {print $2 }'`
#sed -e '1d' -e '3,$d'这就是把ifconfig的输出删除第一行,第三行到最后一行,就留下第二行,就是
#inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
#awk '{print $2 }'打印这行的第二个参数就是输出这些addr:192.168.1.111
#awk 'BEGIN {FS=":"} {print $2 }'
#在这里,BEGIN预置了内部变量FS(字段分隔符),分隔符号就是冒号 :
#第一个变量就成了addr
#第二个变量就是192.168.1.111
#{IPTABLES} -t nat -A PREROUTING -d ${INET_IP} -p tcp --dport 3389 -j DNAT --to-destination 192.168.10.3:3389
#这句话的意思是从外面进来的数据目的地址是本机器的,TCP包,目的端口是3389的数据包。把目的地址换成#192.168.10.3端口是3389转发出去,就不进INPUT了。就是在这处理
走这边的线路
#{IPTABLES} -A FORWARD -p tcp -d 192.168.10.3 --dport 3389 -j ACCEPT
#这句话的意思是目的地址是192.168.10.3目的端口是3389的TCP数据包全部转发的
#{IPTABLES} -t nat -I POSTROUTING -s 192.168.10.0/24 -p tcp -d 192.168.10.3 --dport 3389 -j SNAT --to 192.168.10.1
#这句话的意思从192.168.10.0/24出去的访问目的地址192.168.10.3目的端口是3389的TCP数据包,全部把源地址#换成192.168.10.1。这就不明白了,好比你从你着过的把发到北京的信件的源地址都写成你的地址,那回信也都会#回到192.168.10.1这里,。那发信笺的人根本收不到信笺,除非你再把原来的地址给人家还原回去,这不可能,
#因为你没有记录下来,
#还有一个疑问
#192.168.10.3和192.168.10.0/24本来在同一个网段,发送信笺根本不会经过网关,发送信息的原理是
#把目的地址和自己的子网掩码相与。如果和本机器的IP在同一个子网,就去查询ARP表,(也就是IP地址对应的#固化MAC地址)找到了,就把数据包发直接写上MAC地址发送出去了,如果找不到,就发个ARP请求广播包。#格式就不详细说了。包里写上目的地址但是MAC地址为FF FF FF FF FF FF,好比用大喇叭广播一遍,就是我找#张三,张三听到了回给信息,这样就可以知道张三在哪儿了,
#还有一种情况,如果不是在同一网段,就把数据发到网关,如果没有找到网关或者你没有定义网关地址,就丢弃
#该数据包
#所以认为你这样转换源地址没有意思。
check=`echo $?`
#$?是值上个执行的指令所返回的数值,这有两个重点,一就是上个执行的指令;一就是返回的值
当我们执行一些指令是。好比你执行的IPTABLES执行,这些指令都会返回一些执行后的代码。一般来说,如果成功执行了该指令,就返回数值0。如果执行命令有错,就返回错误的代码,一般用非0的数字。把返回的数值赋值给check变量
echo "$check" 显示这个check的数值
echo " ...... done" 显示脚本执行完毕
最后特别注意的是,IPTABLES的默认的规则是
设置缺省策略-设置内置链的缺省动作.
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
就是只能从机器访问外网,外网不能访问内网,除非你允许端口进来或者跳转