LINUX下用iptables来实现NAT
Explore
|
1#
Explore 发表于 2006-08-30 15:53
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 |