一个NAT+SQUID+DNAT+FORWARD+反弹式FIREWALL的例子

发表于:2007-05-26来源:作者:点击数: 标签:
[color=red:58cb1da77d]作者:白金网名:platinum(chinaunix)超超白金(白金论坛) 欢迎转载,转载请保留上述信息 ===========================================================================[/color:58cb1da77d] 以下是我自己的一个防火墙例子,对大

[color=red:58cb1da77d]作者:白金 网名:platinum(chinaunix) 超超白金(白金论坛)  
欢迎转载,转载请保留上述信息  
===========================================================================[/color:58cb1da77d]

以下是我自己的一个防火墙例子,对大家最近提出的DNAT(端口映射)的问题很有帮助

环境:
ADSL(eth0)网卡启动时不激活
内网(eth1)192.168.0.1/24
[code:1:58cb1da77d]
#! /bin/bash
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
/sbin/iptables -F -t filter
/sbin/iptables -F -t nat
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD DROP
/sbin/iptables -t nat -P PREROUTING ACCEPT
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P OUTPUT ACCEPT

# ALLOW ALL in PRIVATE NET
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A INPUT -i eth1 -j ACCEPT

# NAT
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

# DNAT RADMIN to PRIVATE in platinum.3322.org
/sbin/iptables -A PREROUTING -t nat -p tcp -s ! 192.168.0.0/24 --dport 4899 -j DNAT --to 192.168.0.2:4899
/sbin/iptables -A PREROUTING -t nat -p tcp -s ! 192.168.0.0/24 --dport 5000 -j DNAT --to 192.168.0.3:4899

# SQUID
/sbin/iptables -A PREROUTING -t nat -p tcp -s 192.168.0.0/24 --dport 80 -j DNAT --to 192.168.0.1:3128

# FORWARD edit by Platinum
/sbin/iptables -A FORWARD -p tcp --dport 21 -j ACCEPT    # FTP
/sbin/iptables -A FORWARD -p tcp --dport 22 -j ACCEPT    # SSH
/sbin/iptables -A FORWARD -p udp --dport 53 -j ACCEPT    # DNS
/sbin/iptables -A FORWARD -p tcp --dport 80 -j ACCEPT    # HTTP
/sbin/iptables -A FORWARD -p tcp --dport 443 -j ACCEPT    # HTTPS
/sbin/iptables -A FORWARD -p udp --dport 8000 -j ACCEPT   # QQ
/sbin/iptables -A FORWARD -p tcp --dport 25 -j ACCEPT    # SMTP
/sbin/iptables -A FORWARD -p tcp --dport 110 -j ACCEPT    # POP3
/sbin/iptables -A FORWARD -p tcp --dport 4899 -j ACCEPT    # RADMIN
/sbin/iptables -A FORWARD -p tcp --dport 1863 -j ACCEPT   # MSN (you must allow port 443)
/sbin/iptables -A FORWARD -p icmp -j ACCEPT
/sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# KEEP ON CONNECTIONS
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# exchange the other packets' "SOURCE" and "TARGET", and SEND it !!!
/sbin/iptables -A INPUT -j MIRROR
[/code:1:58cb1da77d]

此防火墙适用于静态IP及动态IP地址
原文请参考 http://bbs.chinaunix.net/forum/4/20040622/353019.html

 lyking 回复于:2004-06-22 23:27:26
多谢斑竹

 双眼皮的猪 回复于:2004-06-22 23:28:32
帮顶~

 yuipr 回复于:2004-06-22 23:45:06
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE 请问版主这是意思呀,
另外我想用linux做服务器,windows通过联到公网,就是最简单的那种,客户通过liunx能上网就成,顺便做一个nat就更好了,请问要如何实现呀,还望赐教.

 laixi781211 回复于:2004-06-23 08:01:22
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE 
这个就是NAT呀
再加下面一句就可以上网
echo  1 > /proc/sys/net/ipv4/ip_forward

 platinum 回复于:2004-06-23 08:38:46
楼上说的对
打开转发开关有两种方法
1、每次启动后执行echo 1 > /proc/sys/net/ipv4/ip_forward
2、vi /etc/sysctl.conf,修改net.ipv4.ip_forward的值为1,这样启动后就自动支持转发了

MASQUERADE是SNAT的特例,对动态IP地址及静态IP地址均有效

如果想了解更多东西,请参看iptables文档

 wind521 回复于:2004-06-23 09:48:29
好,帮顶

 cwmould 回复于:2004-06-23 10:52:14
楼主的工作还是蛮细致的,我的脚本跟你的差不多,
即使问候问题
ip_conntrack_ftp 
ip_nat_ftp 

这两个模块的功能是什么,我只知道当你想映射FTP时,没有它,只能打开被动方式的映射

 platinum 回复于:2004-06-23 11:02:20
第一个是透过防火墙的FTP工作方式,默认跟踪连接TCP-21的其他端口,并打开他

第二个是NAT用的,用于FIREWALL后面的机器

如果你的FTP-SERVER的端口不是21而是2121,那么需要改成
/sbin/modprobe ip_conntrack_ftp port=2121
这样,就不必为被动模式单独开辟一片高端端口并配置FTP服务(对于被动模式使用高端端口)了

 cgweb 回复于:2004-06-23 11:27:45
好!

 零二年的夏天 回复于:2004-06-23 11:57:36
白兄辛苦!:D

 llzqq 回复于:2004-06-23 12:27:13
支持,如果大家都用“反弹式”防火墙,那就热闹了。

 platinum 回复于:2004-06-23 12:38:17
每反弹一次,TTL-1,LINUX默认TTL是64,当TTL=0时,反弹会终止

当然了,热闹是肯定会热闹一阵的 :mrgreen:

 lingg2002 回复于:2004-06-23 20:14:57
关于ttl我一直有个疑问  比如我的ip包的ttl被设置为20,而我要访问的服务器位于美国,和我之间差了22个router.而每过一个R.你的ttl会减一,那么这个数据包应该属于到达不了那个服务器.
我们再平时上网的时候会不会发生这种情况?最好能够做一个试验,先把ttl设置为小一点,然后设置大一点.

 網中人 回复于:2004-06-24 01:25:38
[quote:a644b68d85="lingg2002"]关于ttl我一直有个疑问  比如我的ip包的ttl被设置为20,而我要访问的服务器位于美国,和我之间差了22个router.而每过一个R.你的ttl会减一,那么这个数据包应该属于到达不了那个服务器.
我们再平时上网的时候会不会发生..........[/quote:a644b68d85]

的確如此,
因此,一般的作業系統都會使用高一點:64 or 256 or ...
你用 ping 指令隨便從如下這些目標就看得到 ttl 值了:
localhost
default gw
external host

 lingg2002 回复于:2004-06-24 09:22:01
好像是如果R把你的ttl的值减到0会发送一个icmp包回那台发送数据包的主机的吧

 leeneeks 回复于:2004-06-24 09:47:32
如果不是模块装入, 而是编入内核的话, 默认监视端口应该怎么改变? 是不是没办法改了?

[quote:6460cf525c="platinum"]第一个是透过防火墙的FTP工作方式,默认跟踪连接TCP-21的其他端口,并打开他

第二个是NAT用的,用于FIREWALL后面的机器

如果你的FTP-SERVER的端口不是21而是2121,那么需要改成
/sbin/modprobe ip_conntrack_..........[/quote:6460cf525c]

 lingg2002 回复于:2004-06-24 09:56:16
先把模块卸载 rmmod

 twisters 回复于:2004-06-24 10:25:22
看不明白“反弹”是在哪里。
“反弹”体现在哪行代码呢??

 llzqq 回复于:2004-06-24 10:26:00
最后的那行

 lingg2002 回复于:2004-06-24 10:39:22
-j mirror  交换ip里面的源和目的地址

 root_wxt 回复于:2004-06-24 13:42:14
不要用镜像
没什么好处,就是最后一行的那句!

 JohnBull 回复于:2004-06-24 14:32:55
[quote:b8de9c3289="網中人"]

的確如此,
因此,一般的作業系統都會使用高一點:64 or 256 or ...
你用 ping 指令隨便從如下這些目標就看得到 ttl 值了:
localhost
default gw
external host[/quote:b8de9c3289]

查看你的TTL值:
cat /proc/sys/net/ipv4/ip_default_ttl

 lingg2002 回复于:2004-06-24 14:35:49
[quote:9a566bfe29]
網中人 写到: 


的確如此, 
因此,一般的作業系統都會使用高一點:64 or 256 or ... 
你用 ping 指令隨便從如下這些目標就看得到 ttl 值了: 
localhost 
default gw 
external host 


查看你的TTL值: 
cat /proc/sys/net/ipv4/ip_default_ttl
[/quote:9a566bfe29]
这个我知道.我只是想知道如故你的ttl太小而访问不了网站,那么你的ie上面会怎么显示.

 lingg2002 回复于:2004-06-24 14:47:41
好像现在有些网站的ttl会随访问者动态改变.
我现在ping 61.172.201.228在浙江和北京返回的ttl都是50
(ping 可以用i指定你的ttl)
然后ping 61.172.201.228 -i 12(设置我的ttl)返回的是Reply from 202.109.0.174(在这个R被丢弃): TTL expired in transit.
在北京Reply from 202.109.0.174(在这个R被丢弃): TTL expired in transit.
而在浙江用i13的话就正常了。但是北京的话就不行了.
就是说浙江和北京到61.172.201.228之间的Router数量是不通的.
但是我们看到返回的数据包的ttl确实相同的.
也就是说我这里到61.172.201.228 是13个R.
在北京这个i的值还要大一点。那么为什么返回到机器的ttl都是50阿

 bigbigbig 回复于:2004-06-24 14:50:24
[quote:b2f7a9b5f0="platinum"]# ALLOW ALL in PRIVATE NET 
/sbin/iptables -A INPUT -i lo -j ACCEPT 
/sbin/iptables -A INPUT -i eth1 -j ACCEPT[/quote:b2f7a9b5f0]

想问一下这两句有什末用呢??不加可以吗?查了一下书,说是打开网络接口~感觉说得比较抽象~~~

请教高手~ :em06:

 lingg2002 回复于:2004-06-24 14:53:18
如果没有的话.你内部的数据包就有可能出不去.
也要一条一条的去匹配下面的规则了.

 给个理由先 回复于:2004-06-24 15:13:30
今天见了一个时尚杂志名子就叫<白金.platinum> 8) 
是不是板主家办的呀,呵呵! :mrgreen:

 zerohv 回复于:2004-06-24 15:58:05
[quote:19164122c8="platinum"]第一个是透过防火墙的FTP工作方式,默认跟踪连接TCP-21的其他端口,并打开他

第二个是NAT用的,用于FIREWALL后面的机器

如果你的FTP-SERVER的端口不是21而是2121,那么需要改成
/sbin/modprobe ip_conntrack_..........[/quote:19164122c8]

如果我有多个ftp服务器,多个端口要转换,怎么设?端口用逗号隔开?还是新写一条?

 lingg2002 回复于:2004-06-24 19:07:13
[quote:72a2e8aa71]
好像现在有些网站的ttl会随访问者动态改变. 
我现在ping 61.172.201.228在浙江和北京返回的ttl都是50 
(ping 可以用i指定你的ttl) 
然后ping 61.172.201.228 -i 12(设置我的ttl)返回的是Reply from 202.109.0.174(在这个R被丢弃): TTL expired in transit. 
在北京Reply from 202.109.0.174(在这个R被丢弃): TTL expired in transit. 
而在浙江用i13的话就正常了。但是北京的话就不行了. 
就是说浙江和北京到61.172.201.228之间的Router数量是不通的. 
但是我们看到返回的数据包的ttl确实相同的. 
也就是说我这里到61.172.201.228 是13个R. 
在北京这个i的值还要大一点。那么为什么返回到机器的ttl都是50阿
[/quote:72a2e8aa71]

那位老大知道

 platinum 回复于:2004-06-24 20:31:40
[quote:5325b3617b="zerohv"]

如果我有多个ftp服务器,多个端口要转换,怎么设?端口用逗号隔开?还是新写一条?[/quote:5325b3617b]
/sbin/modprobe ip_conntrack_ftp port=21,2121,xxxx

 hiandy 回复于:2004-06-25 22:57:34
内网(eth1)192.168.0.1/24 

是什么意思?
是水是指: 192.168.0.1 一直到 192.168.0.24啊?

 zch4202403 回复于:2004-06-26 08:04:34
[quote:b5031637f6="hiandy"]内网(eth1)192.168.0.1/24 

是什么意思?
是水是指: 192.168.0.1 一直到 192.168.0.24啊?[/quote:b5031637f6]
是指:192.168.0.1----192.168.0.255 NETMASK255.255.255.0 :em02:

 platinum 回复于:2004-06-26 10:05:05
[quote:e4735bf198="hiandy"]内网(eth1)192.168.0.1/24 

是什么意思?
是水是指: 192.168.0.1 一直到 192.168.0.24啊?[/quote:e4735bf198]
代表服务器的内网地址是192.168.0.1
它所在的网段是一个标准C
即netmask 255.255.255.0
其网段有效地址为192.168.0.1-192.168.0.254

 linuxloveu 回复于:2004-06-27 15:21:08
如何在RH 9。0中设置TTL!!!

 lingg2002 回复于:2004-06-27 18:44:09
[quote:34fddddb85]如何在RH 9。0中设置TTL!!![/quote:34fddddb85]
vi /etc/sysctl.conf 

# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

net.ipv4.ip_default_ttl=90
....

然后service network restart

 haiyan105 回复于:2004-06-27 23:39:10
楼主::我把你的iptable 脚本用在我的linux上也不以正确的解析出DNS。
能请你帮我喋看看我的问题吗?《请教为什么我的iptable与squid 不能实现透明代理?????》。先谢谢你!!!

 platinum 回复于:2004-06-28 02:13:10
[quote:ff70d027ac="haiyan105"]楼主::我把你的iptable 脚本用在我的linux上也不以正确的解析出DNS。
能请你帮我喋看看我的问题吗?《请教为什么我的iptable与squid 不能实现透明代理?????》。先谢谢你!!![/quote:ff70d027ac]
首先,你的环境未必和我一样
其次,你的CLIENT的DNS未必设置正确
再次,你的/etc/resolv.conf是否设置了我也不知道

 winfox 回复于:2004-06-28 11:45:03
多谢!

 firer2000 回复于:2004-07-02 20:25:33
这个反弹到底有什么作用啊?

 llzqq 回复于:2004-07-02 20:49:41
[quote:5ac41f386b="firer2000"]这个反弹到底有什么作用啊?[/quote:5ac41f386b]

我的理解是:你想踢我一脚,结果把自己给踢了。

 点击鼠标 回复于:2004-07-02 22:14:08
test

 lyking 回复于:2004-07-02 22:18:18
楼主,有个问题。这种反弹式防火墙有可能被攻击者利用,比如攻击者产生特殊的数据包,把源地址写成真正要攻击的目标,这样看上去好像是防火墙在攻击目标。

 platinum 回复于:2004-07-03 00:38:49
没做过试验
不过理论上确实可行,那种不需要经过三次握手的攻击,确实可以

 zhoulm 回复于:2004-08-20 15:56:52
多谢斑竹,今天看到了您的这个帖子,解决了我的一个问题,就是被动式ftp工作模式时的连接问题。
就觉得iptables应该能实现类似于pix里面的fixup protocol ftp 21

谢谢!!

 andyliu 回复于:2004-10-11 17:09:21
对于反弹的意义不是太明白 :cry:

原文转自:http://www.ltesting.net