LINUX下用iptables来实现NAT

LINUX下用iptables来实现NAT

(一)Iptables 的使用语法
在使用iptables的NAT功能时,我们必须在每一条规则中使用"-t nat"显示的指明使用nat表。然后使用以下的选项::
1. 对规则的操作
  加入(append) 一个新规则到一个链 (-A)的最后。
  在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。
  在链内某个位置替换(replace) 一条规则 (-R)。
  在链内某个位置删除(delete) 一条规则 (-D)。
  删除(delete) 链内第一条规则 (-D)。
  2. 指定源地址和目的地址
  通过--source/--src/-s来指定源地址(这里的/表示或者的意思,下同),通过--destination/--dst/-s来指定目的地址。可以使用以下四中方法来指定ip地址:
  a. 使用完整的域名,如“www.linuxaid.com.cn”;
  b. 使用ip地址,如“192.168.1.1”;
  c. 用x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”;
  d. 用x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是 UNIX环境中通常使用的表示方法。
  缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。
  3. 指定网络接口
  可以使用--in-interface/-i或--out-interface/-o来指定网络接口。从NAT的原理可以看出,对于PREROUTING链,我们只能用-i指定进来的网络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。
4. 指定协议及端口
  可以通过--protocol/-p选项来指定协议,如果是udp和tcp协议,还可--source-port/--sport和 --destination-port/--dport来指明端口。

(二)iptabls的使用实例:
假如有一个广域网的ip地址为a.b.c.d 网关a.b.c.x 掩码 255.255.255.252
局域网ip地址为192.168.0.1-192.168.0.255 网关 192.168.0.1
软件环境为:Linux7.2 选择server安装
指定eth0:a.b.c.d eth1:192.168.0.1
添加路油表
vi /etc/sysconfig/static-routes
etho net a.b.c.d netmask 255.255.255.252 gw a.b.c.x
eth1 net 192.168.0.1netmask 255.255.255.0 gw 192.168.0.1
指定网关
vi /etc/sysconfig/network
NETWORKING=yes
GATEWAYDEV=eth0
GATEWAY=a.b.c.x
HOSTNAME=(主机名字)
起用路油
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.default.rp_filter=1
kernel.core_uses_pid=1
kernel.sysrq=0
配置iptables的脚本
建立rc.fw
#for this to run iptables firewall
!/bin/sh
/sbin/modprobe ip_tables
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -X
/sbin/iptables -Z
echo"1">/proc/sys/net/ipv4/ip_forward
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -s 0/0 -d 0/0 -j ACCEPT
上面这些是没有任何限制的iptables要想有些安全限制可以自行
新的联接
(三)端口的转发
假如内部有一个www 服务器 一个ftp服务器
地址分别是192.168.0.8(www)
      192.168.0.9(ftp)
在上面的脚本里最后添加
iptables -t nat -A PREROUTING -d a.b.c.d -p tcp --dport 80 –j DNAT --to 192.168.0.8:80
iptables -t nat -A PREROUTING -d a.b.c.d -p tcp --dport 21 -j DNAT --to 192.168.0.9:21
附录:
-p 指定协议(--protocol)
--dport 指明端口(--source-port/--sport和 --destination-port)
-i 或者-o 指定网络接口(PREROUTING链用-i POSTROUTING 用-o)
-s 指明源地址(--source/--src/源地址destination/--dst/目的地址)
-A 加入一个新规则到一个链(一般写到最后面)(append)
-I 在链内某个位置插入(insert)一般最后面
-R 在链内某个位置替换一条规则
-D 删除链内第一条规则(delete)
-d 指明目的地址
——————————————————————————————————————
下面是一个iptable的脚本没有安全性能
touch /var/lock/subsys/local
#for this to run iptables firewall
!/bin/sh
/sbin/modprobe ip_tables
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -X
/sbin/iptables -Z
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

echo"1">/proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
/sbin/iptables -A FORWARD -s 0/0 -d 0/0 -j ACCEPT

————————————————————————————————————————
iptables 过滤规则
# 过滤表规则

*filter

# 默认彻略
:FORWARD DROP [ ]
:INPUT DROP [ ]
:OUTPUT ACCEPT [ ]

# 定义新链
-N ICMP_FORWARD
-N TCP_FORWARD
-N UDP_FORWARD
-N ICMP_INPUT
-N TCP_INPUT
-N UDP_INPUT

# Fix a bug
-A OUTPUT -p icmp -m state --state INVALID -j DROP

# 以下是FORWARD链的规则
# 若是ICMP协议则跳到 ICMP_FORWARD
-A FORWARD -p icmp -j ICMP_FORWARD
# 若是TCP协议则跳到 TCP_FORWARD
-A FORWARD -p tcp -j TCP_FORWARD
# 若是UDP协议则跳到 UDP_FORWARD
-A FORWARD -p udp -j UDP_FORWARD
# 允许碎片通过的速率200个/s,从200开始计数
-A FORWARD -f -m limit --limit 200/s --limit-burst 200 -j ACCEPT
# 不匹配FORWARD链的所有规则,丢弃数据包,结束FORWARD链
-A FORWARD -j DROP

# 以下是FORWARD链中针对ICMP协议的规则
# 从内网到外网的放行
-A ICMP_FORWARD -p icmp -s 192.168.0.0/24 -i eth0 -o ppp+ -j ACCEPT
# 从外网进来的回应包放行
-A ICMP_FORWARD -p icmp -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 丢弃所有不匹配的ICMP数据包,结束FORWARD链
-A ICMP_FORWARD -p icmp -j DROP

# 以下是FORWARD链中针对TCP协议的规则
# 允许内网1024以上的端口连接外网
-A TCP_FORWARD -p tcp -s 192.168.0.0/24 -m tcp --sport 1024: -i eth0 -o ppp+ -j ACCEPT
# 允许内网进行主动式的FTP
-A TCP_FORWARD -p tcp -m tcp --sport 21 --dport 1024: -m state --state ESTABLISHED -i ppp+ -j ACCEPT
-A TCP_FORWARD -p tcp -m tcp --sport 20 --dport 1024: -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 允许外网进来的回应包通过
-A TCP_FORWARD -p tcp -m state --state ESTABLISHED -m tcp --dport 1024: -i ppp+ -j ACCEPT
# 丢弃所有不匹配的TCP数据包,结束FORWARD链
-A TCP_FORWARD -p tcp -j DROP

# 以下是FORWARD链中针对UDP协议的规则
# 允许内网1024以上的端口连接外网
-A UDP_FORWARD -p udp -s 192.168.0.0/24 -m udp --sport 1024: -i eth0 -o ppp+ -j ACCEPT
# 允许外网中指明的DNS服务器进行域名解析
-A UDP_FORWARD -p udp -s 202.96.96.68 -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT
-A UDP_FORWARD -p udp -s 202.96.*.* -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT
# 开放IRC OICQ 端口
-A UDP_FORWARD -p udp -m multiport --source-port 4000,8000 -m udp --dport 1024: -i ppp+ -j ACCEPT
# 允许从外网进来的UDP回应包通行
-A UDP_FORWARD -p udp -m state --state ESTABLISHED,RELATED -m udp --dport 1024: -i ppp+ -j ACCEPT
# 丢弃所有不匹配的UDP数据包,结束FORWARD链
-A UDP_FORWARD -p udp -j DROP

# 以下开始是对网关服务器的匹配规则

# 允许数据包进入本地回环接口
-A INPUT -p all -i lo -j ACCEPT

# 若是ICMP协议则跳到ICMP_INPUT进行规则匹配
-A INPUT -p icmp -j ICMP_INPUT
# 若是TCP协议则跳到TCP_INPUT进行规则匹配
-A INPUT -p tcp -j TCP_INPUT
# 若是UDP协议则跳到UDP_INPUT进行规则匹配
-A INPUT -p udp -j UDP_INPUT
# 允许碎片通过的速率200个/s,从200开始计数
-A INPUT -f -m limit --limit 200/s --limit-burst 200 -j ACCEPT
# 不匹配INPUT链的所有规则,丢弃数据包,结束INPUT链
-A INPUT -j DROP

# 以下是INPUT链中针对ICMP协议的规则
# 允许从内网来的ICMP数据包
-A ICMP_INPUT -p icmp -i eth0 -j ACCEPT
# 允许从外网来的ICMP回应包通行
-A ICMP_INPUT -p icmp -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 丢弃所有不匹配的ICMP数据包,结束INPUT链
-A ICMP_INPUT -p icmp -j DROP

# 以下是INPUT链中针对TCP协议的规则
# 对内网机器提供 http https 网上邻居 透明代理服务
-A TCP_INPUT -p tcp -s 192.168.0.0/24 -m multiport --destination-port 80,443,137,138,139,8080 -i eth0 -j ACCEPT
# 允许服务器以主动方式连接外网的FTP服务器
-A TCP_INPUT -p tcp -m tcp --sport 21 --dport 1024: -m state --state ESTABLISHED -i ppp+ -j ACCEPT
-A TCP_INPUT -p tcp -m tcp --sport 20 --dport 1024: -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 提供 ssh smtp pop3 http https 服务
-A TCP_INPUT -p tcp -m multiport --destination-port 22,25,110,80,443 -j ACCEPT
# 拒绝外网主动连接本服务器
-A TCP_INPUT -p tcp -m tcp --syn -i ppp+ -j DROP
# 允许进来的回应包通过
-A TCP_INPUT -p tcp -m state --state ESTABLISHED -m tcp --dport 1024: -j ACCEPT
# 丢弃所有不匹配的TCP数据包,结束INPUT链
-A TCP_INPUT -p tcp -j DROP

# 以下是INPUT链中针对UDP协议的规则
# 允许外网中指明的DNS服务器进行域名解析
-A UDP_INPUT -p udp -s 202.96.96.68 -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT
-A UDP_INPUT -p udp -s 202.96.*.* -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT
# 为内网的机器提供DNS和SAMBA服务
-A UDP_INPUT -p udp -s 192.168.0.0/24 -m multiport --destination-port 53,137,138,139 -i eth0 -j ACCEPT
# 允许服务器作为samba client
-A UDP_INPUT -p udp -s 192.168.0.0/24 -m udp --sport 137:139 --dport 1024: -i eth0 -j ACCEPT
# 允许进来的回应包通过
-A UDP_INPUT -p udp -m state --state ESTABLISHED,RELATED -m udp --dport 1024: -j ACCEPT
# 为内网的机器提供DHCP服务
-A UDP_INPUT -p udp -m udp --sport 68 --dport 67 -i eth0 -j ACCEPT
# 丢弃所有不匹配的UDP数据包,结束INPUT链
-A UDP_INPUT -p udp -j DROP

COMMIT


# 路由表规则

*nat

# 默认彻略
:PREROUTING ACCEPT [ ]
:POSTROUTING ACCEPT [ ]
:OUTPUT ACCEPT [ ]

# 为内网机器使用squid透明代理进行端口重定向
-A PREROUTING -i eth0 -p tcp -d ! 192.168.0.1 -m tcp --dport 80 -j REDIRECT --to-ports 8080
# 对内网机器应用IP伪装
-A POSTROUTING -o ppp+ -j MASQUERADE

COMMIT
谢谢提供!!不错!!
好象是不错~
做代理的时候应该用的到~