3

I have a few servers with public Internet IP addresses like A.B.C.x. One of my hosts (A.B.C.10) runs ntpd and I have it syncing it's time from europe.pool.ntp.org.

Now I only want to allow hosts from my subnet (A.B.C.x) to be able to sync to A.B.C.10. By default the whole world can sync to my NTP server. How do I accomplish this?


All examples I can find assume that I'm syncing to specific IP addresses but I sync to DNS names and as far as I can tell the IP addresses that the DNS names x.europe.pool.ntp.org point to are variable. So I can't setup exceptions in my firewall and I can't use the restrict option in ntp.conf because it too only accepts IP addresses and not DNS names (Oh! and restrict applies both to clients and to servers as firewall rules do!)

  • What kind of firewall? Is it stateful? – 200_success Dec 27 '14 at 22:46
  • Well it's a Linux host so I can use iptables which is stateful. I think I can see your point :-) but will happily wait for your iptable command because I'm no iptables expert – ndemou Dec 27 '14 at 22:50
2

You've got several options, and it depends on where firewalls are placed and/or which ones you prefer to work with. Ideally you would have a firewall that you can control on the subnet. Less ideally you'll only be dealing with a host level firewall on the NTP server. Either way the concept is the same.

For a subnet firewall:

  • Allow UDP port 123 out of the subnet only from A.B.C.10
  • Deny UDP port 123 from everything else.

For a host firewall on the NTP server:

  • Allow UDP port 123 from your subnet (and from localhost)
  • Deny UDP port 123 from everywhere else (a deny all rule later in the chain).

e.g. to allow 10.0.0.0/8:

# allow 10.0.0.0/8
iptables -A INPUT -s 10.0.0.0/8 -p udp -m udp --dport 123 -j ACCEPT
# allow localhost
iptables -A INPUT -s 127.0.0.0/8 -p udp -m udp --dport 123 -j ACCEPT
# allow NTP packets _from_ your host to everyone else
iptables -A OUTPUT -p udp --sport 123 --dport 123 -m state --state NEW,ESTABLISHED -j ACCEPT
# allow replies from hosts you've sent NTP packets to
iptables -A INPUT  -p udp --sport 123 --dport 123 -m state --state ESTABLISHED -j ACCEPT
# the following is only useful if you have a policy ACCEPT for INPUT
iptables -A INPUT  -p udp -m udp --dport 123 -j DROP
  • Wesley I think you've misunderstood me. I want to block foreign hosts from all over the internet from being able to sync to my ntp server. I'll edit my question to make it more clear. – ndemou Dec 27 '14 at 22:39
  • @ndemou Updated. – Wesley Dec 27 '14 at 22:53
  • The subnet firewall solution is ideal but I need to ask the Cisco technician to fix it and this is harder than it seems :-( The host firewall solution seems wrong because it will also block replies from the ntp pool servers (they send replies back to UDP 123). I need some kind of stateful rule that will drop everything except replies to my queries (200_success comment made me first think about it). – ndemou Dec 27 '14 at 23:15
  • @ndemou It won't block the pool from talking to the host because established connections aren't blocked and the pool doesn't initiate the connection, your host does. – Wesley Dec 27 '14 at 23:17
  • 1
    Doh! I made the rule on the fly in my head so didn't check completely syntax. Specifics are left as an exercise for the reader. :P – Wesley Dec 27 '14 at 23:29
5

Basic ntp.conf for localnet serving look like that

####
driftfile       /etc/ntp.drift
disable         monitor
restrict -4     default kod nomodify nopeer noquery notrap
restrict -6     default kod nomodify nopeer noquery notrap
restrict        127.0.0.1
restrict        127.127.1.0
restrict -6     ::1

restrict        10.0.0.0    mask 255.0.0.0
restrict        172.16.0.0  mask 255.240.0.0
restrict        192.168.0.0 mask 255.255.0.0

server          0.pool.ntp.org       iburst
server          1.pool.ntp.org       iburst
server          2.pool.ntp.org       iburst
####

Two longest lines deny any access to the server by default and then other restric directives allow only specific hosts and subnets.

  • I've tried you're ntp.conf but the ntp server still serves clients all over the internet. (the two longest restrict lines only deny elevated access to the server - they don't deny plain time query access) – ndemou Dec 27 '14 at 23:08
  • Try to add the verb ignore to the lines – Kondybas Dec 28 '14 at 0:24
  • restrict lines apply to both clients and servers. So if I add ignore it will also ignore replies from pool.ntp.org (see: support.ntp.org/bin/view/Support/…) – ndemou Dec 28 '14 at 0:35
  • 2
    Proposed config was just copypasted from one of my servers where it is used for a while. And I'm absolutely sure that restrict directives applied only to the clients while servers are still accessible by local ntpd. You have to refer to the support.ntp.org/bin/view/Support/AccessRestrictions for further reading. – Kondybas Dec 28 '14 at 1:20
  • 1
    And yes, I was wrong with CIDR notation as far as my servers do not provide ntp service outside localhost. – Kondybas Dec 28 '14 at 1:26
0

I didn't find these answers terribly helpful, so here is what worked for me. This is on a machine running NTP 4.2.6p5

driftfile        /var/lib/ntp/ntp.drift
statsdir /var/log/ntpstats/

restrict    default ignore

restrict        127.0.0.1
restrict        127.127.1.0
restrict -6     ::1

restrict -4     <whitelist.ip.0>    mask    255.255.255.255
restrict -4     <whitelist.ip.1>    mask    255.255.255.255
restrict -4     <whitelist.ip.2>    mask    255.255.255.255 

server      0.pool.ntp.org  iburst nomodify notrap nopeer noquery
restrict    0.pool.ntp.org  iburst nomodify notrap nopeer noquery
server      1.pool.ntp.org  iburst nomodify notrap nopeer noquery
restrict    1.pool.ntp.org  iburst nomodify notrap nopeer noquery
server      2.pool.ntp.org  iburst nomodify notrap nopeer noquery
restrict    2.pool.ntp.org  iburst nomodify notrap nopeer noquery


statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

I know this is an old thread, but thought it might help someone. In the example, you should replace whitelist.ip.0, whitelist.ip.1, whitelist.ip.2 with your whitelisted hosts. You can obviously also modify the mask argument to allow, e.g., a /24 network

  • 2
    It's not necessary to repeat answers which have already been given by others. – Michael Hampton Apr 8 '18 at 23:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.