Linux は仮想インターフェイスのソースアドレスで応答します。

Linux は仮想インターフェイスのソースアドレスで応答します。

これが正しいフォーラムであることを願っています。

Quagga(BGP用)とDNSMASQ(DHCP用)がインストールされているLinux(Centos 7)サーバーがあります。冗長性のためにBGPを介してDHCPサービスを実行します。

現在、クライアントはBGP IPアドレス(10.10.12.12)を介してDHCPサーバーに接続し、DISCOVERパケットを送信しています。 DHCPサーバーはこれを見てOFFERを発行しますが、DHCPサーバーは代わりにDHCPサーバーの内部IPの送信元アドレス(172.18.25.10 - ご覧のように(下の2番目のtcpdumpパケット))を使用するため、そのOFFERはクライアントに返されません。 BGP IPアドレス(10.10.12.12)のうち172.18.25.10はファイアウォールによってブロックされました(開いたくありません)。

クライアントに返される送信元アドレスを内部IPではなくBGPアドレスに設定するにはどうすればよいですか? IPルーティングを設定しようとしましたが正しく設定できないようです。どんなアイデアがありますか?

路線

$ ip r
default via 172.18.25.1 dev ens256 proto static metric 100 
172.18.25.0/24 dev ens256 proto kernel scope link src 172.18.25.10 metric 100 

相互作用

$ ifconfig
ens256: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 172.18.25.10  netmask 255.255.255.0  broadcast 172.18.25.255
    (truncated for brevity...)

lo:10: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
    inet 10.10.12.12  netmask 255.255.255.255
    loop  txqueuelen 1  (Local Loopback)

lo:10の仮想インターフェイスの設定

DEVICE=lo:10
IPADDR=10.10.12.12
NETMASK=255.255.255.255
ONBOOT=yes
NAME=lo10

DHCP サーバー tcpdump

17:44:11.833026 IP (tos 0x0, ttl 62, id 4923, offset 0, flags [none], proto UDP (17), length 388)
192.168.69.1.67 > 10.10.12.12.67: [udp sum ok] BOOTP/DHCP, Request from a8:60:b6:0c:49:cd, length 360, hops 1, xid 0xad97213f, secs 8, Flags [none] (0x0000)
  Gateway-IP 192.168.69.1
  Client-Ethernet-Address a8:60:b6:0c:49:cd
  Vendor-rfc1048 Extensions
    Magic Cookie 0x63825363
    DHCP-Message Option 53, length 1: Discover
    Parameter-Request Option 55, length 10: 
      Subnet-Mask, Classless-Static-Route, Default-Gateway, Domain-Name-Server
      Domain-Name, Option 119, Option 252, LDAP
      Netbios-Name-Server, Netbios-Node
    MSZ Option 57, length 2: 1500
    Client-ID Option 61, length 7: ether a8:60:b6:0c:49:cd
    Lease-Time Option 51, length 4: 7776000
    Hostname Option 12, length 9: "tests-MBP"
    Agent-Information Option 82, length 57: 
      Circuit-ID SubOption 1, length 42: ToR-vc.corp.fake01:ge-0/0/20.0:dhcp-test-69
      Remote-ID SubOption 2, length 11: ge-0/0/20.0

17:44:11.833196 IP (tos 0xc0, ttl 64, id 4315, offset 0, flags [none], proto UDP (17), length 394)
172.18.25.10.67 > 192.168.69.1.67: [bad udp cksum 0xcc4d -> 0xe7d1!] BOOTP/DHCP, Reply, length 366, hops 1, xid 0xad97213f, secs 8, Flags [none] (0x0000)
  Your-IP 192.168.69.230
  Server-IP 172.18.25.10
  Gateway-IP 192.168.69.1
  Client-Ethernet-Address a8:60:b6:0c:49:cd
  Vendor-rfc1048 Extensions
    Magic Cookie 0x63825363
    DHCP-Message Option 53, length 1: Offer
    Server-ID Option 54, length 4: 172.18.25.10
    Lease-Time Option 51, length 4: 300
    RN Option 58, length 4: 150
    RB Option 59, length 4: 262
    Subnet-Mask Option 1, length 4: 255.255.255.0
    BR Option 28, length 4: 192.168.69.255
    Default-Gateway Option 3, length 4: 192.168.69.1
    Domain-Name-Server Option 6, length 4: 172.18.25.10
    Domain-Name Option 15, length 13: "example.com"
    Agent-Information Option 82, length 57: 
      Circuit-ID SubOption 1, length 42: ToR-vc.corp.fake01:ge-0/0/20.0:dhcp-test-69
      Remote-ID SubOption 2, length 11: ge-0/0/20.0

答え1

に基づいてiptables:宛先アドレスが一致した場合は、ローカルソースアドレスを変更します。簡単なIPパスを追加するソリューションを見つけました。

ip route add 192.168.69.1/32 via 172.18.25.1 src 10.10.12.12

または

ip route add 0.0.0.0/0 via 172.18.25.1 src 10.10.12.12

答え2

これがdnsmasqの問題であることが確実であれば、そのソフトウェアは問題に対するいくつかの解決策を提供します。たとえば、インターフェイスで指定されたインターフェイスを強制的に受信します。

interface=lo:10

no-dhcp-interfaceはこのインターフェイスでDHCP割り当てを無効にします。例:

no-dhcp-interface=ens256

受信アドレスはインターフェイスのように見えますが、バインディングIPを指定します。例:

listen-address=10.10.12.12

dnsmasqドキュメントから:

-i, --interface=<interface name> Listen only on the specified interface(s). 
Dnsmasq automatically adds the loopback (local) interface to the list of 
interfaces to use when the --interface option is used. If no --interface or 

-2, --no-dhcp-interface=<interface name>
Do not provide DHCP or TFTP on the specified interface, but do provide DNS 
service.

-a, --listen-address=<ipaddr>
Listen on the given IP address(es). Both --interface and --listen-address 
options may be given, in which case the set of both interfaces and addresses 
is used. Note that if no --interface option is given, but --listen-address 
is, dnsmasq will not automatically listen on the loopback interface. To 
achieve this, its IP address, 127.0.0.1, must be explicitly given as a -- 
listen-address option.

関連情報