On Wed, Apr 19, 2017 at 04:47:13PM +0200, Andrei-Marius Radu wrote:
> Hello,
> 
> I've noticed that when running ping or traceroute with the -V option
> the DNS lookup still occurs in routing table 0. When ping or traceroute
> are run via route -Tx exec then the DNS lookup will happen in that
> respective routing table.
> 
> This is somewhat similar to the arp/ndp message sent by Pierre Emeriaudi
> a few days ago: http://marc.info/?l=openbsd-bugs&m=149211684314243&w=2
> 
> In the case of ping and traceroute it's due to the fact that the -V
> option sets the route table via a setsockopt SO_RTABLE call and the DNS
> lookup occurs using different sockets.
> 
> To me this behavior is counter-intuitive as I expect all traffic
> generated by the process to be in the same routing table. In some cases
> (VPNs) the names might not even be resolvable in routing table 0. I
> realize that forcing the DNS lookups to occur in the same routing table
> means that the name server address must be reachable in that routing
> table as well. 
> 
> I propose to add a setrtable(2) to the -V option handling. The
> setsockopt SO_RTABLE call is still required since the socket is created
> before. The diff is at the end of this e-mail.

No, this is the way -V is supposed to work. It will only move the actuall
socket for the pinger / traceroute packets to the rtable you specify. All
other connections are unaffected. If you want all sockets to be in a
different rdomain use "route -TX exec ping".

-- 
:wq Claudio

 
> Thank you and best regards,
> Andrei.
> 
> ------> Here is the ping -V20 example where the DNS lookup occurs in
> routing table 0:
> 
> user@laptop ~ $ ifconfig em0
> em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
>         lladdr 2b:23:a9:31:f2:99
>         index 1 priority 0 llprio 3
>         groups: egress
>         media: Ethernet autoselect (1000baseT full-duplex,rxpause,txpause)
>         status: active
>         inet 192.168.100.80 netmask 0xffffffe0 broadcast 192.168.100.95
> 
> user@laptop ~ $ ifconfig tun0
> tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> rdomain 20 mtu 1500
>         description: OpenVPN tunnel
>         index 15 priority 0 llprio 3
>         groups: tun
>         status: active
>         inet 10.9.8.2 --> 10.9.8.1 netmask 0xffffffe0
> 
> user@laptop ~ $ ping -V20 -c 1 firefox.com 
> PING firefox.com (63.245.213.17): 56 data bytes
> 64 bytes from 63.245.213.17: icmp_seq=0 ttl=53 time=200.590 ms
> 
> --- firefox.com ping statistics ---
> 1 packets transmitted, 1 packets received, 0.0% packet loss
> round-trip min/avg/max/std-dev = 200.590/200.590/200.590/0.000 ms
> 
> user@laptop ~ $ doas tcpdump -s 2000 -nvi em0 '(udp and port 53) or icmp'
> tcpdump: listening on em0, link-type EN10MB
> 15:30:34.400591 192.168.100.80.2174 > 192.168.100.255.53: [bad udp cksum 
> 55ed! -> 861b] 24470+ A? firefox.com. (29) (ttl 64, id 3640, len 57)
> 15:30:34.401595 192.168.100.255.53 > 192.168.100.80.2174: [udp sum ok] 24470 
> 1/0/0 firefox.com. A 63.245.213.17 (45) (ttl 64, id 33685, len 73)
> ^C
> 5 packets received by filter
> 0 packets dropped by kernel
> 
> user@laptop ~ $ doas tcpdump -s 2000 -nvi tun0 '(udp and port 53) or icmp'
> tcpdump: listening on tun0, link-type LOOP
> 15:30:34.401968 10.9.8.2 > 63.245.213.17: icmp: echo request (id:1f2d seq:0) 
> [icmp cksum ok] (ttl 255, id 7719, len 84)
> 15:30:34.602476 63.245.213.17 > 10.9.8.2: icmp: echo reply (id:1f2d seq:0) 
> [icmp cksum ok] (ttl 53, id 10522, len 84)
> ^C
> 2 packets received by filter
> 0 packets dropped by kernel
> 
> ------> And here is the route -T20 exec example where the DNS lookup
> occurs in routing table 20:
> 
> user@laptop ~ $ route -T20 exec ping -c 1 firefox.com
> PING firefox.com (63.245.213.17): 56 data bytes
> 64 bytes from 63.245.213.17: icmp_seq=0 ttl=53 time=200.708 ms
> 
> --- firefox.com ping statistics ---
> 1 packets transmitted, 1 packets received, 0.0% packet loss
> round-trip min/avg/max/std-dev = 200.708/200.708/200.708/0.000 ms
> 
> user@laptop ~ $ doas tcpdump -s 2000 -nvi em0 '(udp and port 53) or icmp'
> tcpdump: listening on em0, link-type EN10MB
> ^C
> 6 packets received by filter
> 0 packets dropped by kernel
> 
> user@laptop ~ $ doas tcpdump -s 2000 -nvi tun0 '(udp and port 53) or icmp'
> tcpdump: listening on tun0, link-type LOOP
> 15:32:00.173028 10.9.8.2.18641 > 192.168.100.255.53: [udp sum ok] 50385+ A? 
> firefox.com. (29) (ttl 64, id 22691, len 57)
> 15:32:00.283214 192.168.100.255.53 > 10.9.8.2.18641: [udp sum ok] 50385 1/0/0 
> firefox.com. A 63.245.213.17 (45) (ttl 64, id 10940, len 73)
> 15:32:00.283510 10.9.8.2 > 63.245.213.17: icmp: echo request (id:4961 seq:0) 
> [icmp cksum ok] (ttl 255, id 28996, len 84)
> 15:32:00.484135 63.245.213.17 > 10.9.8.2: icmp: echo reply (id:4961 seq:0) 
> [icmp cksum ok] (ttl 53, id 33835, len 84)
> ^C
> 4 packets received by filter
> 0 packets dropped by kernel
> 
> ------> Here is ping -V20 behavior with the added setrtable(2) call:
> 
> user@laptop ~ $ ping -V20 -c 1 firefox.com
> PING firefox.com (63.245.213.17): 56 data bytes
> 64 bytes from 63.245.213.17: icmp_seq=0 ttl=53 time=200.408 ms
> 
> --- firefox.com ping statistics ---
> 1 packets transmitted, 1 packets received, 0.0% packet loss
> round-trip min/avg/max/std-dev = 200.408/200.408/200.408/0.000 ms
> 
> user@laptop ~ $ doas tcpdump -s 2000 -nvi em0 '(udp and port 53) or icmp'
> tcpdump: listening on em0, link-type EN10MB
> ^C
> 6 packets received by filter
> 0 packets dropped by kernel
> 
> user@laptop ~ $ doas tcpdump -s 2000 -nvi tun0 '(udp and port 53) or icmp'
> tcpdump: listening on tun0, link-type LOOP
> 15:54:41.747041 10.9.8.2.10544 > 192.168.100.255.53: [udp sum ok] 34257+ A? 
> firefox.com. (29) (ttl 64, id 52528, len 57)
> 15:54:41.772777 192.168.100.255.53 > 10.9.8.2.10544: [udp sum ok] 34257 1/0/0 
> firefox.com. A 63.245.213.17 (45) (ttl 64, id 39456, len 73)
> 15:54:41.773452 10.9.8.2 > 63.245.213.17: icmp: echo request (id:f0af seq:0) 
> [icmp cksum ok] (ttl 255, id 17343, len 84)
> 15:54:41.973719 63.245.213.17 > 10.9.8.2: icmp: echo reply (id:f0af seq:0) 
> [icmp cksum ok] (ttl 53, id 65509, len 84)
> ^C
> 4 packets received by filter
> 0 packets dropped by kernel
> 
> ------> And the diff:
> 
> diff --git a/sbin/ping/ping.8 b/sbin/ping/ping.8
> index 36c3a8237d8..fbccfed10fa 100644
> --- a/sbin/ping/ping.8
> +++ b/sbin/ping/ping.8
> @@ -240,7 +240,8 @@ or a number in either hex or decimal.
>  .Pq IPv4 only
>  Use the specified time-to-live.
>  .It Fl V Ar rtable
> -Set the routing table to be used for outgoing packets.
> +Set the routing table to be used for outgoing packets. Any required DNS
> +lookups will also occur in the specified routing table.
>  .It Fl v
>  Verbose output.
>  ICMP packets other than
> diff --git a/sbin/ping/ping.c b/sbin/ping/ping.c
> index 8592d7d539f..457a01b8b70 100644
> --- a/sbin/ping/ping.c
> +++ b/sbin/ping/ping.c
> @@ -413,6 +413,8 @@ main(int argc, char *argv[])
>                       if (setsockopt(s, SOL_SOCKET, SO_RTABLE, &rtableid,
>                           sizeof(rtableid)) == -1)
>                               err(1, "setsockopt SO_RTABLE");
> +                     if (setrtable(rtableid) == -1)
> +                             err(1, "setrtable");
>                       break;
>               case 'v':
>                       options |= F_VERBOSE;
> diff --git a/usr.sbin/traceroute/traceroute.8 
> b/usr.sbin/traceroute/traceroute.8
> index 4422a2d7c0a..771027b3d99 100644
> --- a/usr.sbin/traceroute/traceroute.8
> +++ b/usr.sbin/traceroute/traceroute.8
> @@ -198,7 +198,8 @@ and
>  .Cm throughput .
>  This option is not available for IPv6.
>  .It Fl V Ar rtable
> -Set the routing table to be used.
> +Set the routing table to be used. Any required DNS lookups will also
> +occur in the specified routing table.
>  .It Fl v
>  Verbose output.
>  Received ICMP packets other than
> diff --git a/usr.sbin/traceroute/traceroute.c 
> b/usr.sbin/traceroute/traceroute.c
> index 6b0909fbd71..d08efae9e36 100644
> --- a/usr.sbin/traceroute/traceroute.c
> +++ b/usr.sbin/traceroute/traceroute.c
> @@ -530,6 +530,8 @@ main(int argc, char *argv[])
>                       if (setsockopt(rcvsock, SOL_SOCKET, SO_RTABLE,
>                           &rtableid, sizeof(rtableid)) == -1)
>                               err(1, "setsockopt SO_RTABLE");
> +                     if (setrtable(rtableid) == -1)
> +                             err(1, "setrtable");
>                       break;
>               case 'w':
>                       waittime = strtonum(optarg, 2, INT_MAX, &errstr);

> diff --git a/sbin/ping/ping.8 b/sbin/ping/ping.8
> index 36c3a8237d8..fbccfed10fa 100644
> --- a/sbin/ping/ping.8
> +++ b/sbin/ping/ping.8
> @@ -240,7 +240,8 @@ or a number in either hex or decimal.
>  .Pq IPv4 only
>  Use the specified time-to-live.
>  .It Fl V Ar rtable
> -Set the routing table to be used for outgoing packets.
> +Set the routing table to be used for outgoing packets. Any required DNS
> +lookups will also occur in the specified routing table.
>  .It Fl v
>  Verbose output.
>  ICMP packets other than
> diff --git a/sbin/ping/ping.c b/sbin/ping/ping.c
> index 8592d7d539f..457a01b8b70 100644
> --- a/sbin/ping/ping.c
> +++ b/sbin/ping/ping.c
> @@ -413,6 +413,8 @@ main(int argc, char *argv[])
>                       if (setsockopt(s, SOL_SOCKET, SO_RTABLE, &rtableid,
>                           sizeof(rtableid)) == -1)
>                               err(1, "setsockopt SO_RTABLE");
> +                     if (setrtable(rtableid) == -1)
> +                             err(1, "setrtable");
>                       break;
>               case 'v':
>                       options |= F_VERBOSE;
> diff --git a/usr.sbin/traceroute/traceroute.8 
> b/usr.sbin/traceroute/traceroute.8
> index 4422a2d7c0a..771027b3d99 100644
> --- a/usr.sbin/traceroute/traceroute.8
> +++ b/usr.sbin/traceroute/traceroute.8
> @@ -198,7 +198,8 @@ and
>  .Cm throughput .
>  This option is not available for IPv6.
>  .It Fl V Ar rtable
> -Set the routing table to be used.
> +Set the routing table to be used. Any required DNS lookups will also
> +occur in the specified routing table.
>  .It Fl v
>  Verbose output.
>  Received ICMP packets other than
> diff --git a/usr.sbin/traceroute/traceroute.c 
> b/usr.sbin/traceroute/traceroute.c
> index 6b0909fbd71..d08efae9e36 100644
> --- a/usr.sbin/traceroute/traceroute.c
> +++ b/usr.sbin/traceroute/traceroute.c
> @@ -530,6 +530,8 @@ main(int argc, char *argv[])
>                       if (setsockopt(rcvsock, SOL_SOCKET, SO_RTABLE,
>                           &rtableid, sizeof(rtableid)) == -1)
>                               err(1, "setsockopt SO_RTABLE");
> +                     if (setrtable(rtableid) == -1)
> +                             err(1, "setrtable");
>                       break;
>               case 'w':
>                       waittime = strtonum(optarg, 2, INT_MAX, &errstr);

Reply via email to