iptables复习记忆
inner_net="10.0.0.0/8,192.168.0.0/16"
int_if="eth0"
ext_if="eth1"
一、基本
1、表和链
表(tables)
包括:filter,nat,mangle表
链(chains)
预设的链有5个,可以新增加链
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
2、内核模块分别是
# lsmod |grep iptable
iptable_mangle 3349 1
iptable_nat 6158 1
iptable_filter 2793 1
ip_tables 17831 3 iptable_mangle,iptable_nat,iptable_filter
总结
Mangle表包含所有的链
OUTPUT链在被所有表包含
Filter表只包含INPUT、FORWARD、OUTPUT
二、常用匹配
1、协议匹配
-A INPUT -p tcp
# -p ! tcp 排除tcp以外的udp、icmp。-p all所有类型
#6版本为! -p tcp
2、匹配网网卡
-i --in-interface
-A INPUT -i eth0 # 匹配封包是从eth0网卡进入
-o, --out-interface
-A FORWARD -o eth+ # 匹配封包是从eth+网卡送出,eth+表示所有eth开头的网卡
3、IP地址匹配
-s, --src, --source
-A INPUT -s 192.168.1.1 #基于匹配封包的来源IP
#-s ! 192.168.0.0/24 ! 反向匹配 6版本为! -s
-d, --dst, --destination
-A INPUT -d 192.168.1.1 #基于匹配封包的目的IP
网段
-A INPUT -p tcp -s 192.168.0.0/16 --dport 22 -j ACCEPT
4、端口匹配
需要注意包的协议是TCP 需要-p tcp
--sport, --source-port
-A INPUT --sport 80 -j ACCEPT #基于匹配封包的来源端口
--destination-port
-A INPUT --dport 80 -j ACCEPT #基于匹配封包的目的端口
连续端口
-A OUTPUT -p tcp --sport 1024:65535 -j ACCEPT
非连续端口
-A INPUT -p tcp -m multiport --source-port 22,53,80,110
5、包的状态匹配
显式匹配必须用-m或--match装载,比如要使用状态匹配就必须使用-m state,匹配多个不连续端口-m multiport
-t filter -A INPUT -p tcp -s 50.23.109.164 --dport 9102 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
-t filter -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT #出去
指定要匹配包的的状态,当前有4种状态可用:NEW,RELATED,ESTABLISHED和INVALID.
NEW:表示包将要或已经开始建立一个新的连接,或者是这个包和一个还没有在两端都有数据发送的连接有关。
RELATED:说明包正在建立一个新的连接,这个连接是和一个已建立的连接相关的。
比如,FTP data transfer(管理端口验证后需要开启数据端口传输数据),ICMP error 和一个TCP或UDP连接相关。
ESTABLISHED:意思是包是完全有效的,而且属于一个已建立的连接,这个连接的两端都已经有数据发送。
注意:NEW状态并不在试图建立新连接的TCP包里寻找SYN标记,
因此它不应该不加修改地用在只有一个防火墙或在不同的防火墙之间没有启用负载平衡的地方。
INVALID意味着这个包没有已知的流或连接与之关联,也可能是它包含的数据或包头有问题。
5、包的mac地址匹配
--mac-source
-A INPUT -m mac --mac-source 00:00:00:00:00:01
6、tcp-flags【未用到】
-p tcp --tcp-flags SYN,FIN,ACK SYN #阻止所有没有经过你系统授权的TCP连接
表示匹配那些SYN标记被设置而FIN和ACK标记没有设置的包,注意各标记之间只有一个逗号而没有空格。
匹配指定的TCP标记。有两个参数,它们都是列表,列表内部用英文的逗号作分隔符,这两个列表之间用空格分开。
第一个参数指定我们要检查的标记(作用就象掩码),第二个参数指定“在第一个列表中出现过的且必须被设为1(即状态是打开的)的”标记(第一个列表中其他的标记必须置0)。
也就是说,第一个参数提供检查范围,第二个参数提供被设置的条件(就是哪些位置1)。
这个匹配操作可以识别以下标记:SYN, ACK,FIN,RST ,URG,PSH。另外还有两个词也可使用,就是ALL和NONE。
顾名思义,ALL是指选定所有的标记,NONE是指未选定任何标记。这个匹配也可在参数前加英文的感叹号表示取反。例如:
1)、iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 表示匹配那些SYN标记被设置而FIN和ACK标记没有设置的包,注意各标记之间只有一个逗号而没有空格。
2)、--tcp-flags ALL NONE 匹配所有标记都未置1的包。
3)、iptables -p tcp --tcp-flags ! SYN,FIN,ACK SYN表示匹配那些FIN和ACK标记被设置而SYN标记没有设置的包,注意和例1比较一下。
4)、-t filter -A INPUT -i eth0 -p tcp --syn -j DROP # 阻止所有没有经过你系统授权的TCP连接
ipchains时代的遗留物,之所以还保留它,是为了向后兼容。
它匹配那些SYN标记被设置而 ACK和RST标记没有设置的包,这和iptables -p tcp --tcp-flags SYN,RST,ACK SYN 的作用毫无二样。
6、--limit --limit-burst限制 【不知道数字标准,不要使用】
这个匹配操作必须由-m limit明确指定才能使用。有了它的帮助,就可以对指定的规则的日志数量加以限制
-A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT # IP包流量限制
--limit设置最大平均匹配速率,也就是单位时间内limit match可以匹配几个包。它的形式是一个数值加一个时间单位,可以是/second /minute /hour /day 。默认值是每小时3次(用户
角度),即3/hour ,也就是每20分钟一次(iptables角度)
--limit-burst定义的是--limit的峰值,就是在单位时间(这个时间由上面的--limit指定)内最多可匹配几个包(由此可见,--limit-burst的值要比--limit的大)。默认值是5。为了观
察它是如何工作的,你可以启动“只有一条规则的脚本”Limit- match.txt,然后用不同的时间间隔、发送不同数量的ping数据包。这样,通过返回的 echo replies就可以看出其工作方式
了。
7、其他
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m recent --update --seconds 5 --hitcount 20 --rttl --name WEB --rsource -j DROP # 可防御cc攻击(未测试)
三、常用动作
1、添加
-A
2、删除
iptables -t filter -nL --line-numbe #查看编号
-D INPUT 8 # 从某个规则链中删除一条规则根据编号
-D INPUT --dport 80 -j DROP # 从某个规则链中删除一条规则
3、替换
-R INPUT 8 -s 192.168.0.1 -j DROP # 取代现行规则
4、插入
-I INPUT 8 --dport 80 -j ACCEPT # 插入一条规则 编号前插入
四、常用icmp
-t filter -A INPUT -p icmp -s $inner_net --icmp-type 8 -j ACCEPT
-t filter -A INPUT -p icmp -s $inner_net --icmp-type 0 -j ACCEPT
-t filter -A OUTPUT -p icmp -d $inner_net --icmp-type 0 -j ACCEPT
-t filter -A OUTPUT -p icmp -d $inner_net --icmp-type 8 -j ACCEPT
所有eth网卡都可以ping
-t filter -A INPUT -i eth+ -p icmp -m icmp --icmp-type 0 -j ACCEPT
-t filter -A INPUT -i eth+ -p icmp -m icmp --icmp-type 8 -j ACCEPT
-t filter -A OUTPUT -i eth+ -p icmp -m icmp --icmp-type 0 -j ACCEPT
-t filter -A OUTPUT -i eth+ -p icmp -m icmp --icmp-type 8 -j ACCEPT
icmp的类型
0 Echo request——回显请求(Ping请求)
8 Echo Reply——回显应答(Ping应答)
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP # 禁止icmp类型
-A INPUT -i eth0 -p icmp -j DROP # 禁止icmp协议
五、提供服务 Server
tcp
service name:SSH/Telnet/Http/Https/Squid/FTP/DNS/Samba/NFS/SMTP/POP3/POP3S/IMAP/IMAPS/LDAP/Mysql/Sql Server/rsync/iscsi/pptp
port: 22/23/80/443/8080/20:21/53/137:139 445/固定端口/25/110 995/143 993/389/3306/1433/873/3260/1723
DNS tcp53端口是server和server之间通讯
udp:
service name:ntp/dhcp/rsyslog/snmp
port:123/67:68/514/161
备注
1、日志可以改成tcp
2、dhcp
dhcp client使用udp68端口请求
dhcp server使用udp67端口回应
1、详细的服务
针对网段
#allow inner connect sshd
-t filter -A INPUT -p tcp -s $inner_net --dport 22 -j ACCEPT
-t filter -A OUTPUT -p tcp -d $inner_net --sport 22 -j ACCEPT
针对网卡
#allow inner connect http
-t filter -A INPUT -p tcp -i ${ext_if} --dport 80 -j ACCEPT
-t filter -A OUTPUT -p tcp -i ${ext_if} --sport 80 -j ACCEPT
#DNS
-t filter -A INPUT -p udp -i ${ext_if} --dport 53 -j ACCEPT
-t filter -A OUTPUT -p udp -i ${ext_if} --sport 53 -j ACCEPT
#DHCP
-t filter -A INPUT -p udp -s $inner_net --dport 67 -j ACCEPT
-t filter -A OUTPUT -p udp -s $inner_net --sport 67 -j ACCEPT
或者
-t filter -A INPUT -p udp -s $inner_net --sport 68 -j ACCEPT
-t filter -A OUTPUT -p udp -s $inner_net --dport 68 -j ACCEPT
2、特殊的服务ftp
注意点:加载模块 主动被动模式
1)、加载模块
如果使用shell脚本配置需:
modprobe ip_conntrack_ftp
如果使用配置文件配置需修改配置文件:
# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_conntrack_ftp"
2)、模式
21控制,20数据
模式是站在client立场来说的
主动模式:client随机选择一个tcp端口连接FTP服务器的21端口请求建立连接,当需要传输数据时,client通过控制连接用一个port command告诉服务端另外一个随机接受数据传输的端口
,【服务器用TCP20端口】和client通知的接受数据的端口建立数据连接
被动动模式:client随机选择一个tcp端口连接FTP服务器的21端口请求建立连接,当需要传输数据时,client通过控制连接用一个PASV command给服务器要求进入被动传输模式,
【服务器随机选择一个TCP端口】,并用控制连接告诉client,client用来另一个TCP端口连接刚才服务器指定的TCP端口来建立数据通道。
主动服务端固定端口21,20,客户端随机,建立数据参数点在服务端
被动服务端21固定,数据传输端口随机,客户端随机,建立数据传输点在客户端
ftp client规则
-A OUTPUT -p tcp -d 50.23.109.174 --dport 21 -j ACCEPT
#-A OUTPUT -p tcp -d 50.23.109.174 --dport 20 -j ACCEPT
-A OUTPUT -p tcp -d 50.23.109.174 --sport 1024:65535 -j ACCEPT
-A INPUT -p tcp -s 50.23.109.174 -m state --state ESTABLISHED,RELATED -j ACCEPT
ftp server规则
-t filter -A INPUT -p tcp --dport 21 -j ACCEPT
-A OUTPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
被动模式数据可以传输出去因为 --state RELATED
我线上配置的ftp服务器为被动模式,所以,其实client OUTPUT不是访问服务端20端口,而是访问随机端口,所以client OUTPUT有规则
-A OUTPUT -p tcp -d 50.23.109.174 --sport 1024:65535 -j ACCEPT
vsftpd默认为被动模式
pasv_enable
Set to NO if you want to disallow the PASV method of obtaining a data connection.
Default: YES
拉数据的时候也可以看到随机端口
[root@backup ~]# netstat -antlp |grep ftp
tcp 0 0 50.23.109.164:49072 0.0.0.0:* LISTEN 21838/vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 7163/vsftpd
tcp 0 771840 50.23.109.164:49072 180.175.188.190:33813 ESTABLISHED 21840/vsftpd
tcp 0 0 50.23.109.164:21 180.175.188.190:33812 ESTABLISHED 21838/vsftpd
六、访问常见的服务 client
1、client都通过内网访问自己的ssh,dns,ntp,dhcp服务器
#ssh client,dns client,ntp client,dhcp client
#ssh client
$iptab -t filter -A OUTPUT -p tcp -d $inner_net --dport 22 -j ACCEPT
$iptab -t filter -A INPUT -p tcp -s $inner_net --sport 22 -j ACCEPT
#dns client 协议udp #server到server使用tcp 53
$iptab -t filter -A OUTPUT -p udp -d $inner_net --dport 53 -j ACCEPT
$iptab -t filter -A INPUT -p udp -s $inner_net --sport 53 -j ACCEPT
#ntp client 协议udp
$iptab -t filter -A OUTPUT -p udp -d $inner_net --dport 123 -j ACCEPT
$iptab -t filter -A INPUT -p udp -s $inner_net --sport 123 -j ACCEPT
#dhcp client 协议udp
-t filter -A OUTPUT -p udp -s $inner_net --dport 67 -j ACCEPT
-t filter -A INPUT -p udp -s $inner_net --sport 67 -j ACCEPT
2、安装软件需求
#allow to Internet 80 443 and 20 21 port
#如果没有内网的源,没有使用代理,需要使用外网
$iptab -t filter -A OUTPUT -o $ext_if -p tcp --dport 20 -j ACCEPT
$iptab -t filter -A INPUT -i $ext_if -p udp --sport 20 -j ACCEPT
$iptab -t filter -A OUTPUT -o $ext_if -p tcp --dport 21 -j ACCEPT
$iptab -t filter -A INPUT -i $ext_if -p udp --sport 21-j ACCEPT
$iptab -t filter -A OUTPUT -o $ext_if -p tcp --dport 80 -j ACCEPT
$iptab -t filter -A INPUT -i $ext_if -p udp --sport 80 -j ACCEPT
$iptab -t filter -A OUTPUT -o $ext_if -p tcp --dport 443 -j ACCEPT
$iptab -t filter -A INPUT -i $ext_if -p udp --sport 443 -j ACCEPT
3、稍微宽松的规则,打开出去的规则,进来的包的状态为ESTABLISHED,RELATED才容许通过
#client出去不限制,出去建立起连接后的所有包都容许通过
$iptab -t filter -A OUTPUT -o $ext_if -j ACCEPT
$iptab -t filter -A INPUT -i $ext_if -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
七、当数据库包的目标地址是本机时 数据包通过的原理
和七构成了提供服务(如http)的数据包的流人流出原理,掌握清楚就可以配置常用filter表防火墙规则
(1)数据包进入网络接口
(2)进入mangle表的PREROUTING链,在这里可以根据需要改变数据包头内容(比如数据包TTL值)
(3)进入nat表的PREROUTING链,在这里可以根据需要做DNAT(目标地址转换)
(4)进行路由判断(进入本地还是转发)
(5)进入mangle表的INPUT链,在路由之后达到本地程序之前修改数据包头的内容。【目标地址是本地】
(6)进入filter表的INPUT链, 所有目的地址是本机的数据包都会经过这里,不管从那里来的,所以在这里可以对进入的数据包的过滤条件进行设置。【过滤】
(7)到达本地应用程序处理数据包
不修改包头,不NAT,目标地址为本机的数据流向如下:
网卡-->>mangle表的PREROUTING链[不做处理]-->>nat表的PREROUTING链[不做处理]-->>路由判断[选择本机]-->>mangle表的INPUT链[不做处理]-->>filter表的INPUT链[过滤规则]-->>本地
应用程序
八、当数据库包的源地址是本机时 数据包通过的原理
(1)本地应用程序产生数据包
(2)路由判断 【注意多网络环境】
(3)进入mangle表的OUTPUT链,在这里可以根据需要修改数据包头的内容
(4)进入NAT表的OUTPUT链,在这里可以根据需要做DNAT(没见到过在这里操作的规则)
(5)进入filter表的OUTPUT链,在这里可以对数据包的过滤条件进行设置【过滤】
(6)进入mangle表的POSTROUTING链,在这里可以根据需要做DNAT(没见到过在这里操作的规则),数据包离开本机之前修改数据包头内容,
有两种数据包会经过这里,本机程序产生的数据包和被转发的数据包。
(7)进入nat表的POSTROUTING链,在这里对数据包做SNAT(源头)。(有两种数据包会经过这里,本机程序产生的数据包和被转发的数据包)
(8)离开本地
不修改包头,不NAT源地址为本机的数据流向如下:
本地应用程序-->>路由判断-->>mangle表的OUTPUT链[不做处理]-->> NAT表的OUTPUT链[不做处理]-->>filter表的OUTPUT链[过滤]-->>mangle表的POSTROUTING链[不做处理]-->>nat表的
POSTROUTING链[不做处理]-->>通过网卡离开本地
九、经由本地转发的数据包 数据包通过的原理
(1)数据包进入网络接口
(2)进入mangle表的PREROUTING链,在这里可以根据需要改变数据包头内容(比如数据包TTL值)
(3)进入nat表的PREROUTING链,在这里可以根据需要做DNAT(目标地址转换)
(4)进行路由判断(进入本地还是转发)
(5)进入mangle表的FORWARD链,在这里可以根据需要修改数据包头的内容 【目标地址是其他】
(6)进入filter表的FORWARD链,只有需要转发的数据包才会到达和经过这里,并且针对这些数据包的所有过滤也在这里。【目标地址是其他的数据包,过滤】
(7)进入mangle表的POSTROUTING链,数据包离开本机之前修改数据包头内容.(有两种数据包会经过这里,本机程序产生的数据包和被转发的数据包)
(8)进入nat表的POSTROUTING链,在这里对数据包做SNAT(源头),MASQUERADE.(有两种数据包会经过这里,本机程序产生的数据包和被转发的数据包)
(9)离开本地
简单总结七八九
1、进入包
任何包进入都会通过mangle表的PREROUTING链,nat表的PREROUTING链,和路由选择
1)DNAT,REDIRECT
DNAT,REDIRECT在nat表的PREROUTING
2)过滤
所有进入包(进入本地)在 [filter表的INPUT链] 过滤
2、出去包
任何包出去都会通过mangle表的POSTROUTING链,nat表的POSTROUTING链
1)SNAT,MASQUERADE
SNAT,MASQUERADE在nat表的POSTROUTING链
2)过滤
本地出去包在 [filter表的OUTPUT链] 过滤
经本地转发包在 [filter表的FORWARD链] 过滤
所有包过滤都在filter表,INPUT[到本地],OUTPUT[本地出去],FORWARD[经由本地转发]
十、NAT常见应用
modprobe ip_nat_ftp
iptables -t nat -nL #查看
PREROUTING 包进来时操作。包括SNAT,
<一>SNAT 应用
1、 通过vpn上网
详细可以参考:http://www.cnblogs.com/sixiweb/archive/2012/11/20/2778732.html
#美国VPS只有一张网卡eth0
#VPN拨号后的后的IP网段为192.168.0.0/24
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -t filter -A INPUT -p gre -j ACCEPT
/sbin/iptables -t filter -A INPUT -p tcp --dport 1723 -j ACCEPT
/sbin/iptables -t filter -A FORWARD -s 192.168.0.0/24 -o eth0 -j ACCEPT
/sbin/iptables -t filter -A FORWARD -d 192.168.0.0/24 -i eth0 -j ACCEPT
/sbin/iptables -t filter -I FORWARD -p tcp --syn -i ppp+ -j TCPMSS --set-mss 1356
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
#mss是在TCP连接建立开始时,通过带有syn标志的IP数据包进行传输的,所以我们在iptables里面规定,在转发数据时,
只要发现产生于ppt*的带有syn标志数据包时,将其mss设定为1356字节
#http://hi.baidu.com/gvmfexzehygpqze/item/dcae158f8305365d840fabc9
注意点:
(1)、这里只有伪装,没有SNAT,因为VPN拨号动态获得IP
(2)、VPN用到GRE协议
(3)、过滤在filter表FORWARD链
(4)、mss优化
2、网关-内网转发
iptables所在服务器有两张网卡,有一张外网网卡可以上网,局域网将使用这台作为网关上网
eth0内网,eth1外网
局域网网段:10.0.0.0/8
服务端
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -t filter -A INPUT -s 10.0.0.0/8 -j ACCEPT 转发的根本没有到filter表的INPUT链
iptables -t filter -A FORWARD -s 10.0.0.0/8 -o eth1 -j ACCEPT
iptables -t filter -A FORWARD -d 10.0.0.0/8 -i eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -s 10.0.0.0/8 -j SNAT --to 202.102.32.156
局域网的内服务器需要将网关IP指向这台服务器内网IP
route add default gw 10.0.0.254
nat表POSTROUTING链SNAT的用法
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
指定源地址和端口,有以下几种方式:
1、单独的地址。
2、一段连续的地址,用连字符分隔,如194.236.50.155-194.236.50.160,这样可以实现负载平衡。每个流会被随机分配一个IP,但对于同一个流使用的是同一个IP。
3、在指定-p tcp 或 -p udp的前提下,可以指定源端口的范围,如194.236.50.155:1024-32000,这样包的源端口就被限制在1024-32000了。
注意,如果可能,iptables总是想避免任何的端口变更,换句话说,它总是尽力使用建立连接时所用的端口。但是如果两台机子使用相同的源端口,iptables 将会把他们的其中之一映射到
另外的一个端口。如果没有指定端口范围, 所有的在512以内的源端口会被映射到512以内的另一个端口,512和1023之间的将会被映射到 1024内,其他的将会被映射到大于或对于1024的端
口,也就是说是同范围映射。还要注意,这种映射和目的端口无关。因此,如果客户想和防火墙外的HTTP服务器联系,它是不会被映射到FTP control所用的端口的。
iptables -t nat -A PREROUTING -d 192.168.10.158 -p tcp --dport 9999 -j DNAT --to 10.10.20.55:22
根据mac控制局域网用户上网
http://netsecurity.51cto.com/art/201005/202340.htm
4)代理服务器 squid+iptabels实现 端口重定向
iptables所在服务器有两张网卡,有一张外网网卡可以上网,局域网将使用这台作为网关上网
eth0内网,eth1外网
局域网网段:10.0.0.0/8
服务器已经搭建了squid的透明代理服务,服务使用8080端口
服务器iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i eth0 -s 10.0.0.0/8 --dport 80 -j REDIRECT --to-ports 8080
局域网的内服务器需要将网关IP指向这台服务器内网IP
route add default gw 10.0.0.254
原理:
1、LAN client请求任何站点的80端口到网关
2、网关iptables REDIRECT 到8080
3、squid代理出去访问外网
这个SNAT的区别为squid代替iptables的转发
MASQUERAD和SNAT target区别
MASQUERADE
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
在指定TCP或UDP的前提下,设置外出包能使用的端口,方式是单个端口,如--to-ports 1025,或者是端口范围,如--to- ports 1024-3000。注意,在指定范围时要使用连字号
SNAT
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
MASQUERADE和SNAT target的作用是一样的,区别就是它不需要指定--to-source 。
MASQUERADE是被专门设计用于那些动态获取IP地址的连接的,比如,拨号上网、DHCP连接等。如果你有固定的IP地址,还是用SNAT target吧
<二>DNAT 应用
DNAT单独貌似无法应用,要和SNAT一起才能组成DMZ的端口映射
# 把外网的服务映射到内网服务器
echo 1 > /proc/sys/net/ipv4/ip_forward
route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.0.0.254 # 内网需要添加默认网关,并且网关开启转发
#PREROUTING chain
$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $HTTP_IP --dport 80 -j DNAT --to-destination $DMZ_HTTP_IP
$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $DNS_IP --dport 53 -j DNAT --to-destination $DMZ_DNS_IP
$IPTABLES -t nat -A PREROUTING -p UDP -i $INET_IFACE -d $DNS_IP --dport 53 -j DNAT --to-destination $DMZ_DNS_IP
#POSTROUTING chain 必须有SNAT,不然服务响应的包无法返回请求的client
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP
如果提供外网服务的端口和内网服务不一样,可以指定不通的端口
iptables -t nat -A PREROUTING -d 192.168.10.158 -p tcp --dport 9999 -j DNAT --to 10.10.20.55:22
延伸,用DMZ可以做基于防火墙的4层的负载均衡