linux
  • Introduction
  • Yum
    • 基础yum源的配置
    • 为yum源配置代理
    • Centos指定版本的yum源
    • 环境变量
    • 本地yum源
    • 制作yum源
      • 同步yum源
    • epel源
  • Iptables
    • 基本匹配条件
    • Match-Extensions
      • Addrtype
      • Set
      • TCP
    • Target-Extensions
      • DNAT
      • LOG
    • Iptables规则持久化
    • 连接追踪
  • LVS
    • Ipvsadm命令
  • 磁盘与分区
    • 创建分区
    • 格式化与挂载
    • fstab
    • LVM
      • LVM扩容
    • swap分区
    • tmpfs
  • 网络相关
    • 重命名网卡
    • resolv.conf
    • Tcpdump
    • dig与nslookup
  • Other
    • CPU与内存
    • 进程
      • 僵尸进程
    • SSH密钥登录
    • 用户管理
    • Crontab
  • Nofile
    • 原理
  • 常用软件安装篇
    • MYSQL
    • 系统与内核
      • 指定内核启动
    • NFS
    • Haproxy
    • Keepalived
    • Squid
    • Redsocks
    • Shadowsocks
    • 时钟同步
  • 内存
Powered by GitBook
On this page
  • --match addrtype [options]
  • 示例
  • 实际场景
  • 场景一:kubernetes之nodeport
  • 场景二:calico

Was this helpful?

  1. Iptables
  2. Match-Extensions

Addrtype

--match addrtype [options]

--match可以简写为-m。常用的options有

  • [!] --src-type <type>

    源地址类型,前面加!表示“源地址不是<type>类型”

  • [!] --dst-type <type>

    目的地址类型,前面加!表示“目的地址不是<type>类型”

type的值有LOCAL、MULTICAST等

示例

  • 源地址为LOCAL类型

$ iptables -t nat -A PREROUTING -m addrtype --src-type LOCAL -j TARGET
  • 目的地址为LOCAL类型

$ iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j TARGET

实际场景

场景一:kubernetes之nodeport

在k8s中,我们有时候会用NodePort的方法对外暴露一个服务。也就是说我们可以通过主机的IP加端口来访问这个服务。这个IP有很多,命令ip addr看到的都可以用。比如

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:e8:b0:38 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.103/24 brd 192.168.1.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::4876:bfe:de57:eb31/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:9d:c9:79:d8 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

那么我们可以在本机上通过127.0.0.1:port、192.168.1.103:port或172.17.0.1:port来访问这个服务;在其他主机上可以通过192.168.1.103:port来访问这个服务。

在访问IP:Port时,由于最终要转换到Pod的IP与Pod的Port,也就是说,当从外面访问本机的包到达时,要先进入一条链判断是否做DNAT,而这条链就是KUBE-NODEPORTS,当然目地地址不是本机就不需要进入KUBE-NODEPORTS链了。所以k8s会在KUBE-SERVICES链中加入这样一条规则:

$ iptables -t nat -A KUBE-SERVICES -m addrtype --dst-type LOCAL -j KUBE-NODEPORT

这个LOCAL就是上面ip addr显示的IP地址的集合

我们可以查看这条规则:

$ iptables -t nat -nL KUBE-SERVICES
...
KUBE-NODEPORTS  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ ADDRTYPE match dst-type LOCAL

场景二:calico

to be continued

PreviousMatch-ExtensionsNextSet

Last updated 5 years ago

Was this helpful?