Linux端口转向及iptables简介 [转]
BY 郭世龙
需 求:
实验室建立了一个内部的管理信息系统(B/S方式),要求实验室每个成员都能够通过网络登录信息系统,但使用该系统的实验室成员不再同一网络之中。
信息系统是工作在WinXP上的IIS Web Server;
实验室使用Suse Linux作为服务器链接Internet;
Linux使用双网卡一个用作网关,另一个用作连接外网;
Getway IP:192.68.0.1
Internet Static IP :202.11*.1*.72
Lan WinXP Static IP:192.168.0.228
PORT:8100
解决方法
将外网(或Internet)访问Linux服务器8100端口的数据转发给局域网内部Web Server服务器,即端口转向。外部IP——>202.11*.1*.72 : 8100(192.68.0.1 : 8100)——>192.168.0.228 : 8100 且外部IP<——202.11*.1*.72 : 8100(192.68.0.1 : 8100)<——192.168.0.228 : 8100。为了实现这个端口转向就必须实现网址转换(NAT)、通过主机防火墙(Firewall)而这些功能全是Linux内核的Netfilter子系统所提供的,而iptables是控管Netfilter的唯一工具。下面介绍一下使用iptables命令实现端口转向的功能的步骤(在终端上输入如下命令):
(1)iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
(2)iptables -t nat -A PREROUTING -d 202.11*.1*.72 -p tcp --dport 8100 -j DNAT --to 192.168.0.228:8100
(3)iptables -A FORWARD -d 192.168.0.228 -p tcp --dport 8100 -j ACCEPT
(4)iptables -t nat -A POSTROUTING -d 192.168.0.228 -p tcp --dport 80 -j SNAT --to 192.168.0.1
第一条规则规定允许任何地址到任何地址的确认包和关联包通过。在netfilter中,有new, established,related,invalid几种状态。当内网的一台机器访问外网时,它发送了一个请求包,这个包的状态是new,规则设置它可以通过。当外网回包的时候它的状态就是stablished, Linux知道这个包是内网的一台机器发出去的应答包,所以也可通过。而外网试图对内网发起一个新的连接的时候,它的状态是new,如果没有相关规则允许其通过Linux就会阻止它。
第二条规则是在nat表的PREROUTING链中将外网发来的目的地址为202.11*.1*.72 协议为TCP端口为8100的数据包的目的地址修改为目的地为192.168.0.228端口8100,即目的地址转换。
第三条规则是在filter表的FORWARD链中设置允许目的地址为192.168.0.228协议为TCP端口为8100的数据包通过滤表
第四条规则是在nat表的POSTROUTING链中将目的地址192.168.0.228协议为TCP端口为8100的数据包的源地址修改位192.168.0.1,即源地址转换。
自动加载
添加完成之后把当前的所有链备份一下,重起机器的时候自动加载所有的链,避免掉电之后规则丢失。
方法一:执行 iptables-save >/etc/iptables放到/etc下面名为iptables。有些系统会自动加载。
方法二:使用命令: iptables-save > /root/ iptables-script 路径和名字iptables-script可以自己规定
加载方法:修改文件 vi /etc/rc.d/rc.local最后添加如下命令:iptables-restore /root/iptables-script 保存退出 :wq。
方法三:iptables-save > /etc/sysconfig/iptables
chkconfig iptables on
方法四: service iptables save ; 把当前的rules 写到 /etc/sysconfig/iptables里
chkconfig iptables on ; 让iptables 开机时自动运行.
iptables命令简介
命令主要组成部分
为了更好的理解上面的命令下面简单介绍一下iptables命令。之所以说简单介绍是因为iptables命令手册的帮助文档有1824行并且全市英文看下来头还是有点晕的呵呵。好了言归正传,iptables主要用来在Linux内核中设置、维护和监控IP包过滤规则表。内核中定义了几个表,表包含一些内嵌的和用户定义的链。链是能够匹配一套数据包的规则链表。规则指明了怎样处理匹配的数据包。这被叫做目标。
链
主要有四个内嵌的链PREROUTING,OUTPUT,POSTROUTING,INPUT,FORWARD。
表
主要有三个独立的表:filter,nat和mangle。
filter是一个默认的表(如果不加-t参数传递表参数)。它主要包含了内嵌的链,INPUT(目的地为本地socket的数据包的控制点),FORWARD(将要通过路由表被路由的数据包的控制点),OUTPUT(本地产生的数据包的控制点)。
nat用在创建一个新的链接时。包含了三个内嵌的链,PREROUTING(只要数据包已到达就修改数据包),OUTPUT(在路由之前修改本地生成的数据包),POSTROUTING(数据将要返送出去时修改数据包)。
mangle用来修改具体的数据包。PREROUTING(只要数据包已到达就修改数据包),OUTPUT(在路由之前修改本地生成的数据包),POSTROUTING(数据将要返送出去时修改数据包),INPUT(目的地为本地socket的数据包的控制点),FORWARD(将要通过路由表被路由的数据包的控制点)。
目 标
防火墙指明了一个数据包的匹配准则和一个目标。如果包不匹配则检查链中的下一条规则。如果匹配则目标的值指定了将要检查的下一条规则,这可能是用户自定义的规则或是具体的值ACCEPT,DROP,QUEUE,RETURN。
ACCEPT允许数据包通过。
DROP丢弃数据包。
QUEUE传输数据包到用户空间。
RETURN停止当前链的检查,返回到前一条链。
其他常用的扩展目标。
DNAT,这个目标仅在nat表中的PREROUTING和OUTPUT链中有效,指明了包的目的地址应该被修改。例如链接Iternet的网卡是eth0,若要将来自Iternet的HTTP请求(TCP包、目的端口为port 80)转接到内部网络上的192.168.1.80网站服务器: iptables -t nat -A PREROUTING -i eth0 -p tcp - -dport 80 -j DNAT - -to-destination 192.168.1.80。
MASQUERADE,数据包输出网卡的端口的映射,仅在在nat表的POSTROUTING链中有效并且只能在动态IP连接中使用,如果是静态IP则使用SNAT。
NETMAP,将整个网络地址映射成另一个网络地址。 --to address[/mask]。
REJECT,通过发送链接错误包来拒绝链接,除此之外等同于DROP。
SNAT,仅在nat表中的POSTROUTING链中有效。指示包的源地址要修改。
iptables常用命令选项
-A chain rule-specification 在选定的链的尾部加入规则;
-I chain [rulenum] rule-specification 用规则号在选定的链中插入规则;(rulenum从1开始)
-L [chain] 列出所有规则 常用iptables -t nat -n -L列出规则, -n来取消域名解析加快命令速度;
-D chain rulenum 删除选定链的指定规则;
-R chain rulenum rule-specification 替换规则;
-F [chain] 删除所有规则;
-N 定义一条新的链;
-X 无参数时删除表内非内嵌链;
-P chain target 设定规则;
定义规则的参数
-p [!] protocal (tcp、udp、icmp、all) 指定协议;
-s [!] address[/mask] 指定源地址。mask是子网掩码 /24=/255.255.255.0;
-d [!] address[/mask] 指定目的地址;
-j target 如果数据包匹配则跳转到目标。
数据包具体流程
为了更好的使用iptables命令你应该清楚数据包的在表和链中的具体流程这样你才能在相应的控制点(链)设置规则。
转交(forward)数据包的流程
mangle(PREROUTING)->nat(PREROUTING)->mangle(FORWARD)->filter(FORWARD)->mangle(POSTROUTING)->nat(POSTROUTING)
网络发给本机进程的数据包流程(输入)
mangle(PREROUTING)->nat(PREROUTING))->mangle(INPUT)->filter(INPUT)
本机进程发给网络的数据包流程(输出)
mangle(OUTPUT)->nat(OUTPUT)->filter(OUTPUT)->mangle(POSTROUTING)->nat(POSTROUTING)
本机进程到另一个本机进程(本地网络)
mangle(OUTPUT)->nat(OUTPUT)->filter(OUTPUT)->filter(INPUT)->mangle(INPUT)