iptables命令学习(多网卡下的负载均衡)

iptables主要参数
-A 向规则链中添加一条规则,默认被添加到末尾
-T指定要操作的表,默认是filter
-D从规则链中删除规则,可以指定序号或者匹配的规则来删除
-R进行规则替换
-I插入一条规则,默认被插入到首部
-F清空所选的链,重启后恢复
-N新建用户自定义的规则链
-X删除用户自定义的规则链

-p用来指定协议可以是tcp,udp,icmp等也可以是数字的协议号,
-s指定源地址
-d指定目的地址
-i进入接口
-o流出接口

-j采取的动作,accept,drop,snat,dnat,masquerade
--sport源端口
--dport目的端口,端口必须和协议一起来配合使用


1、关闭所有的 INPUT FORWARD OUTPUT 
命令实现:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
状态:命令iptables -L -n
Chain INPUT (policy DROP)
Chain FORWARD (policy DROP)
Chain OUTPUT (policy DROP)
2、只打开22端口
命令实现:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
状态:
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0           tcp dpt:22
Chain FORWARD (policy DROP)
target     prot opt source               destination
Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0           tcp spt:22
命令说明:
-A 参数就看成是添加一条 INPUT/OUTPU 的规则
-p 指定是什么协议 我们常用的tcp 协议,当然也有udp
--dport 目标端口(数据从外部进入服务器)
--sport 数据源端口(数据从服务器出去)
-j 就是指定ACCEPT接收或者DROP不接收
注意如果是双相互联需要成对出现如:
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT 
iptables -A INPUT -p udp --sport 53 -j ACCEPT
        client--<<||<<==server
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
        client==>>||>>--server
状态:
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0           tcp dpt:53
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0           tcp spt:53
Chain FORWARD (policy DROP)
target     prot opt source               destination
Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0           tcp spt:53
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0           tcp dpt:53
扩展说明:
禁止某IP访问iptables -A INPUT -p tcp -s 192.168.1.2 -j DROP
-s就是来源的意思
删除规则先查看规则编号iptables -L -n --line-number
num target     prot opt source               destination
1    DROP       tcp -- 0.0.0.0/0            0.0.0.0/0           tcp dpt:21
2    DROP       tcp -- 0.0.0.0/0            0.0.0.0/0           tcp dpt:80
再删除INPUT链80端口的规则iptables -D INPUT 2
3、过滤无效的数据包(数据包验证)
命令实现:
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
命令说明:
先判断规则状态iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
再导入状态参数-m state 
过滤从端口经过的不服从规则的数据--state ESTABLISHED 
(ESTABLISHED已建立的链接状态RELATED该数据包与本机发出的数据包有关)
扩展说明:
iptables -A INPUT -i lo -j ACCEPT
允许本地环回接口在INPUT表的所有数据通信-i参数是指定接口
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT 
允许对eth0转发
4、指定端口范围
以ftp为例
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
仍然不通因为数据传输端口是任意的
调整FTP配置/etc/vsftpd.conf加入
pasv_min_port=30001
pasv_max_port=31000
iptables -A INPUT -p tcp --dport 30001:31000 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 30001:31000 -j ACCEPT
状态:
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0          tcp dpt:22
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0          tcp dpt:21
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0          tcp dpt:20
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0          tcp dpts:30001:31000
Chain FORWARD (policy DROP)
target     prot opt source               destination
Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0          tcp spt:22
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0          tcp spt:21
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0          tcp spt:20
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0          tcp spts:30001:31000
5、其他
预设规则表拥有 INPUT、FORWARD 和 OUTPUT 三个规则链
这个规则表是用来进行封包过滤的理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT)
6、高级部份
filter表过滤功能内核iptables_filter
nat表网络地址转换功能内核iptables_nat
mangle表拆解修改封装报文功能内核iptables_mangle
raw表关闭nat表上连接追踪机制内核iptables_raw
内核编译时要
  必备: 
  CONFIG_NETLINK=y 
  这个选项是 Kernel/User netlink socket 
  CONFIG_RTNETLINK=y 
  Routing messages 
  CONFIG_INET=y 
  TCP/IP networking 
  CONFIG_IP_ADVANCED_ROUTER=y 
  IP: advanced router 
  CONFIG_IP_MULTIPLE_TABLES=y 
  IP: policy routing 
  CONFIG_IP_ROUTE_MULTIPATH=y 
  IP: equal cost multipath 

案例:
iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X
首先,把三个表清空,把自建的规则清空。

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
设定INPUT、OUTPUT的默认策略为DROP,FORWARD为ACCEPT。

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
先把“回环”打开,以免有不必要的麻烦。

iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT
在所有网卡上打开ping功能,便于维护和检测。

iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp --sport 22 -j ACCEPT
打开22端口,允许远程管理。(设定了很多的附加条件:管理机器IP必须是250,并且必须从eth0网卡进入)

SNAT即源地址目标转换,路由器
DNAT即目标网络地址转换,负载均衡
MASQUERADE地址伪装
masquerade和snat的主要区别在于snat是把源地址转换为固定的IP地址,而masquerade在adsl等方式拨号上网时转换为动态IP地址
命令实现:
iptables-t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3
把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后从eth0发出去
iptables-t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5
把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后从eth0发出去
iptables-t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
把所有10.8.0.0网段的数据包SNAT成动态IP(MASQUERADE会自动读取eth0现在的ip地址)然后从eth0发出去

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1  
在mangle表的PREROUTING链中添加规则对来自eth0接口的数据包做标志,规则是TCP协议目的端口号是80标志的值是1
iptables -t mangle -A FORWARD -i eth0 -p tcp --dport 80 -j MARK --set-mark 1  
在mangle表添加转发规则对来自eth0接口的数据包做标志,规则是TCP协议目的端口号是80标志的值是1
iptables -t mangle -A FORWARD -i eth0 -j MARK --set-mark 2 
在mangle表添加转发规则对来自eth0接口的数据包做标志,规则是所有协议及端口进行标记的值是2

实例:
三块网卡,wlan0为LAN口wlan1为第一个WAN口接电信DSL线路eth0为第二个WAN口接网通modem线路
方法一策略路由即对数据包添加路由规则(根据出站数据包的IP源地址)
DSL和modem接到一网卡上即交换机(示例1)
echo "101 DIANXIN" >> /etc/iproute2/rt_tables
echo "102 LIANTONG" >> /etc/iproute2/rt_tables
iptables -t mangle -A PREROUTING -i wlan0 -s 192.168.43.0/24 -d 192.168.0.0/12 -j MARK --set-mark 7
iptables -t mangle -A PREROUTING -i wlan0 -s 192.168.10.0/24 -d 192.168.0.0/12 -j MARK --set-mark 8
iptables -t nat -A POSTROUTING -o wlan1 -s 172.16.43.0/24 -j SNAT --to-source 192.168.43.1
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.10.0/24 -j SNAT --to-source 192.168.10.1
ip route add table DIANXIN default via 192.168.43.1
ip route add table LIANTONG default via 192.168.10.1
ip rule add from all fwmark 7 lookup DIANXIN
ip rule add from all fwmark 8 lookup LIANTONG
服务器有三个口接三个不同的网络(示例2)
eth0是电信,ip地址为1.1.1.1/24,电信网关为1.1.1.254
eth1是网通,ip地址为2.2.2.2/24,网通网关为2.2.2.254
eth2是教育网,ip地址为3.3.3.3/24,教育网网关为3.3.3.254
配置文件里面添加三个不同的路由表表名
echo “101 ChinaNet” >> /etc/iproute2/rt_tables
echo ”102 ChinaCnc“ >> /etc/iproute2/rt_tables
echo ”103 ChinaEdu“ >> /etc/iproute2/rt_tables
每个路由表里面建立默认网关
ip route add default via 1.1.1.254 dev eth0 table ChinaNet
ip route add default via 2.2.2.254 dev eth1 table ChinaCnc
ip route add default via 3.3.3.254 dev eth2 table ChinaEdu
来自不同的口的走不同的路由表
ip rule add from 1.1.1.1 table ChinaNet 
ip rule add from 2.2.2.2 table ChinaCnc
ip rule add from 3.3.3.3 table ChinaEdu
服务器默认路由没有设置也能够让外面的用户正常访问电信还是网通还是教育网用户访问三个ip的任意一个地址都能够连通

方法二链路级负载均衡(要用到CONFIG_IP_ROUTE_MULTIPATH内核选项)
DSL和modem接各自线路(注意不要设置默认网关)

ip route add 192.168.43.0/24 dev wlan1
ip route add 192.168.10.0/24 dev eth0

ip route replace default scope global nexthop via 192.168.43.1 dev wlan1 weight 1 nexthop via 192.168.10.1 dev eth0 weight 1
iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
正确的路由表(ip route show)
default 
        via 192.168.43.1 dev wlan1 linkdown
        via 192.168.10.1 dev eth0 linkdown 
192.168.43.0/24 dev wlan1 proto kernel scope link src 192.168.43.13 linkdown 
192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.2 linkdown 
192.168.2.0/24 dev wlp0s0 proto kernel scope link src 192.168.2.1 

以上结束

贴一下自己的配置

nano /etc/iproute2/rt_tables
101     ChinaNet
102     ChinaCnc
103     ChinaEdu
bash -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

#网络参数
IF0=wlp0s0
P0_NET=192.168.0.0/24
P0=192.168.43.2
IP0=`ifconfig wlp0s0 | grep "inet " | awk '{print $2}'`

IF1=wlxc83a35c2c508
P1_NET=192.168.1.0/24
P1=192.168.1.1
IP1=`ifconfig wlxc83a35c2c508 | grep "inet " | awk '{print $2}'`

IF2=wlxe84e06334649
P2_NET=192.168.2.0/24
P2=192.168.2.1
IP2=`ifconfig wlxe84e06334649 | grep "inet " | awk '{print $2}'`

IF3=eth0
P3_NET=192.168.10.0/24
P3=192.168.10.1
IP3=`ifconfig eth0 | grep "inet " | awk '{print $2}'`
#三张路由表规则
if [ ! $IP1 ]; then
echo "$IF1无IP地址"
else
ip route add $P1_NET dev $IF1 src $IP1 table ChinaNet
ip route add default via $P1 table ChinaNet
ip route add $P1_NET dev $IF1 src $IP1
ip rule add from $IP1 table ChinaNet
#ip rule add to 67.21.0.0/16 table ChinaNet
fi
if [ ! $IP2 ]; then
echo "$IF2无IP地址"
else
ip route add $P2_NET dev $IF2 src $IP2 table ChinaCnc
ip route add default via $P2 table ChinaCnc
ip route add $P2_NET dev $IF2 src $IP2
ip rule add from $IP2 table ChinaCnc
#ip rule add to 111.13.0.0/16 table ChinaCnc
fi
if [ ! $IP3 ]; then
echo "$IF3无IP地址"
else
ip route add $P3_NET dev $IF3 src $IP3 table ChinaEdu
ip route add default via $P3 table ChinaEdu
ip route add $P3_NET dev $IF3 src $IP3
ip rule add from $IP3 table ChinaEdu
#ip rule add to 211.176.0.0/16 table ChinaEdu
fi
#路由表
if [ ! $IP1 ]; then
echo "$IF1无IP地址"
else
ip route add $P0_NET dev $IF0 table ChinaNet
ip route add $P1_NET dev $IF1 table ChinaNet
ip route add 127.0.0.0/8 dev lo table ChinaNet
fi
if [ ! $IP2 ]; then
echo "$IF2无IP地址"
else
ip route add $P0_NET dev $IF0 table ChinaCnc
ip route add $P2_NET dev $IF2 table ChinaCnc
ip route add 127.0.0.0/8 dev lo table ChinaCnc
fi
if [ ! $IP3 ]; then
echo "$IF3无IP地址"
else
ip route add $P0_NET dev $IF0 table ChinaEdu
ip route add $P3_NET dev $IF3 table ChinaEdu
ip route add 127.0.0.0/8 dev lo table ChinaEdu
fi
#负载均衡(main表路由规则)
#ip route add default via $P1
if [ ! $IP1 ]; then
ip route replace default scope global nexthop via $P2 dev $IF2 weight 1 nexthop via $P3 dev $IF3 weight 1
elif [ ! $IP2 ];then
ip route replace default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P3 dev $IF3 weight 1
elif [ ! $IP3 ];then
ip route replace default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1
else
ip route replace default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1 nexthop via $P3 dev $IF3 weight 1
fi

#路由地址转换
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -t nat -A POSTROUTING -o wlxc83a35c2c508 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wlxe84e06334649 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值