File: Configuration.html

package info (click to toggle)
proftpd 1.2.0pre9-4
  • links: PTS
  • area: main
  • in suites: slink
  • size: 2,392 kB
  • ctags: 2,648
  • sloc: ansic: 24,012; sh: 1,754; makefile: 536; perl: 281
file content (2241 lines) | stat: -rw-r--r-- 130,718 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>ProFTPD Configuration Directives</title>
</head>

<body bgcolor="#E7E4D8">
<h1><img src="images/proftpd.gif" width="215" height="50"><br>
  Configuration Directives</h1>
<p>The following configuration parameters control ProFTPD features and configuration:</p>
<ul>
  <li><a href="#AccessGrantMsg">AccessGrantMsg</a></li>
  <li><a href="#Allow">Allow</a></li>
  <li><a href="#AllowAll">AllowAll</a></li>
  <li><a href="#AllowFilter">AllowFilter</a></li>
  <li><a href="#AllowForeignAddress">AllowForeignAddress</a></li>
  <li><a href="#AllowGroup">AllowGroup</a></li>
  <li><a href="#AllowUser">AllowUser</a></li>
  <li><a href="#AllowOverwrite">AllowOverwrite</a></li>
  <li><a href="#AllowRetrieveRestart">AllowRetrieveRestart</a></li>
  <li><a href="#AllowStoreRestart">AllowStoreRestart</a></li>
  <li><a href="#AnonRequirePassword">AnonRequirePassword</a></li>
  <li><a href="#Anonymous">&lt;Anonymous&gt;</a></li>
  <li><a href="#AnonymousGroup">AnonymousGroup</a></li>
  <li><a href="#AuthAliasOnly">AuthAliasOnly</a></li>
  <li><a href="#AuthGroupFile">AuthGroupFile</a></li>
  <li><a href="#AuthPAMAuthoritative">AuthPAMAuthoritative</a></li>
  <li><a href="#AuthUserFile">AuthUserFile</a></li>
  <li><a href="#AuthUsingAlias">AuthUsingAlias</a></li>
  <li><a href="#Bind">Bind</a></li>
  <li><a href="#CDPath">CDPath</a></li>
  <li><a href="#CommandBufferSize">CommandBufferSize</a></li>
  <li><a href="#DefaultChdir">DefaultChdir</a></li>
  <li><a href="#DefaultRoot">DefaultRoot</a></li>
  <li><a href="#DefaultServer">DefaultServer</a></li>
  <li><a href="#DefaultTransferMode">DefaultTransferMode</a></li>
  <li><a href="#DeferWelcome">DeferWelcome</a></li>
  <li><a href="#Deny">Deny</a></li>
  <li><a href="#DenyAll">DenyAll</a></li>
  <li><a href="#DenyFilter">DenyFilter</a></li>
  <li><a href="#DenyGroup">DenyGroup</a></li>
  <li><a href="#DenyUser">DenyUser</a></li>
  <li><a href="#Directory">&lt;Directory&gt;</a></li>
  <li><a href="#DirFakeGroup">DirFakeGroup</a></li>
  <li><a href="#DirFakeMode">DirFakeMode</a></li>
  <li><a href="#DirFakeUser">DirFakeUser</a></li>
  <li><a href="#DisplayConnect">DisplayConnect</a></li>
  <li><a href="#DisplayFirstChdir">DisplayFirstChdir</a></li>
  <li><a href="#DisplayGoAway">DisplayGoAway</a></li>
  <li><a href="#DisplayLogin">DisplayLogin</a></li>
  <li><a href="#DisplayQuit">DisplayQuit</a></li>
  <li><a href="#DisplayReadme">DisplayReadme</a></li>
  <li><a href="#ExtendedLog">ExtendedLog</a></li>
  <li><a href="#Global">&lt;Global&gt;</a></li>
  <li><a href="#Group">Group</a></li>
  <li><a href="#GroupOwner">GroupOwner</a></li>
  <li><a href="#GroupPassword">GroupPassword</a></li>
  <li><a href="#HiddenStor">HiddenStor</a></li>
  <li><a href="#HideGroup">HideGroup</a></li>
  <li><a href="#HideNoAccess">HideNoAccess</a></li>
  <li><a href="#HideUser">HideUser</a></li>
  <li><a href="#IdentLookups">IdentLookups</a></li>
  <li><a href="#IgnoreHidden">IgnoreHidden</a></li>
  <li><a href="#Limit">&lt;Limit&gt;</a></li>
  <li><a href="#LDAPDN">LDAPDN</a></li>
  <li><a href="#LDAPDNPass">LDAPDNPass</a></li>
  <li><a href="#LDAPServer">LDAPServer</a></li>
  <li><a href="#LDAPNegativeCache">LDAPNegativeCache</a></li>
  <li><a href="#LDAPPrefix">LDAPPrefix</a></li>
  <li><a href="#LogFormat">LogFormat</a></li>
  <li><a href="#LoginPasswordPrompt">LoginPasswordPrompt</a></li>
  <li><a href="#LsDefaultOptions">LsDefaultOptions</a></li>
  <li><a href="#MaxClients">MaxClients</a></li>
  <li><a href="#MaxClientsPerHost">MaxClientsPerHost</a></li>
  <li><a href="#MaxInstances">MaxInstances</a></li>
  <li><a href="#MaxLoginAttempts">MaxLoginAttempts</a></li>
  <li><a href="#MultilineRFC2228">MultilineRFC2228</a></li>
  <li><a href="#Order">Order</a></li>
  <li><a href="#PAMConfig">PAMConfig</a></li>
  <li><a href="#PathAllowFilter">PathAllowFilter</a></li>
  <li><a href="#PathDenyFilter">PathDenyFilter</a></li>
  <li><a href="#PersistentPasswd">PersistentPasswd</a></li>
  <li><a href="#Port">Port</a></li>
  <li><a href="#RateReadBPS">RateReadBPS</a></li>
  <li><a href="#RateReadFreeBytes">RateReadFreeBytes</a></li>
  <li><a href="#RateReadHardBPS">RateReadHardBPS</a></li>
  <li><a href="#RateWriteBPS">RateWriteBPS</a></li>
  <li><a href="#RateWriteFreeBytes">RateWriteFreeBytes</a></li>
  <li><a href="#RateWriteHardBPS">RateWriteHardBPS</a></li>
  <li><a href="#RequireValidShell">RequireValidShell</a></li>
  <li><a href="#RootLogin">RootLogin</a></li>
  <li><a href="#ScoreboardPath">ScoreboardPath</a></li>
  <li><a href="#ServerAdmin">ServerAdmin</a></li>
  <li><a href="#ServerIdent">ServerIdent</a></li>
  <li><a href="#ServerName">ServerName</a></li>
  <li><a href="#ServerType">ServerType</a></li>
  <li><a href="#ShowDotFiles">ShowDotFiles</a></li>
  <li><a href="#ShowSymlinks">ShowSymlinks</a></li>
  <li><a href="#SocketBindTight">SocketBindTight</a></li>
  <li><a href="#SyslogFacility">SyslogFacility</a></li>
  <li><a href="#SystemLog">SystemLog</a></li>
  <li><a href="#tcpBackLog">tcpBackLog</a></li>
  <li><a href="#tcpNoDelay">tcpNoDelay</a></li>
  <li><a href="#tcpReceiveWindow">tcpReceiveWindow</a></li>
  <li><a href="#tcpSendWindow">tcpSendWindow</a></li>
  <li><a href="#TimeoutIdle">TimeoutIdle</a></li>
  <li><a href="#TimeoutLogin">TimeoutLogin</a></li>
  <li><a href="#TimeoutNoTransfer">TimeoutNoTransfer</a></li>
  <li><a href="#TimeoutStalled">TimeoutStalled</a></li>
  <li><a href="#TransferLog">TransferLog</a></li>
  <li><a href="#Umask">Umask</a></li>
  <li><a href="#UseFtpUsers">UseFtpUsers</a></li>
  <li><a href="#UseReverseDNS">UseReverseDNS</a></li>
  <li><a href="#User">User</a></li>
  <li><a href="#UserDirRoot">UserDirRoot</a></li>
  <li><a href="#UserAlias">UserAlias</a></li>
  <li><a href="#UserPassword">UserPassword</a></li>
  <li><a href="#VirtualHost">&lt;VirtualHost&gt;</a></li>
  <li><a href="#WtmpLog">WtmpLog</a></li>
</ul>
<hr>
<h2><a name="AccessGrantMsg">AccessGrantMsg</a></h2>
<p><strong>Syntax:</strong> AccessGrantMsg <em>message</em><br>
  <strong>Default:</strong> Dependent on login type<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 0.99.0pl5 and later</p>
<p>Normally, a 230 response message is sent to an FTP client immediately after 
  authentication, with a standard message indicating that the user has either 
  logged in or that anonymous access has been granted. This <em><strong>message</strong></em> 
  can be customized with the AccessGrantMsg directive. In the message argument, 
  the magic cookie '%u' is replaced with the username specified by the client 
  during login. Example:</p>
<p><code>AccessGrantMsg &quot;Guest access granted for %u.&quot;</code></p>
<hr>
<h2><a name="Allow">Allow</a></h2>
<p><strong>Syntax:</strong> Allow <em>[&quot;from&quot;] &quot;all&quot;|&quot;none&quot;|host|network[,host|network[,...]]</em><br>
  <strong>Default:</strong> <code>Allow from all</code><br>
  <strong>Context:</strong> &lt;Limit&gt;<br>
  <strong>Compatibility:</strong> 0.99.0pl6 and later</p>
<p>The Allow directive is used inside a <a href="#Limit">&lt;Limit&gt;</a> context 
  to explicitly specify which hosts and/or networks have access to the commands 
  or operations being limited. Allow is typically used in conjuction with <a href="#Order">Order</a> 
  and <a
href="#Deny">Deny</a> in order to create sophisticated (or perhaps not-so-sophisticated) 
  access control rules. Allow takes an optional first argument; the keyword <em><strong>from</strong></em>. 
  Using <em><strong>from</strong></em> is purely cosmetic. The remaining arguments 
  are expected to be a list of hosts and networks which will be explicitly granted 
  access. The magic keyword <em><strong>all</strong></em> can be used to indicate 
  that all hosts will explicitly be granted access (analogous to the AllowAll 
  directive, except with a lower priority). Additionally, the magic keyword <em><strong>none</strong></em> 
  can be used to indicate that no hosts or networks will be explicitly granted 
  access (although this does not prevent them from <em>implicitly</em> being granted 
  access). If <em><strong>all</strong></em> or <em><strong>none</strong></em> 
  is used, no other hosts or networks can be supplied.</p>
<p>Host and network addresses can be specified by name or numeric address. <strong>For 
  security reasons, it is recommended that all address information be supplied 
  numerically. Relying solely on named addresses causes security to depend a great 
  deal upon DNS servers which may themselves be vulnerable to attack or spoofing.</strong> 
  Numeric addresses which specify an entire network should end in a trailing period 
  (i.e. 10.0.0. for the entire 10.0.0 subnet). Named address which specify an 
  entire network should begin with a trailing period (i.e. .proftpd.org for the 
  entire proftpd.org domain).</p>
<p>Example:</p>
<p><code>&lt;Limit LOGIN&gt;<br>
  Order Allow,Deny<br>
  Allow from 128.44.26.,128.44.26.,myhost.mydomain.edu,.trusted-domain.org<br>
  Deny from all<br>
  &lt;/Limit&gt;</code></p>
<hr>
<h2><a name="AllowAll">AllowAll</a></h2>
<p><strong>Syntax:</strong> AllowAll<br>
  <strong>Default:</strong> Default is to implicitly AllowAll, but not explicitly<br>
  <strong>Context:</strong> &lt;Directory&gt;, &lt;Anonymous&gt;, &lt;Limit&gt;, 
  .ftpaccess<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The AllowAll directive <strong>explicitly</strong> allows access to a <a href="reference.html#Directory">&lt;Directory&gt;</a>, 
  <a href="reference.html#Anonymous">&lt;Anonymous&gt;</a> or <a
href="reference.html#Limit">&lt;Limit&gt;</a> block. Although proftpd's default 
  behavior is to allow access to a particular object, the default is an implicit 
  allow. AllowAll creates an explicit allow, overriding any higher level denial 
  directives.</p>
<hr>
<h2><a name="AllowFilter">AllowFilter</a></h2>
<p><strong>Syntax:</strong> AllowFilter <em>regular-expression</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre7 and later</p>
<p>AllowFilter allows the configuration of a regular expression that <strong>must</strong> 
  be matched for all commands sent to ProFTPD. It is extremely useful in controlling 
  what characters may be sent in a command to ProFTPD, preventing some possible 
  types of attacks against ProFTPD. The regular expression is applied against 
  the entire command sent by the client, so care must be taken when creating a 
  proper regex. Commands that fail the regex match result in a "Forbidden command" 
  error being returned to the client.</p>
<p>If the <strong><i>regular-expression</i></strong> argument contains whitespace, 
  it must be enclosed in quotes.</p>
<p>Example:</p>
<p><code># Only allow commands containing alphanumeric characters and whitespace<br>
  AllowFilter &quot;.*/[a-zA-Z0-9 ]+$&quot;</code></p>
<p><strong>See Also:</strong> <a href="#DenyFilter">DenyFilter</a></p>
<hr>
<h2><a name="AllowForeignAddress">AllowForeignAddress</a></h2>
<p><strong>Syntax:</strong> AllowForeignAddress <em>on|off</em><br>
  <strong>Default:</strong> <code>AllowForeignAddress off</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.1.7 and later</p>
<p>Normally, proftpd disallows clients from using the ftp PORT command with anything 
  other than their own address (the source address of the ftp control connection), 
  as well as preventing the use of PORT to specify a low-numbered (&lt; 1024) 
  port. In either case, the client is sent an &quot;Invalid port&quot; error and 
  a message is syslog'd indicating either &quot;address mismatch&quot; or &quot;bounce 
  attack&quot;. By enabling this directive, proftpd will allow clients to transmit 
  foreign data connection addresses that do not match the client's address. This 
  allows such tricks as permitting a client to transfer a file between two FTP 
  servers without involving itself in the actual data connection. Generally it's 
  considered a bad idea, security-wise, to permit this sort of thing.</p>
<p>AllowForeignAddress <strong>only</strong> affects data connection addresses; 
  not tcp ports. There is no way (and no valid reason) to allow a client to use 
  a low-numbered port in it's PORT command.</p>
<hr>
<h2><a name="AllowGroup">AllowGroup</a></h2>
<p><strong>Syntax:</strong> AllowGroup <em>group-expression</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> &lt;Limit&gt;<br>
  <strong>Compatibility:</strong> 1.1.1 and later</p>
<p>AllowGroup specifies a <em><strong>group-expression</strong></em> that is specifically 
  permitted within the context of the <a
href="#Limit">&lt;Limit&gt;</a> block it is applied to. <em><strong>group-expression</strong></em> 
  has the same format as that used in <a href="#DefaultRoot">DefaultRoot</a>, 
  in that it should contain a comma seperated list of groups or &quot;not&quot; 
  groups (by prefixing a group name with the `!' character) that are to be allowed 
  access to the block. The expression is parsed as a boolean &quot;and&quot; list, 
  meaning that ALL elements of the expression must evaluate to logically true 
  in order for the explicit allow to apply.</p>
<p><strong>See Also:</strong> <a href="#DenyGroup">DenyGroup</a>, <a href="#DenyUser">DenyUser</a>, 
  <a href="#AllowUser">AllowUser</a></p>
<hr>
<h2><a name="AllowUser">AllowUser</a></h2>
<p><strong>Syntax:</strong> AllowUser <em>user-expression</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> &lt;Limit&gt;<br>
  <strong>Compatibility:</strong> 1.1.7 and later</p>
<p>AllowUser specifies a <em><strong>user-expression</strong></em> that is specifically 
  permitted access within the context of the <a href="#Limit">&lt;Limit&gt;</a> 
  block it is applied to. <em><strong>user-expression</strong></em> has a similar 
  syntax as that used in <a href="#AllowGroup">AllowGroup</a>, in that it should 
  contain a comma delimited list of users or &quot;not&quot; users (by prefixing 
  a user name with the `!' character) that are to be allowed access to the block. 
  The expression is parsed as a boolean &quot;and&quot; list, meaning that ALL 
  elements of the expression must evaluate to logically true in order to the explicit 
  allow to apply.</p>
<p><strong>See Also:</strong> <a href="#DenyUser">DenyUser</a>, <a href="#DenyGroup">DenyGroup</a>, 
  <a href="#AllowGroup">AllowGroup</a></p>
<hr>
<h2><a name="AllowOverwrite">AllowOverwrite</a></h2>
<p><strong>Syntax:</strong> AllowOverwrite <em>on|off</em><br>
  <strong>Default:</strong> <code>AllowOverwrite off</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Directory&gt;, &lt;Global&gt;, .ftpaccess<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The AllowOverwrite directive permits newly transfered files to overwrite existing 
  files. By default, ftp clients cannot overwrite existing files.</p>
<hr>
<h2><a name="AnonRequirePassword">AnonRequirePassword</a></h2>
<p><strong>Syntax:</strong> AnonRequirePassword <em>on|off</em><br>
  <strong>Default:</strong> <code>AnonRequirePassword off</code><br>
  <strong>Context:</strong> &lt;Anonymous&gt;<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>Normally, anonymous FTP logins do not require the client to authenticate themselves 
  via the normal method of a transmitted cleartext password which is hashed and 
  matched against an existing system user's password. Instead, anonymous logins 
  are expected to enter their e-mail address when prompted for a password. Enabling 
  the AnonRequirePassword directive requires anonymous logins to enter a valid 
  password which must match the password of the user that the anonymous daemon 
  runs as.  However using <a href="#AuthUsingAlias">AuthUsingAlias</a>
  authentication can be matched against the password of the login username.
  This can be used to create &quot;guest&quot; accounts, which function
  exactly as normal anonymous logins do (and thus present a
  &quot;chrooted&quot; 
  protected file system to the client), but require a valid password on the server's 
  host system.</p>
<p>Example of a &quot;guest&quot; account configuration:</p>
<blockquote> 
  <p><code>&lt;Anonymous ~roger&gt;<br>
    User roger<br>
    Group other<br>
    UserAlias proftpd roger<br>
    AnonRequirePassword on<br>
    # Deny write operations to all directories, underneath root-dir<br>
    # Default is to allow, so we don't need a &lt;Limit&gt; for read operations.<br>
    &lt;Directory *&gt;<br>
    &lt;Limit WRITE&gt;<br>
    DenyAll<br>
    &lt;/Limit&gt;<br>
    &lt;/Directory&gt;<br>
    # Deny all read/write operations in incoming. Because these are command-group<br>
    # limits, we can explicitly permit certain operations which will take precedance<br>
    # over our group limit.<br>
    &lt;Directory incoming&gt;<br>
    &lt;Limit READ WRITE&gt;<br>
    DenyAll<br>
    &lt;/Limit&gt;<br>
    # The only command allowed in incoming is STOR (transfer file from client 
    to server)<br>
    &lt;Limit STOR&gt;<br>
    AllowAll<br>
    &lt;/Limit&gt;<br>
    &lt;/Directory&gt;<br>
    &lt;/Anonymous&gt;</code></p>
</blockquote>
<hr>
<h2><a name="AllowRetrieveRestart">AllowRetrieveRestart</a></h2>
<p><strong>Syntax:</strong> AllowRetrieveRestart <em>on|off</em><br>
  <strong>Default:</strong> <code>AllowRetrieveRestart on</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Directory&gt;, &lt;Global&gt;, .ftpaccess<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The AllowRetrieveRestart directive permits or denies clients from performing 
  &quot;restart&quot; retrieve file transfers via the FTP REST command. By default 
  this is enabled, so that clients may resume interrupted file transfers at a 
  later time without losing previously collected data.</p>
<hr>
<h2><a name="AllowStoreRestart">AllowStoreRestart</a></h2>
<p><strong>Syntax:</strong> AllowStoreRestart <em>on|off</em><br>
  <strong>Default:</strong> <code>AllowStoreRestart off</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Directory&gt;, &lt;Global&gt;, .ftpaccess<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The AllowStoreRestart directive permits or denies clients from &quot;restarting&quot; 
  interrupted store file transfers (those sent from client to server). By default 
  restarting (via the REST command) is not permitted when sending files to the 
  server. Care should be taken to disallow anonymous ftp &quot;incoming&quot; 
  transfers to be restarted, as this will allow clients to corrupt or increase 
  the size of previously stored files (even if not their own).</p>
<hr>
<h2><a name="Anonymous">&lt;Anonymous&gt;</a></h2>
<p><strong>Syntax:</strong> &lt;Anonymous <em>root-directory</em>&gt;<br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config,&lt;VirtualHost&gt;<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The Anonymous configuration block is used to create an anonymous FTP login, 
  and is terminated by a matching &lt;/Anonymous&gt; directive. The root-directory 
  parameters specifies which directory the daemon will first chdir to, and then 
  chroot, immediately after login. Once the chroot operation successfully completes, 
  higher level directories are no longer accessible to the running child daemon 
  (and thus the logged in user). By default, proftpd assumes an anonymous login 
  if the remote client attempts to login as the currently running user; unless 
  the current user is root, in which case anonymous logins are not allowed regardless 
  of the presence of an &lt;Anonymous&gt; block. To force anonymous logins to 
  be bound to a user other than the current user, see the <a
href="reference.html#User">User</a> and <a
href="reference.html#Group">Group</a> directives. In addition, if a <a href="reference.html#User">User</a> 
  or <a
href="reference.html#Group">Group</a> directive is present in an &lt;Anonymous&gt; 
  block, the daemon permanently switches to the specified uid/gid before chroot()ing.</p>
<p>Normally, anonymous logins are not required to authenticate with a password, 
  but are expected to enter a valid e-mail address in place of a normal password 
  (which is logged). If this behavior is undesirable for a given &lt;Anonymous&gt; 
  configuration block, it can be overridden via the <a
href="reference.html#AnonRequirePassword">AnonRequirePassword</a> directive.</p>
<p><u>Note: Chroot()ed anonymous directories do </u><strong><u>not</u></strong><u> 
  need to have supplemental system files in them, nor do they need to have any 
  sort of specific directory structure.</u> This is because proftpd is designed 
  to acquire as much system information as possible <strong>before</strong> the 
  chroot, and to leave open those files which are needed for normal operation 
  and reside outside the new root directory.</p>
<p>Example of a typical anonymous FTP configuration:</p>
<blockquote> 
  <p align="left"><code>&lt;Anonymous /home/ftp&gt;<br>
    User ftp # After anonymous login, daemon runs as user ftp.<br>
    Group ftp # After anonymous login, daemon runs as group ftp.<br>
    UserAlias anonymous ftp # Client login as 'anonymous' is aliased to 'ftp'.<br>
    # Deny write operations to all directories, underneath root-dir<br>
    # Default is to allow, so we don't need a &lt;Limit&gt; for read operations.<br>
    &lt;Directory *&gt;<br>
    &lt;Limit WRITE&gt;<br>
    DenyAll<br>
    &lt;/Limit&gt;<br>
    &lt;/Directory&gt;<br>
    &lt;Directory incoming&gt;<br>
    &lt;Limit READ WRITE&gt;<br>
    DenyAll<br>
    &lt;/Limit&gt;<br>
    &lt;Limit STOR&gt;<br>
    AllowAll<br>
    &lt;/Limit&gt;<br>
    &lt;/Directory&gt;<br>
    &lt;/Anonymous&gt;</code></p>
</blockquote>
<hr>
<h2><a name="AnonymousGroup">AnonymousGroup</a></h2>
<p><strong>Syntax:</strong> AnonymousGroup <em>group-expression</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.1.3 and later</p>
<p>The AnonymousGroup directive specifies a <em><strong>group-expression</strong></em> 
  to which all matching users will be considered anonymous logins. The <em><strong>group-expression</strong></em> 
  argument is a boolean logically ANDed list of groups to which the user must 
  be a member of (or non-member if the group name is prefixed with a `!' character). 
  For more information on group-expressions see the <a href="#DefaultRoot">DefaultRoot</a> 
  directive.</p>
<p>If the authenticating user is matched by an AnonymousGroup directive, no valid 
  password is required, and a special dynamic anonymous configuration is created, 
  with the user's home directory as the default root directory. If a <a
href="#DefaultRoot">DefaultRoot</a> directive also applies to the user, this directory 
  is used instead of the user's home dir.</p>
<p><em><strong>Great care should be taken when using AnonymousGroup, as improper 
  configuration can open up user home directories to full read/write access to 
  the entire world.</strong></em></p>
<hr>
<h2><a name="AuthAliasOnly">AuthAliasOnly</a></h2>
<p><strong>Syntax:</strong> AuthAliasOnly <em>on|off</em><br>
  <strong>Default:</strong> <code>AuthAliasOnly off</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.1.3 and later</p>
<p>AuthAliasOnly restricts authenication to &quot;aliased&quot; logins only; i.e. 
  those usernames provided by clients which are &quot;mapped&quot; to a real userid 
  by the <a href="#UserAlias">UserAlias</a> directive. Turning AuthAliasOnly `<em><strong>on</strong></em>' 
  in a particular context will cause proftpd to completely ignore all non-aliased 
  logins for the entire context. If no contexts are available without AuthAliasOnly 
  set to `<em><strong>on</strong></em>', proftpd rejects the client login and 
  sends an appropriate message to syslog.</p>
<hr>
<h2><a name="AuthGroupFile">AuthGroupFile</a></h2>
<p><strong>Syntax:</strong> AuthGroupFile <em>path</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.0.3/1.1.1 and later</p>
<p>AuthGroupFile specifies an alternate groups file, having the same format as 
  the system /etc/group file, and if specified is used during authentication and 
  group lookups for directory/access control operations. The <em><strong>path</strong></em> 
  argument should be the <strong>full path</strong> to the specified file. AuthGroupFile 
  can be configured on a per-VirtualHost basis, so that virtual FTP servers can 
  each have their own authentication database (most often used in conjuction with 
  <a
href="#AuthUserFile">AuthUserFile</a>).</p>
<p><strong>Note that this file need not reside inside a chroot()ed directory structure 
  for Anonymous or DefaultRoot logins, as it is held open for the duration of 
  client connections.</strong></p>
<hr>
<h2><a name="AuthPAMAuthoritative">AuthPAMAuthoritative</a></h2>
<p><strong>Syntax:</strong> AuthPAMAuthoritative <em>on|off</em><br>
  <strong>Default:</strong> off<br>
  <strong>Context:</strong> server config,&lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre3 and later</p>
<p> This directive allows you to control whether or not PAM is the ultimate authority 
  on authentication. Setting this directive to <em>on</em> will cause authentication 
  to fail if PAM authentication fails. The default setting, <em>off</em>, allows 
  other modules and directives such as <a href="#AuthUserFile">AuthUserFile</a> 
  and friends to authenticate users, should PAM authentication fail. </p>
<p><strong>If you are having problems with PAM and using other directives like 
  <a href="#AuthUserFile">AuthUserFile</a>, set this directive to <em>off</em>.</strong></p>
<hr>
<h2><a name="AuthUserFile">AuthUserFile</a></h2>
<p><strong>Syntax:</strong> AuthUserFile <em>path</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config,&lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.0.3/1.1.1 and later</p>
<p>AuthUserFile specifies an alternate passwd file, having the same format as 
  the system /etc/passwd file, and if specified is used during authentication 
  and user lookups for directory/access control operations. The <em><strong>path</strong></em> 
  argument should be the <strong>full path</strong> to the specified file. AuthUserFile 
  can be configured on a per-VirtualHost basis, so that virtual FTP servers can 
  each have their own authentication database (most often used in conjuction with 
  <a
href="#AuthGroupFile">AuthGroupFile</a>).</p>
<p><strong>Note that this file need not reside inside a chroot()ed directory structure 
  for Anonymous or DefaultRoot logins, as it is help open for the duration of 
  client connections.</strong></p>
<hr>
<h2><a name="AuthUsingAlias">AuthUsingAlias</a></h2>

<p><strong>Syntax:</strong> AuthUsingAlias <em>on|off</em><br>
<strong>Default:</strong> <code>AuthUsingAlias off</code><br>
<strong>Context:</strong> &lt;Anonymous&gt;<br>
<strong>Compatibility:</strong> 1.2.0pre9 and later</p>

<p>Normally, when the <a href="#AnonRequirePassword">AnonRequirePassword</a>
directive is used, the authentication is done using the password entry of
the daemon process. However under certain circumstances it may be required
for the authentication to be done using the login username & password instead.</p>

<p>An example of an <a href="#Anonymous">Anonymous</a> configuration using
AuthUsingAlias</p>

<blockquote>
    <p># Basic Read-Only Anonymous Configuration.<br><br>
    <code>&lt;Anonymous /home/ftp&gt;<br>
    UserAlias             anonymous  nobody<br>
    UserAlias             ftp        nobody<br>
    AuthAliasOnly         on<br>
    &lt;Limit WRITE&gt;<br>
    DenyAll<br>
    &lt;/Limit&gt;<br>
    &lt;/Anonymous&gt;<br><br>
    # Give Full Read-Write Anonymous Access to certain users<br><br>
    &lt;Anonymous /home/ftp&gt;<br>
    AnonRequirePassword   on<br>
    AuthAliasOnly         on<br>
    AuthUsingAlias        on<br>
    # The list of authorized users.<br>
    # user/pass lookup is for each user, not password entry<br>
    # of server <i>uid</i> ('nobody' in this example).<br>
    UserAlias             fred       nobody<br>
    UserAlias             joe        nobody<br>
    &lt;Limit ALL&gt;<br>
    AllowAll<br>
    &lt;/Limit&gt;<br>
    &lt;/Anonymous&gt;</code></p>
</blockquote>
<hr>
<h2><a name="Bind">Bind</a></h2>
<p><strong>Syntax:</strong> Bind <em>address</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;<br>
  <strong>Compatibility:</strong> 1.1.6 and later</p>
<p>The Bind directive allows additional IP addresses to be bound to a main or 
  <a href="#VirtualHost">VirtualHost</a> configuration. Multiple Bind directives 
  can be used to bind multiple addresses. The <strong><em>address</em></strong> 
  argument should be either a fully qualified domain name or a numeric dotted-quad 
  IP address. Incoming connections destined to an additional address added by 
  Bind are serviced by the context containing the directive. Additionally, if 
  <a href="#SocketBindTight">SocketBindTight</a> is set to <strong><em>on</em></strong>, 
  a specific listen connection is created for each additional address.</p>
<hr>
<h2><a name="CDPath">CDPath</a></h2>
<p><strong>Syntax:</strong> CDPath <em>directory</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre2 and later</p>
<p>Adds an entry to a search path that is used when changing directories. For 
  example: 
<pre>
  CDPath    /home/public
  CDPath    /var/devel
</pre>
This allows a user to cd into any directory directly under /home/public or /var/devel, 
provided they have the appropriate rights. So, if /home/public/proftpd exists, 
<code>cd proftpd</code> will bring the user to that directory, regardless of where 
they currently are in the directory tree.
<p></p>
<hr>
<h2><a name="CommandBufferSize">CommandBufferSize</a></h2>
<p><strong>Syntax:</strong> CommandBufferSize <em>size</em><br>
  <strong>Default:</strong> <code>None</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre7 and later</p>
<p>The CommandBufferSize directive controls the maximum command length permitted 
  to be sent to the server. This allows you to effectively control what the longest 
  command the server may accept it, and can help protect the server from various 
  Denial of Service or resource-consumption attacks. </p>

<hr>

<h2><a name="DefaultChdir">DefaultChdir</a></h2>

<p><strong>Syntax:</strong> DefaultChdir <em>directory
  [group-expression]</em><br>
  <strong>Default:</strong> ~<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;,
  &lt;Anonymous&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre2 and later</p>

<p>Determines the directory a user is placed in after logging in.
  By default, the user is put in their home directory.  The specified
  directory can be relative to the user's home directory.</p>

<p><strong>NOTE:</strong> if the specifed directory is not available
  the user will not be able to log in.</p>

<hr>

<h2><a name="DefaultRoot">DefaultRoot</a></h2>

<p><strong>Syntax:</strong> DefaultRoot <em>directory [group-expression]</em><br>
  <strong>Default:</strong> <code>DefaultRoot /</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 0.99.0pl7 and later</p>
<p>The DefaultRoot directive controls the default root directory assigned to a 
  user upon login. If DefaultRoot is set to a directory other than &quot;/&quot;, 
  a chroot operation is performed immediately after a client authenticates. This 
  can be used to effectively isolate the client from a portion of the host system 
  filespace. The specified root directory must begin with a / or can be the magic 
  character '~'; meaning that the client is chroot jailed into their home directory. 
  If the DefaultRoot directive specifies a directory which disallows access to 
  the logged-in user's home directory, the user's current working directory after 
  login is set to the DefaultRoot instead of their normal home directory. DefaultRoot 
  cannot be used in <a
href="#Anonymous">&lt;Anonymous&gt;</a> configuration blocks, as the <a href="#Anonymous">&lt;Anonymous&gt;</a> 
  directive explicitly contains a root directory used for <a
href="#Anonymous">Anonymous</a> logins.</p>
<p>The special character '~' is replaced with the authenticating user's home directory 
  immediately after login. Note that the default root may be a subdirectory of 
  the home directory, such as &quot;~/anon-ftp&quot;.</p>
<p>The optional <em><strong>group-expression</strong></em> argument can be used 
  to restrict the DefaultRoot directive to a unix group, groups or subset of groups. 
  The expression takes the format: [!]group-name1[,[!]group-name2[,...]]. The 
  expression is parsed in a logical boolean AND fashion, such that each member 
  of the expression must evaluate to logically TRUE in order for the DefaultRoot 
  directive to apply. The special character '!' is used to negate group membership.</p>
<p>Care should be taken when using DefaultRoot. Chroot &quot;jails&quot; should 
  not be used as methods for implementing general system security as there are 
  potentially ways that a user can &quot;escape&quot; the jail.</p>
<p>Example of a DefaultRoot configuration:</p>
<blockquote> 
  <p><code>ServerName &quot;A test ProFTPD Server&quot;<br>
    ServerType inetd<br>
    User ftp<br>
    Group ftp<br>
    #<br>
    # This causes proftpd to perform a chroot into the authenticating user's directory 
    immediately after login.<br>
    # Once this happens, the user is unable to &quot;see&quot; higher level directories.<br>
    # Because a group-expression is included, only users who are a member of<br>
    # the group 'users' and NOT a member of 'staff' will have their default<br>
    # root directory set to '~'.<br>
    DefaultRoot ~ users,!staff<br>
    ... </code></p>
</blockquote>
<hr>
<h2><a name="DefaultServer">DefaultServer</a></h2>
<p><strong>Syntax:</strong> DefaultServer <em>on|off</em><br>
  <strong>Default:</strong> <code>DefaultServer off</code><br>
  <strong>Context:</strong> server config,&lt;VirtualHost&gt;<br>
  <strong>Compatibility:</strong> 0.99.0pl6 and later</p>
<p>The DefaultServer directive controls which server configuration is used as 
  the default when an incoming connection is destined for an IP address which 
  is neither the host's primary IP address or one of the addresses specified in 
  a <a
href="#VirtualHost">&lt;VirtualHost&gt;</a> configuration block. Normally such 
  &quot;unknown&quot; connections are issued a &quot;no server available to service 
  your request&quot; message and disconnected. When DefaultServer is turned <em><strong>on</strong></em> 
  for either the primary server configuration or a virtual server, all unknown 
  destination connections are serviced by the default server. Only a single server 
  configuration can be set to default.</p>
<hr>
<h2><a name="DefaultTransferMode">DefaultTransferMode</a></h2>
<p><strong>Syntax:</strong> DefaultTransferMode <em>ascii|binary</em><br>
  <strong>Default:</strong> <code>DefaultTransferMode ascii</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre9 and later</p>
<p>DefaultTransferMode sets the default transfer mode of the server.  By default, 
  carriage-return/linefeed translation will be performed (ASCII mode).
</p>
<hr>
<h2><a name="DeferWelcome">DeferWelcome</a></h2>
<p><strong>Syntax:</strong> DeferWelcome <em>on|off</em><br>
  <strong>Default:</strong> <code>DeferWelcome off</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The DeferWelcome directive configures a master or <a
href="reference.html#VirtualHost">virtual server</a> to delay transmitting the 
  <a href="reference.html#ServerName">ServerName</a> and address to new connections, 
  until a client has successfully authenticated. If enabled, the initial welcome 
  message will be exceedingly generic and will not give away any type of information 
  about the host that the daemon is actively running on. This can be used by security-conscious 
  administrators to limit the amount of &quot;probing&quot; possible from non-trusted 
  networks/hosts.</p>
<hr>
<h2><a name="Deny">Deny</a></h2>
<p><strong>Syntax:</strong> Deny <em>[&quot;from&quot;] &quot;all&quot;|&quot;none&quot;|host|network[,host|network[,...]]</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> &lt;Limit&gt;<br>
  <strong>Compatibility:</strong> 0.99.0pl6 and later</p>
<p>The Deny directive is used to create a list of hosts and/or networks which 
  will explicitly be denied access to a given <a
href="#Limit">&lt;Limit&gt;</a> context block. The magic keywords <em><strong>all</strong></em> 
  and <em><strong>none</strong></em> can be used to indicate that all hosts are 
  denied access, or that no hosts are explicitly denied (respectively). For more 
  information on the syntax and usage of Deny see: <a href="#Allow">Allow</a> 
  and <a href="#Order">Order</a>.</p>
<hr>
<h2><a name="DenyAll">DenyAll</a></h2>
<p><strong>Syntax:</strong> DenyAll<br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> &lt;Directory&gt;, &lt;Anonymous&gt;, &lt;Limit&gt;, 
  .ftpaccess<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The DenyAll directive is analogous to a combination of &quot;<em>order deny,allow</em> 
  &lt;cr&gt; <em>deny from all</em>&quot;, with the exception that it has a higher 
  precendance when parsed. It is provided as a convenient method of completely 
  denying access to a directory, anonymous ftp or limit block. Because of it's 
  precedance, it should not be intermixed with normal <a
href="reference.html#Order">Order</a>/<a
href="reference.html#Deny">Deny</a> directives. The DenyAll directive can be overridden 
  at a lower level directory by using <a
href="reference.html#AllowAll">AllowAll</a>. DenyAll and <a
href="reference.html#AllowAll">AllowAll</a> are mutually exclusive.</p>
<hr>
<h2><a name="DenyFilter">DenyFilter</a></h2>
<p><strong>Syntax:</strong> DenyFilter <em>regular-expression</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre7 and later</p>
<p>Similar to <a href="#AllowFilter">AllowFilter</a>, DenyFilter specifies a regular 
  expression which must <strong>not</strong> match any command. If the regex does 
  match, a "Forbidden command" error is returned to the client. This can be especially 
  useful for forbidding certain command combinations from ever reaching ProFTPD.</p>
<p>Example:</p>
<p><code># We don't want to allow any commands with % being sent to the server<br>
  DenyFilter &quot;%&quot;</code></p>
<p><strong>See Also:</strong> <a href="#AllowFilter">AllowFilter</a></p>
<hr>
<h2><a name="DenyGroup">DenyGroup</a></h2>
<p><strong>Syntax:</strong> DenyGroup <em>group-expression</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> &lt;Limit&gt;<br>
  <strong>Compatibility:</strong> 1.1.1 and later</p>
<p>DenyGroup specifies a <em><strong>group-expression</strong></em> that is specifically 
  denied within the context of the <a
href="#Limit">&lt;Limit&gt;</a> block it is applied to. <em><strong>group-expression</strong></em> 
  has the same format as that used in <a href="#DefaultRoot">DefaultRoot</a>, 
  in that it should contain a comma seperated list of groups or &quot;not&quot; 
  groups (by prefixing a group name with the `!' character) that are to be denied 
  access to the block. The expression is parsed as a boolean &quot;and&quot; list, 
  meaning that ALL elements of the expression must evaluate to logically true 
  in order for the explicit deny to apply.</p>
<p><strong>See Also:</strong> <a href="#AllowGroup">AllowGroup</a>, <a href="#AllowUser">AllowUser</a>, 
  <a href="#DenyUser">DenyUser</a></p>
<hr>
<h2><a name="DenyUser">DenyUser</a></h2>
<p><strong>Syntax:</strong> DenyUser <em>user-expression</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> &lt;Limit&gt;<br>
  <strong>Compatibility:</strong> 1.1.7 and later</p>
<p><a><a href="#DenyUser">DenyUser specifies a <em><strong>user-expression</strong></em> 
  that is specifically denied within the context of the </a></a><a><a
href="#Limit">&lt;Limit&gt;</a> block it is applied to. <em> <strong>user-expression</strong></em> 
  is a comma delimited list of users or &quot;not&quot; users (by prefixing a 
  user name with the `!' character). The expression is parsed as a boolean &quot;and&quot; 
  list, meaning that all elements of the expression must evaluate to logically 
  true in order for the explicit deny to apply.</a></p>
<a> 
<p><strong>See Also:</strong> <a href="#AllowUser">AllowUser</a>, <a href="#DenyGroup">DenyGroup</a>, 
  <a href="#AllowGroup">AllowGroup</a></p>
<hr>
<h2><a name="Directory">&lt;Directory&gt;</a></h2>
<p><strong>Syntax:</strong> &lt;Directory <em>pathname&gt;</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>This directive creates a block of configuration directives which applies only 
  to the specified directory and it's sub-directories. The block is ended with 
  &lt;/Directory&gt;. Per-directory configuration is enabled during run-time with 
  a &quot;closest&quot; match algorithm, meaning that the &lt;Directory&gt; directive 
  with the closest matching path to the actual pathname of the file or directory 
  in question is used. Per-directory configuration is inherited by all sub-directories 
  until a closer matching &lt;Directory&gt; is encountered, at which time the 
  original per-directory configuration is replaced with the closer match. Note 
  that this does not apply to <a
href="reference.html#Limit">&lt;Limit&gt;</a> &lt;/Limit&gt; blocks, which are 
  inherited by all sub-directories until a &lt;Limit&gt; block is reached in a 
  closer match.</p>
<blockquote> 
  <p>Example:<br>
    <code>&lt;Directory /users/robroy/private&gt;<br>
    HideNoAccess<br>
    &lt;/Directory&gt;</code></p>
</blockquote>
<p>A trailing slash and wildcard (&quot;/*&quot;) can be appended to the directory, 
  specifying that the configuration block applies only to the contents (and sub-contents), 
  not to the actual directory itself. Such wildcard matches always take precedence 
  over non-wildcard &lt;Directory&gt; configuration blocks. &lt;Directory&gt; 
  blocks cannot be nested (they are automatically nested at run-time based on 
  their pathnames). Pathnames must always be absolute (except inside <a
href="reference.html#Anonymous">&lt;Anonymous&gt;</a>), and should not reference 
  symbolic links. Pathnames inside an <a
href="reference.html#Anonymous">&lt;Anonymous&gt;</a> block can be relative, indicating 
  that they are based on the anonymous root directory.</p>
<p><strong>[Notes for ProFTPD 1.1.3 and later only]</strong><br>
  Pathnames that begin with the special character '~' <strong>and do not specify 
  a username immediately after</strong> ~ are put into a special defered mode. 
  When in defered mode, the directory context is not hashed and sorted into the 
  configuration tree at boot time, but rather this hashing is defered until a 
  user authenticates, at which time the '~' character is replaced with the user's 
  home directory. This allows a global &lt;Directory&gt; block which applies to 
  all user's home directories, or sub-directories thereof.</p>
<blockquote> 
  <p>Example:<br>
    <code>&lt;Directory ~/anon-ftp&gt;<br>
    &lt;Limit WRITE&gt;<br>
    DenyAll<br>
    &lt;/Limit READ&gt;<br>
    &lt;/Directory&gt;</code></p>
</blockquote>
<hr>
<h2><a name="DirFakeGroup">DirFakeGroup</a></h2>
<p><strong>Syntax:</strong> DirFakeGroup <em>On|Off [groupname]</em><br>
  <strong>Default:</strong> <code>DirFakeGroup Off</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.1.5</p>
<p>DirFakeGroup and it's companion directive, <a
href="#DirFakeUser">DirFakeUser</a>, can be used to hide the true group and user 
  owners of files in a directory listing. If simply turned On, DirFakeGroup will 
  display all files as being owned by group 'ftp'. Optionally, the <em><strong>groupname</strong></em> 
  argument can be used to specify a specific group other than 'ftp'. <strong>Both 
  DirFakeGroup and </strong><a
href="#DirFakeUser"><strong>DirFakeUser</strong></a><strong> are completely cosmetic; 
  the groupname or username specified need not exists on the system, and neither 
  directive affects permissions, real ownership or access control in any way.</strong></p>
<hr>
<h2><a name="DirFakeMode">DirFakeMode</a></h2>
<p><strong>Syntax:</strong> DirFakeMode <em>octal-mode</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.1.6</p>
<p>The DirFakeMode directive configures a mode (or permissions) which will be 
  displayed for ALL files and directories in directory listings. For each subset 
  of permissions (user, group, other), the "execute" permission for directories 
  is added in listings if the "read" permission is specified by this directive. 
  For example:</p>
<p><code>DirFakeMode 0640</code></p>
<p>Will result in:</p>
<p><code> -rw-r----- ... arbitrary.file<br>
  drwxr-x--- ... arbitrary.directory </code></p>
<p>As with <a href="#DirFakeUser">DirFakeUser</a>, and <a href="#DirFakeGroup">DirFakeGroup</a>, 
  the "fake" permissions shown in directory listings are cosmetic only, they do 
  not affect real permissions or access control in any way.</p>
<hr>
<h2><a name="DirFakeUser">DirFakeUser</a></h2>
<p><strong>Syntax:</strong> DirFakeUser <em>On|Off [username]</em><br>
  <strong>Default:</strong> <code>DirFakeUser Off</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.1.5</p>
<p>See <a href="#DirFakeGroup">DirFakeGroup</a></p>
<hr>
<h2><a name="DisplayConnect">DisplayConnect</a></h2>
<p><strong>Syntax:</strong> DisplayConnect <em>filename</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre2 and later</p>
<p>The DisplayConnect directive configures an ASCII text filename which will be 
  displayed to the user when they initially connect but before they login. The 
  filename can be either relative or absolute. In the case of a relative filename, 
  the file is searched for starting in the home directory of the user the server 
  is running as. As this can lead confusion, absolute pathnames are suggested. 
  If the file cannot be found or accessed, no error occurs and nothing is logged 
  or displayed to the client.</p>
<p>DisplayConnect supports a subset of the &quot;magic cookies&quot; used by <a href="#DisplayLogin">DisplayLogin</a> 
  and <a
href="#DisplayFirstChdir">DisplayFirstChdir</a>: %T, %F, %R, %L and %u (see <a href="#DisplayFirstChdir">DisplayFirstChdir</a> 
  for details).</p>
<hr>
<h2><a name="DisplayFirstChdir">DisplayFirstChdir</a></h2>
<p><strong>Syntax:</strong> DisplayFirstChdir <em>filename</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Directory&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 0.99.0 and later, magic cookies only in 0.99.0pl10 
  and later</p>
<p>The DisplayFirstChdir directive configures an ASCII text filename which will 
  be displayed to the user the first time they change into a directory (via CWD) 
  per a given session. The file will also be displayed if proftpd detects that 
  it's last modification time has changed since the previoius CWD into a given 
  directory. If the filename is relative, it is looked for in the new directory 
  that the user has changed into. <u>Note that for anonymous ftp logins (see </u><a
href="reference.html#Anonymous"><u>&lt;Anonymous&gt;</u></a><u>), the file must 
  reside inside the chroot()ed file system space.</u> If the file cannot be found 
  or accessed, no error occurs and nothing is logged or displayed to the client.</p>
<p>DisplayFirstChdir, <a href="#DisplayConnect">DisplayConnect</a>, <a href="#DisplayLogin">DisplayLogin</a>, 
  <a href="#DisplayQuit">DisplayQuit</a>, support the following &quot;magic cookies&quot; 
  (<strong>only in 0.99.0pl10 and later</strong>), which are replaced with their 
  respective strings before being displayed to the user.</p>
<div align="left"> 
  <table border="0" cellpadding="3" cellspacing="0" width="50%">
    <tr> 
      <td align="right" width="20%"><strong>%T</strong></td>
      <td>&nbsp;</td>
      <td>Current Time</td>
    </tr>
    <tr> 
      <td align="right"><strong>%F</strong></td>
      <td>&nbsp;</td>
      <td>Available space on file system</td>
    </tr>
    <tr> 
      <td align="right"><strong>%C</strong></td>
      <td>&nbsp;</td>
      <td>Current working directory</td>
    </tr>
    <tr> 
      <td align="right"><strong>%R</strong></td>
      <td>&nbsp;</td>
      <td>Remote host name</td>
    </tr>
    <tr> 
      <td align="right"><strong>%L</strong></td>
      <td>&nbsp;</td>
      <td>Local host name</td>
    </tr>
    <tr> 
      <td align="right"><strong>%u</strong></td>
      <td>&nbsp;</td>
      <td>Username reported by ident protocol</td>
    </tr>
    <tr> 
      <td align="right"><strong>%U</strong></td>
      <td>&nbsp;</td>
      <td>Username originally used in login</td>
    </tr>
    <tr> 
      <td align="right"><strong>%M</strong></td>
      <td>&nbsp;</td>
      <td>Max number of connections</td>
    </tr>
    <tr> 
      <td align="right"><strong>%N</strong></td>
      <td>&nbsp;</td>
      <td>Current number of connections</td>
    </tr>
    <tr> 
      <td align="right"><strong>%E</strong></td>
      <td>&nbsp;</td>
      <td>Server admin's e-mail address</td>
    </tr>
    <!-- This doesn't work?  It appears in mod_core.c 
    <tr>
        <td align="right"><strong>%V</strong></td>
        <td>&nbsp;</td>
        <td>Name of virtual host (if any)</td>
    </tr>
--> 
  </table>
</div>
<p><strong>NOTE:</strong> not all of these may have a rational value, depending 
  on the context in which they're used (e.g., %u if ident lookups are off).</p>
<hr>
<h2><a name="DisplayGoAway">DisplayGoAway</a></h2>
<p><strong>Syntax:</strong> DisplayGoAway <em>filename</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre8 and later</p>
<p>The DisplayGoAway directive specifies an ASCII text filename which will be 
  displayed to the user if the class they're a member of has too many users logged
  in and their login request has been denied.</p>
<p>DisplayGoAway supports the same &quot;magic cookies&quot; as <a
href="#DisplayFirstChdir">DisplayFirstChdir</a>.</p>
<p><strong>See Also:</strong> <a href="#DisplayFirstChdir">DisplayFirstChdir</a></p>
<hr>
<h2><a name="DisplayLogin">DisplayLogin</a></h2>
<p><strong>Syntax:</strong> DisplayLogin <em>filename</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The DisplayLogin directive configures an ASCII text filename which will be 
  displayed to the user when they initially login. The filename can be either 
  relative or absolute. In the case of a relative filename, the file is searched 
  for in the initial directory a user is placed in immediately after login (home 
  directory for unix user logins, anonymous-root directory for <a
href="reference.html#Anonymous">anonymous</a> logins). <u>Note that for anonymous 
  logins, the file must reside inside the chroot()ed file system space.</u> If 
  the file cannot be found or accessed, no error occurs and nothing is logged 
  or displayed to the client.</p>
<p>DisplayLogin supports the same &quot;magic cookies&quot; as <a
href="#DisplayFirstChdir">DisplayFirstChdir</a>.</p>
<hr>
<h2><a name="DisplayQuit">DisplayQuit</a></h2>
<p><strong>Syntax:</strong> DisplayQuit <em>filename</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre8 and later</p>
<p>DisplayQuit configures an ASCII text filename which will be displayed to the 
  user when they quit. The filename can be either relative or absolute. In the 
  case of a relative filename, the file is searched for in current directory a 
  user is in when they logout -- for this reason, a absolute filename is usually 
  preferable.</p>
<p><strong>NOTE:</strong> for anonymous logins, the file must reside inside the 
  chroot()ed file system space. If the file cannot be found or accessed, no error 
  occurs and nothing is logged or displayed to the client.</p>
<p>DisplayQuit supports the &quot;magic cookies&quot; listed under <a href="#DisplayFirstChdir">DisplayFirstChdir</a>.</p>
<hr>
<h2><a name="DisplayReadme">DisplayReadme</a></h2>
<p><strong>Syntax:</strong> DisplayReadme <em>filename</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre8 and later<br>
  <strong>Module:</strong> mod_readme</p>
<p>The DisplayReadme directive notifies the user of the last change date of the 
  specified file. Only a single DisplayReadme directive is allowed per configuration 
  scope. 
<p><code>DisplayReadme README</code></p>
<p>Will result in:</p>
<p><code> Please read the file README it was last modified on Sun Oct 17 10:36:14 
  1999 - 0 days ago </code></p>
<p>Being displayed to the user on a cwd. 
<hr>
<h2><a name="ExtendedLog">ExtendedLog</a></h2>
<p><strong>Syntax:</strong> <em>filename [[command-classes] format-nickname]</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt; 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.1.6pl1 and later</p>
<p>The ExtendedLog directive allows customizable logfiles to be generated, either 
  globally or per <a href="#VirtualHost">VirtualHost</a>. The <strong><em>filename</em></strong> 
  argument must contain an absolute pathname to a logfile which will be appended 
  to when proftpd starts. Multiple logfiles (potentially with different command 
  classes and formats) can be created.</p>
<p>Optionally, the <strong><em>command-classes</em></strong> argument can be used 
  to control which types of commands are logged. If not command classes are specified, 
  proftpd logs <strong>all</strong> commands by default (passwords are hidden). 
  <strong><em>command-classes</em></strong> is a comma delimited (no whitespace!) 
  list of which commands to log. The following are valid classes:</p>
<ul>
  <li><strong>NONE</strong><br>
    No commands</li>
  <li><strong>AUTH</strong><br>
    Authentication commands (USER, PASS)</li>
  <li><strong>INFO</strong><br>
    Informational commands (PWD, SYST, etc)</li>
  <li><strong>DIRS</strong><br>
    Directory commands (LIST, CWD, MKD, etc)</li>
  <li><strong>READ</strong><br>
    File reading (RETR)</li>
  <li><strong>WRITE</strong><br>
    File/directory writing or creation</li>
  <li><strong>MISC</strong><br>
    Miscellaneous commands (SITE, etc)</li>
  <li><strong>ALL</strong><br>
    All commands (default)</li>
</ul>
<p>If a <strong><em>format-nickname</em></strong> argument is supplied, ExtendedLog 
  will use the predefined logformat (created by <a href="#LogFormat">LogFormat</a>). 
  Otherwise, the default format of &quot;%h %l %u %t \&quot;%r\&quot; %s %b&quot; 
  is used.</p>
<p>For example, to log all read and write operations to /var/log/ftp.log (using 
  the default format), you could:</p>
<p><code>ExtendedLog /var/log/ftp.log read,write</code></p>
<p><strong>See Also:</strong> <a href="#LogFormat">LogFormat</a>, <a href="#TransferLog">TransferLog</a></p>
<hr>
<h2><a name="Global">&lt;Global&gt;</a></h2>
<p><strong>Syntax:</strong> &lt;Global&gt;<br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;<br>
  <strong>Compatibility:</strong> 1.1.6 and later</p>
<p>The Global configuration block is used to create a set of configuration directives 
  which is applied universally to both the main server configuration and all <a href="#VirtualHost">VirtualHost</a> 
  configurations. Most, but not <strong>all</strong> other directives can be used 
  inside a Global block.</p>
<p>In addition, multiple &lt;Global&gt; blocks can be created. At runtime, all 
  Global blocks are merged together and finally into each server's configuration. 
  Global blocks are terminated by a matching &lt;/Global&gt; directive.</p>
<hr>
<h2><a name="Group">Group</a></h2>
<p><strong>Syntax:</strong> Group <em>groupid</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The Group directive configures which group the server daemon will normally 
  run at. See <a href="reference.html#User">User</a> for more details.</p>
<hr>
<h2><a name="GroupOwner">GroupOwner</a></h2>
<p><strong>Syntax:</strong> GroupOwner <em>groupid</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> &lt;Anonymous&gt;, &lt;Directory&gt;, .ftpaccess<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The GroupOwner directive configures which group all newly created directories 
  and files will be owned by, within the context that GroupOwner is applied to. 
  Note that GroupOwner cannot be used to override the host OS/file system user/group 
  paradigm. If the current user is not a member of the specified group, new files 
  and directories will not be able to be chown()ed to the GroupOwner group. If 
  this happens, file STOR (send file from client to server) and MKD (mkdir) operations 
  will succeed normally, however the new directory entries will be owned by the 
  current user's default group (a warning message is also logged) instead of by 
  the desired group.</p>
<hr>
<h2><a name="GroupPassword">GroupPassword</a></h2>
<p><strong>Syntax:</strong> GroupPassword <em>groupid hashed-password</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 0.99.0pl5 and later</p>
<p>The GroupPassword directive creates a special &quot;group&quot; password which 
  allows all users in the specified group to authenticate using a single password. 
  The group/password supplied is only effective inside the context to which GroupPassword 
  is applied. The <em><strong>hashed-password</strong></em> argument is a standard 
  cleartext password which has been passed through the standard unix crypt() library 
  function. <strong>Extreme care should be taken when using GroupPassword, as 
  serious security problems may arise if group membership is not carefully controlled.</strong></p>
<p><strong>See Also:</strong> <a href="#UserPassword">UserPassword</a></p>
<hr>
<h2><a name="HiddenStor">HiddenStor</a></h2>
<p><strong>Syntax:</strong> HiddenStor <em>on|off</em><br>
  <strong>Default:</strong> <code>HiddenStor off</code><br>
  <strong>Context:</strong> &lt;Directory&gt;, &lt;Anonymous&gt;, &lt;VirtualHost&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre5 and later</p>
<p>The HiddenStor directive enables two-step file uploads: files are uploaded 
  as &quot;<code>.in.<em>filename</em>.</code>&quot; and once the upload is complete, 
  renamed to just &quot;<code><em>filename</em></code>&quot;. This provides a 
  degree of atomicity and helps prevent 1) incomplete uploads and 2) files being 
  used while they're still in the progress of being uploaded. <em><strong>Note:</strong></em> 
  if the temporary file name is already in use (e.g., a server crash during upload), 
  it will prevent the file from being uploaded.</p>
<hr>
<h2><a name="HideGroup">HideGroup</a></h2>
<p><strong>Syntax:</strong> HideGroup <em>groupid</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> &lt;Directory&gt;, &lt;Anonymous&gt;<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The HideGroup directive configures a <a
href="reference.html#Directory">&lt;Directory&gt;</a> or &lt;<a
href="reference.html#Anonymous">Anonymous&gt;</a> block to hide all directory 
  entries owned by the specified group, unless the group is the <strong>primary 
  group</strong> of the currently logged-in, authenticated user . Normally, hidden 
  directories and files cannot be seen via LIST or NLST commands but <strong>can</strong> 
  be operated on via other FTP commands (CWD, DELE, RETR, etc). This behavior 
  can be modified via the <a
href="reference.html#IgnoreHidden">IgnoreHidden</a> directive.</p>
<p><strong>See Also:</strong> <a href="reference.html#HideUser">HideUser</a>, <a
href="reference.html#HideNoAccess">HideNoAccess</a>, <a
href="reference.html#IgnoreHidden">IgnoreHidden</a></p>
<hr>
<h2><a name="HideNoAccess">HideNoAccess</a></h2>
<p><strong>Syntax:</strong> HideNoAccess<br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> &lt;Directory&gt;,&lt;Anonymous&gt;<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The HideNoAccess directive configures a <a
href="reference.html#Directory">&lt;Directory&gt;</a> or <a
href="reference.html#Anonymous">&lt;Anonymous&gt;</a> block to hide all directory 
  entries in a directory listing (via the LIST or NLST FTP commands) to which 
  the current logged-in, authenticated user has no access to. Normal Unix-style 
  permissions always apply, so that although a user may not be able to see a directory 
  entry that has HideNoAccess applied, they will receive a normal &quot;Permission 
  denied&quot; error message when attempting to blindly manipulate the file system 
  object. The directory or file can be made completely invisible to all FTP commands 
  by applying <a href="reference.html#IgnoreHidden">IgnoreHidden</a> in conjunction 
  with HideNoAccess.</p>
<p><strong>See Also:</strong> <a href="reference.html#HideUser">HideUser</a>, <a
href="reference.html#HideGroup">HideGroup</a>, <a
href="reference.html#IgnoreHidden">IgnoreHidden</a></p>
<hr>
<h2><a name="HideUser">HideUser</a></h2>
<p><strong>Syntax:</strong> HideUser <em>userid</em><br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> &lt;Directory&gt;, &lt;Anonymous&gt;<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The HideUser directive configures a <a
href="reference.html#Directory">&lt;Directory&gt;</a> or &lt;<a
href="reference.html#Anonymous">Anonymous&gt;</a> block to hide all directory 
  entries owned by the specified user, unless the owning user is the currently 
  logged-in, authenticated user. Normally, hidden directories and files cannot 
  be seen via LIST or NLST commands but <strong>can</strong> be operated on via 
  other FTP commands (CWD, DELE, RETR, etc). This behavior can be modified via 
  the <a href="reference.html#IgnoreHidden">IgnoreHidden</a> directive.</p>
<p><strong>See Also:</strong> <a href="reference.html#HideGroup">HideGroup</a>, <a
href="reference.html#HideNoAccess">HideNoAccess</a>, <a
href="reference.html#IgnoreHidden">IgnoreHidden</a></p>
<hr>
<h2><a name="IdentLookups">IdentLookups</a></h2>
<p><strong>Syntax:</strong> IdentLookups <em>on|off</em><br>
  <strong>Default:</strong> <code>IdentLookups on</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.1.5 and later</p>
<p>Normally, when a client initially connects to proftpd, the ident protocol (RFC1413) 
  is used to attempt to identify the remote username. This can be controlled via 
  the IdentLookups directive.</p>
<hr>
<h2><a name="IgnoreHidden">IgnoreHidden</a></h2>
<p><strong>Syntax:</strong> IgnoreHidden <em>on|off</em><br>
  <strong>Default:</strong> <code>IgnoreHidden off</code><br>
  <strong>Context:</strong> &lt;Limit&gt;<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>Normally, files hidden via <a
href="reference.html#HideNoAccess">HideNoAccess</a>, <a
href="reference.html#HideUser">HideUser</a> or <a
href="reference.html#HideGroup">HideGroup</a> can be operated on by all FTP commands 
  (assuming Unix file permissions allow access), even though they do not appear 
  in directory listings. Additionally, even when normal file system permissions 
  disallow access, proftpd returns a &quot;Permission denied&quot; error to the 
  client, indicating that the requested object does exist, even if it cannot be 
  acted upon. IgnoreHidden configures a <a
href="reference.html#Limit">&lt;Limit&gt;</a> block to completely ignore any hidden 
  directory entries for the set of limited FTP commands. This has the effect of 
  returning an error similar to &quot;No such file or directory&quot; when the 
  client attempts to use the limited command upon a hidden directory or file.</p>
<hr>
<h2><a name="Limit">&lt;Limit&gt;</a></h2>
<p><strong>Syntax:</strong> &lt;Limit <em>command|command-group [command2 ..]</em>&gt;<br>
  <strong>Default:</strong> None<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Directory&gt;, 
  &lt;Anonymous&gt;, &lt;Global&gt;, .ftpaccess<br>
  <strong>Compatibility:</strong> 0.99.0 and later</p>
<p>The Limit configuration block is used to place access restrictions on one or 
  more FTP commands, within a given context. Limits flow downward, so that a Limit 
  configuration in the server config context applies to all <a href="reference.html#Directory">&lt;Directory&gt;</a> 
  and <a href="reference.html#Anonymous">&lt;Anonymous&gt;</a> blocks that also 
  reside in the configuration; until it is overridden by a &quot;lower&quot; &lt;Limit&gt; 
  block. Any number of <em><strong>command</strong></em> parameters can be specified, 
  against which the contents of the &lt;Limit&gt; block will be applied. <em><strong>command</strong></em> 
  can be any valid FTP command, but is generally one of the following:</p>
<ul>
  <li><strong>CWD</strong> (Change Working Directory)<br>
    Sent by client when changing directories. <u>Note that limits placed on this 
    command </u><strong><u>also</u></strong><u> apply to the </u><strong><u>CDUP</u></strong><u> 
    command (Change Directory UP).</u></li>
  <li><strong>MKD</strong> (MaKe Directory)<br>
    Sent by client to create a new directory.</li>
  <li><strong>RNFR</strong> (ReName FRom), <strong>RNTO</strong> (ReName TO)<br>
    Sent as a pair by client to rename a directory entry.</li>
  <li><strong>DELE</strong> (DELEte)<br>
    Sent by client to delete a file.</li>
  <li><strong>RMD</strong> (ReMove Directory)<br>
    Sent by client to remove a directory.</li>
  <li><strong>RETR</strong> (RETRieve)<br>
    Transfer a file from the server to the client.</li>
  <li><strong>STOR</strong> (STORe)<br>
    Transfer a file from the client to the server.</li>
</ul>
<p>In addtion, the following <em><strong>command-groups</strong></em> are accepted. 
  They have a lower precedence than real commands, meaning that a real command 
  limit will always be applied instead of the <em><strong>command-group</strong></em>.</p>
<ul>
  <li><strong>READ</strong><br>
    All FTP commands which deal with file reading (directory listing not included). 
    i.e. RETR, STAT, etc.</li>
  <li><strong>WRITE</strong><br>
    All FTP commands which deal with file or directory write/creation/deletion 
    (MKD and RMD included).</li>
  <li><strong>DIRS</strong><br>
    All FTP commands which deal with directory listing. i.e LIST and NLST.</li>
  <li><strong>ALL</strong><br>
    <em>ALL</em> FTP commands (identical to READ WRITE DIRS).</li>
</ul>
<p>Finally, a special command is allowed which can be used to control login access:</p>
<ul>
  <li><strong>LOGIN</strong><br>
    Connection or login to the server. Applying a &lt;Limit&gt; to this pseudo-command 
    can be used to allow or deny initial connection or login to the context. It 
    has no effect, and is ignored, when used in a context other than server config, 
    <a href="#VirtualHost">&lt;VirtualHost&gt;</a> or <a href="#Anonymous">&lt;Anonymous&gt;</a> 
    (i.e. using it in a <a href="#Directory">&lt;Directory&gt;</a> context is 
    meaningless).</li>
</ul>
<p>&lt;Limit&gt; command restrictions should not be confused with file/directory 
  access permission. While limits can be used to restrict a command on a certain 
  directory, they cannot be used to override the file permissions inherent to 
  the base operating/file system.</p>
<p><strong>See Also:</strong> <a href="reference.html#IgnoreHidden">IgnoreHidden</a></p>
<hr>
<h2><a name="LDAPDN">LDAPDN</a></h2>
<p><strong>Syntax:</strong> LDAPDN <em>"ldap-dn"</em><br>
  <strong>Default:</strong> <code>LDAPDN ""</code> (anonymous bind)<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre9 and later</p>
<p>LDAPDN specifies the Distinguished Name to bind as to the LDAP server for authentication. 
  This usually looks something like "cn=the-dn, dc=domain, dc=com" or "o=Your 
  Organization, c=US". If no LDAPDN configuration directive is present, anonymous 
  binds will be used.</p>
<hr>
<h2><a name="LDAPDNPass">LDAPDNPass</a></h2>
<p><strong>Syntax:</strong> LDAPDNPass <em>"ldap-dn-password"</em><br>
  <strong>Default:</strong> <code>LDAPDNPass ""</code> (no password)<br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre9 and later</p>
<p>LDAPDNPass allows you to specify the password to be used when binding as <a href="#LDAPDN">LDAPDN</a> 
  to the LDAP server for authentication. If no LDAPDNPass configuration directive 
  is present, no password will be used.</p>
<hr>
<h2><a name="LDAPServer">LDAPServer</a></h2>
<p><strong>Syntax:</strong> LDAPServer <em>"ldap-server-name"</em><br>
  <strong>Default:</strong> <code>LDAPServer "localhost"</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre9 and later</p>
<p>LDAPServer allows you to to specify the hostname of the LDAP server to use 
  in LDAP authentication. If no LDAPServer configuration directive is present, 
  the local host will be used for the LDAP server.</p>
<hr>
<h2><a name="LDAPNegativeCache">LDAPNegativeCache</a></h2>
<p><strong>Syntax:</strong> LDAPNegativeCache <em>on/off</em><br>
  <strong>Default:</strong> <code>LDAPNegativeCache off</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre9 and later</p>
<p>LDAPNegativeCache specifies whether or not to cache negative responses from 
  the LDAP server when using LDAP authentication. This option is useful if you 
  also use/are in transition from another authentication system. If there are 
  many users in your old authentication system that aren't in the LDAP database, 
  there will be a significant delay when a directory listing is performed as the 
  UIDs not in the LDAP database are repeatedly looked up in the LDAP database 
  in an attempt to present usernames instead of UIDs in directory listings. With 
  LDAPNegativeCache set to on, negative ("not found") responses from the LDAP 
  server will be cached and speed will improve on directory listings in situations 
  like this.</p>
<hr>
<h2><a name="LDAPPrefix">LDAPPrefix</a></h2>
<p><strong>Syntax:</strong> LDAPPrefix <em>"ldap-prefix"</em><br>
  <strong>Default:</strong> <code>LDAPPrefix ""</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre9 and later</p>
<p>LDAPPrefix allows you to specify the prefix to be used in LDAP authentication 
  queries. This usually looks something like "dc=domain, dc=com" or "o=Your Organization, 
  c=US". If no LDAPPrefix configuration directive is present, a default of no 
  prefix is used.</p>
<hr>
<h2><a name="LogFormat">LogFormat</a></h2>
<p><strong>Syntax:</strong> LogFormat <em>nickname &quot;format-string&quot;</em><br>
  <strong>Default:</strong> <code>LogFormat default &quot;%h %l %u %t \&quot;%r\&quot; 
  %s %b&quot;</code><br>
  <strong>Context:</strong> server config<br>
  <strong>Compatibility:</strong> 1.1.6pl1 and later</p>
<p>The LogFormat directive can be used to create a custom logging format for use 
  with the <a href="#ExtendedLog">ExtendedLog</a> directive. Once created, the 
  format can be referenced by the specified <strong><em>nickname</em></strong>.</p>
<p>The <strong><em>format-string</em></strong> argument can consist of any combination 
  of letters, numbers and symbols. The special character <strong>%</strong> is 
  used to start a meta-sequence (see below). To insert a literal % character, 
  use %%. The following meta sequences are available and are replaced as indicated 
  when logging.</p>
<div align="left"> 
  <table border="0" cellpadding="3" cellspacing="0" width="50%">
    <tr> 
      <td align="right" width="20%"><strong>%b</strong></td>
      <td>&nbsp;</td>
      <td>Bytes sent for request</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%f</strong></td>
      <td>&nbsp;</td>
      <td>Filename stored or retrieved</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%{FOOBAR}e</strong></td>
      <td>&nbsp;</td>
      <td>Contents of environment variable FOOBAR</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%h</strong></td>
      <td>&nbsp;</td>
      <td>Remote host name</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%a</strong></td>
      <td>&nbsp;</td>
      <td>Remote IP address</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%l</strong></td>
      <td>&nbsp;</td>
      <td>Remote username (from ident)</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%p</strong></td>
      <td>&nbsp;</td>
      <td>Local server port number</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%v</strong></td>
      <td>&nbsp;</td>
      <td>Local server name</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%P</strong></td>
      <td>&nbsp;</td>
      <td>Local server process id (pid)</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%r</strong></td>
      <td>&nbsp;</td>
      <td>Full command line received from client</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%t</strong></td>
      <td>&nbsp;</td>
      <td>Current local time</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%{format}t</strong></td>
      <td>&nbsp;</td>
      <td>Current local time formatted (strftime(3) format)</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%T</strong></td>
      <td>&nbsp;</td>
      <td>Time taken to transmit/receive file, in seconds 
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%s</strong></td>
      <td>&nbsp;</td>
      <td>Numeric FTP response code (status)</td>
    </tr>
    <tr> 
      <td align="right" width="20%"><strong>%u</strong></td>
      <td>&nbsp;</td>
      <td>Local authenticated userid</td>
    </tr>
  </table>
  <p><strong>See Also:</strong> <a href="#ExtendedLog">ExtendedLog</a>, <a href="#TransferLog">TransferLog</a></p>
  <hr>
  <h2><a name="LoginPasswordPrompt">LoginPasswordPrompt</a></h2>
  <p><strong>Syntax:</strong> LoginPasswordPrompt <em>on|off</em><br>
    <strong>Default:</strong> LoginPasswordPrompt on<br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 1.2.0pre1 and later</p>
  <p>If set to <code>off</code>, ProFTPd will skip the password request if the 
    login will be denied regardless of password, e.g., if a <code>&lt;Limit LOGIN&gt; 
    </code> directive forbids the connection.</p>
  <hr>
  <h2><a name="LsDefaultOptions">LsDefaultOptions</a></h2>
  <p><strong>Syntax:</strong> LsDefaultOptions <em>"options string"</em><br>
    <strong>Default:</strong> None<br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 1.1.6 and later</p>
  <p>Normally, FTP commands involving directory listings (NLST, LIST and STAT) 
    use the arguments (options) passed by the client to determine what files are 
    displayed and the format they are displayed in. Using the LsDefaultOptions 
    directive can alter the default behavior of such listings, but implying that 
    a certain option (or options) is always present. For example, to force all 
    directory listings to <strong>always</strong> display ".dotfiles", one might:</p>
  <p><code>LsDefaultOptions "-a"</code></p>
  <hr>
  <h2><a name="MaxClients">MaxClients</a></h2>
  <p><strong>Syntax:</strong> MaxClients <em>number|none message</em><br>
    <strong>Default:</strong> <code>MaxClients none</code><br>
    <strong>Context:</strong> server config, &lt;Anonymous&gt;, &lt;VirtualHost&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The MaxClients directive configures the maximum number of authenticated clients 
    which may be logged into a server or anonymous account. Once this limit is 
    reached, additional clients attempting to authenticate will be disconnected.</p>
  <p>The special value <em><strong>none</strong></em> may be supplied which removes 
    all maximum connection limits from the applicable configuration context. Additionally, 
    an optional <em><strong>message</strong></em> argument may be used which will 
    be displayed to a client attempting to exceed the maximum value; immediately 
    before disconnection. The <em><strong>message</strong></em> argument is parsed 
    for the magic string <strong>&quot;%m&quot;</strong>, which is replaced with 
    the configured maximum value. If <em><strong>message</strong></em> is not 
    supplied, a system-wide default message is used.</p>
  <p>Example:</p>
  <p><code>MaxClients 5 &quot;Sorry, the maximum number of allowed users are already 
    connected (%m)&quot;</code></p>
  <p>Results in:</p>
  <p><code>530 Sorry, the maximum number of allowed users are already connected 
    (5)</code></p>
  <hr>
  <h2><a name="MaxClientsPerHost">MaxClientsPerHost</a></h2>
  <p><strong>Syntax:</strong> MaxClientsPerHost <em>number|none message</em><br>
    <strong>Default:</strong> <code>MaxClientsPerHost none</code><br>
    <strong>Context:</strong> server config, &lt;Anonymous&gt;, &lt;VirtualHost&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 1.1.7 and later</p>
  <p>The MaxClientsPerHost directive configures the maximum number of clients 
    allowed to connect per host. The optional argument <strong><em>message</em></strong> 
    may be used which will be displayed to a client attempting to exceed the maximum 
    value. If <strong><em>message</em></strong> is not supplied, a system-wide 
    default message is used. 
  <p> 
  <p>Example:</p>
  <p><code>MaxClientsPerHost 1 &quot;Sorry, you may not connect more than one 
    time.&quot;</code></p>
  <p>Results in:</p>
  <p><code>530 Sorry, you may not connect more than one time.</code></p>
  <hr>
  <h2><a name="MaxInstances">MaxInstances</a></h2>
  <p><strong>Syntax:</strong> MaxInstances <em>number</em><br>
    <strong>Default:</strong> <code>MaxInstances none</code><br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 1.1.6pl1</p>
  <p>The MaxInstances directive configures the maximum number of child processes 
    that may be spawned by a parent proftpd process in <strong><em>standalone</em></strong> 
    mode. The directive has no effect when used on a server running in <strong><em>inetd</em></strong> 
    mode.</p>
  <p>Because each child proftpd process represents a single client connection, 
    this directive also controls the maximum number of simultaneous connections 
    allowed. Additional connections beyond the configured limit are syslog'd and 
    silently disconnected. The MaxInstances directive can be used to prevent undesireable 
    denial-of-service attacks (repeatedly connecting to the ftp port, causing 
    proftpd to fork-bomb). By default, no limit is placed on the number of child 
    processes that may run at one time.</p>
  <hr>
  <h2><a name="MaxLoginAttempts">MaxLoginAttempts</a></h2>
  <p><strong>Syntax:</strong> MaxLoginAttempts <em>number</em><br>
    <strong>Default:</strong> <code>MaxLoginAttempts 3</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The MaxLoginAttempts directive configures the maximum number of times a client 
    may attempt to authenticate to the server during a given connection. After 
    the number of attempts exceeds this value, the user is disconnected and an 
    appropriate message is logged via the syslog mechanism.</p>
  <hr>
  <h2><a name="MultilineRFC2228">MultilineRFC2228</a></h2>
  <p><strong>Syntax:</strong> MultilineRFC2228 <em>on|off</em><br>
    <strong>Default:</strong> <code>MultilineRFC2228 off</code><br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 1.2.0pre3 and later</p>
  <p> By default, proftpd sends multiline responses as per <a
href="ftp://ftp.ietf.org/rfc/rfc0959.txt">RFC 959</a>, i.e.: 
  <pre>
  200-First line
   More lines...
  200 Last line
</pre>
  <a href="ftp://ftp.ietf.org/rfc/rfc2228.txt">RFC 2228</a> specifies that "6xy" 
  response codes will be sent as follows: 
  <pre>
  600-First line
  600-More lines...
  600 Last line
</pre>
  Note that 2228 <em>ONLY</em> specifies this for response codes starting with 
  '6'. Enabling this directive causes <em>ALL</em> responses to be sent in this 
  format, which may be more compatible with certain web browsers and clients. 
  Also note that this is <em>NOT</em> the same as wu-ftpd's multiline responses, 
  which do not comply with any RFC. Using this method of multilines is more likely 
  to be compatible with all clients, although it isn't strictly RFC, and is thus 
  not enabled by default. 
  <p></p>
  <hr>
  <h2><a name="Order">Order</a></h2>
  <p><strong>Syntax:</strong> Order <em>allow,deny|deny,allow</em><br>
    <strong>Default:</strong> <code>Order allow,deny</code><br>
    <strong>Context:</strong> &lt;Limit&gt;<br>
    <strong>Compatibility:</strong> 0.99.0pl6 and later</p>
  <p>The Order directive configures the order in which <a
href="#Allow">Allow</a> and <a href="#Deny">Deny</a> directives are checked inside 
    of a <a href="#Limit">&lt;Limit&gt;</a> block. Because <a href="#Allow">Allow</a> 
    directives are permissive, and <a href="#Deny">Deny</a> directives restrictive, 
    the order in which they are examined can significantly alter the way security 
    functions.</p>
  <p>If the default setting of <em><strong>allow,deny</strong></em> is used, &quot;allowed&quot; 
    access permissions are checked first. If an <a href="#Allow">Allow</a> directive 
    explicitly allows access to the <a href="#Limit">&lt;Limit&gt;</a> context, 
    access is granted and any <a href="#Deny">Deny</a> directives are never checked. 
    If <a href="#Allow">Allow</a> did not explicitly permit access, <a href="#Deny">Deny</a> 
    directives are checked. If any <a href="#Deny">Deny</a> directive applies, 
    access is explicitly denied. Otherwise, access is granted.</p>
  <p>When <em><strong>deny,allow</strong></em> is used, &quot;deny&quot; access 
    restrictions are checked first. If any restriction applies, access is denied 
    immediately. If nothing is denied, <a href="#Allow">Allow</a> permissions 
    are checked. If an <a href="#Allow">Allow</a> explicitly permits access, access 
    to the entire context is permited; otherwise access is implicitly denied.</p>
  <p>For clarification, the following illustrates the steps used when checking 
    Allow/Deny access:</p>
  <blockquote> 
    <p><font size="4"><strong><u>Order allow,deny</u></strong></font></p>
  </blockquote>
  <ol>
    <li>Check Allow directives. If one or more apply, exit with result: <strong>ALLOW</strong></li>
    <li>Check Deny directives. If one or more apply, exit with result: <strong>DENY</strong></li>
    <li>Exit with default implicit <strong>ALLOW</strong></li>
  </ol>
  <blockquote> 
    <p><font size="4"><strong><u>Order deny,allow</u></strong></font></p>
  </blockquote>
  <ol>
    <li>Check Deny directives. If one or more apply, exit with result: <strong>DENY</strong></li>
    <li>Check Allow directives. If one or more apply, exit with result: <strong>ALLOW</strong></li>
    <li>Exit with default implicit: <strong>DENY</strong></li>
  </ol>
  <hr>
  <h2><a name="PAMConfig">PAMConfig</a></h2>
  <p><strong>Syntax:</strong> PAMConfig <em>service</em><br>
    <strong>Default:</strong> ftp<br>
    <strong>Context:</strong> server config,&lt;VirtualHost&gt;, &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 1.2.0pre3 and later</p>
  <p> This directive allows you to specify the PAM service name used in authentication. 
    PAM allows you to specify a service name to use when authenticating. This 
    allows you to configure different PAM service names to be used for different 
    virtual hosts. </p>
  <p>Example:</p>
  <p><code># Virtual host foobar authenticates differently than the rest. PAMConfig 
    foobar </code></p>
  <p>This assumes you have a PAM service named <code>foobar</code> configured 
    in your <code>/etc/pam.conf</code> file or <code>/etc/pam.d</code> directory. 
  </p>
  <hr>
  <h2><a name="PathAllowFilter">PathAllowFilter</a></h2>
  <p><strong>Syntax:</strong> PathAllowFilter <em>regular-expression</em><br>
    <strong>Default:</strong> None<br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 1.1.7 and later</p>
  <p>PathAllowFilter allows the configuration of a regular expression that <strong>must</strong> 
    be matched for all newly uploaded (stored) files. The regular expression is 
    applied against the entire pathname specified by the client, so care must 
    be taken when creating a proper regex. Paths that fail the regex match result 
    in a "Forbidden filename" error being returned to the client.</p>
  <p>If the <strong><i>regular-expression</i></strong> argument contains whitespace, 
    it must be enclosed in quotes.</p>
  <p>Example:</p>
  <p><code># Only allow filenames containing alphanumeric characters<br>
    PathAllowFilter &quot;.*/[a-zA-Z0-9]+$&quot;</code></p>
  <hr>
  <h2><a name="PathDenyFilter">PathDenyFilter</a></h2>
  <p><strong>Syntax:</strong> PathDenyFilter <em>regular-expression</em><br>
    <strong>Default:</strong> None<br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 1.1.7 and later</p>
  <p>Similar to <a href="#PathAllowFilter">PathAllowFilter</a>, PathDenyFilter 
    specifies a regular expression which must <strong>not</strong> match any uploaded 
    pathnames. If the regex does match, a "Forbidden filename" error is returned 
    to the client. This can be especially useful for forbidding .ftpaccess or 
    .htaccess files.</p>
  <p>Example:</p>
  <p><code># We don't want .ftpaccess or .htaccess files to be uploaded<br>
    PathDenyFilter &quot;(\.ftpaccess)|(\.htaccess)$&quot;</code></p>
  <hr>
  <h2><a name="PersistentPasswd">PersistentPasswd</a></h2>
  <p><strong>Syntax:</strong> PersistentPasswd <em>on|off</em><br>
    <strong>Default:</strong> Platform dependent<br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 1.1.5 and later</p>
  <p>The PersistentPasswd directive controls how proftpd handles authentication, 
    user/group lookups, and user/group to name mapping. If set to On, proftpd 
    will attempt to open the system-wide /etc/passwd, /etc/group (and /etc/shadow, 
    potentially) files itself, holding them open even during a chroot()ed login 
    (note that /etc/shadow is never held open, for security reasons). On some 
    platforms, you must turn this option on, as the libc functions are incapable 
    of accessing these databases from inside of a chroot(). At configure-time, 
    the configuration script will attempt to detect whether or not you need this 
    support, and make it the default. However, such &quot;guessing&quot; may fail, 
    and you will have to manually enable or disable the feature. If you cannot 
    see user or group names when performing a directory listing inside an anonymous 
    chrooted login, this indicates you must enable the directive. Use of the <a href="#AuthUserFile">AuthUserFile</a> 
    or <a
href="#AuthGroupFile">AuthGroupFile</a> directives will force partial support 
    for persistent user or group database files; regardless of PersistentPasswd's 
    setting.</p>
  <p><strong>Note: NIS or NIS+ users will most likely want to disable this feature, 
    regardless of proftpd's detected configuration defaults. Failure to disable 
    this will make your NIS/NIS+ maps not work!</strong></p>
  <hr>
  <h2><a name="Port">Port</a></h2>
  <p><strong>Syntax:</strong> Port <em>port-number</em><br>
    <strong>Default:</strong> <code>Port 21</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The Port directive configures the tcp port which proftpd will listen on while 
    running in <em><strong>standalone</strong></em> mode. It has no effect when 
    used upon a server running in <em><strong>inetd</strong></em> mode (see <a href="reference.html#ServerType">ServerType</a>). 
    The directive can be used in conjuction with <a
href="#VirtualHost">&lt;VirtualHost&gt;</a> in order to run a virtual server on 
    the same IP address as the master server, but listening on a different port.</p>
  <hr>
  <h2><a name="RateReadBPS">RateReadBPS</a></h2>
  <p><strong>Syntax:</strong> RateReadBPS <em>byte_per_sec-number</em><br>
    <strong>Default:</strong> <code>0</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Directory&gt;, &lt;Limits&gt;, &lt;Global&gt; <br>
    <strong>Compatibility:</strong> 1.2.0 and later</p>
  <p>RateReadBPS sets the allowed byte per second download bandwidth in the given 
    config context. Zero means no bandwidth limit. (See <a href="#RateReadFreeBytes">RateReadFreeBytes</a> 
    about limiting bandwidth only after some amount of downloaded bytes.) The 
    usual place for this directive is in <a
href="#VirtualHost">&lt;VirtualHost&gt;</a> or <a
href="#Directory">&lt;Directory&gt;</a> sections. </p>
  <hr>
  <h2><a name="RateReadFreeBytes">RateReadFreeBytes</a></h2>
  <p><strong>Syntax:</strong> RateReadFreeBytes <em>number of bytes</em><br>
    <strong>Default:</strong> <code>0</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Directory&gt;, &lt;Limits&gt;, &lt;Global&gt; <br>
    <strong>Compatibility:</strong> 1.2.0 and later</p>
  <p>RateReadFreeBytes is the amount of bytes to be transferred without any <a href="#RateReadBPS">bandwidth 
    limits</a>, so with that option you can give full bandwidth for small files 
    while limiting big ones. (See <a href="#RateReadhardBPS">RateReadHardBPS</a> 
    on further info about what happens after the free amount was transferred.) 
  </p>
  <h2><a name="RateReadHardBPS">RateReadHardBPS</a></h2>
  <p><strong>Syntax:</strong> RateReadHardBPS <em>on/off</em><br>
    <strong>Default:</strong> <code>off</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Directory&gt;, &lt;Limits&gt;, &lt;Global&gt; <br>
    <strong>Compatibility:</strong> 1.2.0 and later</p>
  <p>RateReadHardBPS forces the bandwidth to the given <a href="#RateReadBPS">RateReadBPS</a> 
    value after the <a href="#RateReadFreeBytes">RateReadFreeBytes</a> amount 
    of file was transfered. This means that if the user have huge bandwidth and 
    downloaded the "free" amount fast, HardBPS will stop the transfer until the 
    average goes down to the given limit. If the amount of FreeBytes is high and 
    the ReadBPS is low then the user may wait for extended periods of time until 
    the transfer continues. <tt>:-)</tt></p>
  <hr>
  <h2><a name="RateWriteBPS">RateWriteBPS</a></h2>
  <p><strong>Syntax:</strong> RateWriteBPS <em>byte_per_sec-number</em><br>
    <strong>Default:</strong> <code>0</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Directory&gt;, &lt;Limits&gt;, &lt;Global&gt; <br>
    <strong>Compatibility:</strong> 1.2.0 and later</p>
  <p>RateWriteBPS sets the allowed byte per second upload bandwidth in the given 
    config context. Zero means no bandwidth limit. (See <a href="#RateWriteFreeBytes">RateWriteFreeBytes</a> 
    about limiting bandwidth only after some amount of uploaded bytes.) The usual 
    place for this directive is in <a
href="#VirtualHost">&lt;VirtualHost&gt;</a> or <a
href="#Directory">&lt;Directory&gt;</a> sections. </p>
  <hr>
  <h2><a name="RateWriteFreeBytes">RateWriteFreeBytes</a></h2>
  <p><strong>Syntax:</strong> RateWriteFreeBytes <em>number of bytes</em><br>
    <strong>Default:</strong> <code>0</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Directory&gt;, &lt;Limits&gt;, &lt;Global&gt; <br>
    <strong>Compatibility:</strong> 1.2.0 and later</p>
  <p>RateWriteFreeBytes is the amount of bytes to be transferred without any <a href="#RateWriteBPS">bandwidth 
    limits</a>, so with that option you can give full bandwidth for small files 
    while limiting big ones. (See <a href="#RateWritehardBPS">RateWriteHardBPS</a> 
    on further info about what happens after the free amount was transferred.) 
  </p>
  <hr>
  <h2><a name="RateWriteHardBPS">RateWriteHardBPS</a></h2>
  <p><strong>Syntax:</strong> RateWriteHardBPS <em>on/off</em><br>
    <strong>Default:</strong> <code>off</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Directory&gt;, &lt;Limits&gt;, &lt;Global&gt; <br>
    <strong>Compatibility:</strong> 1.2.0 and later</p>
  <p>RateWriteHardBPS forces the bandwidth to the given <a href="#RateWriteBPS">RateWriteBPS</a> 
    value after the <a href="#RateWriteFreeBytes">RateWriteFreeBytes</a> amount 
    of file was transfered. This means that if the user have huge bandwidth and 
    uploaded the "free" amount fast, HardBPS will stop the transfer until the 
    average goes down to the given limit. If the amount of FreeBytes is high and 
    the WriteBPS is low then the user may wait for extended periods of time until 
    the transfer continues. <tt>:-)</tt></p>
  <hr>
  <h2><a name="RequireValidShell">RequireValidShell</a></h2>
  <p><strong>Syntax:</strong> RequireValidShell <em>on|off</em><br>
    <strong>Default:</strong> <code>RequireValidShell on</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The RequireValidShell directive configures the server, virtual host or anonymous 
    login to allow or deny logins which do not have a shell binary listed in /etc/shells. 
    By defualt, proftpd disallows logins if the user's default shell is not listed 
    in /etc/shells. If /etc/shells cannot be found, all default shells are assumed 
    to be valid.</p>
  <hr>
  <h2><a name="RootLogin">RootLogin</a></h2>
  <p><strong>Syntax:</strong> RootLoginl <em>on|off</em><br>
    <strong>Default:</strong> <code>RootLogin off</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 1.1.5 and later</p>
  <p>Normally, proftpd disallows root logins under any circumstance. If a client 
    attempts to login as root, using the correct password, a special security 
    message is sent to syslog. When the RootLogin directive is turned On, the 
    root user may authenticate just as any other user could (assuming no other 
    access control measures deny access); however the root login security message 
    is still sysloged. <strong>Obviously, </strong><strong><u>extreme</u></strong><strong> 
    care should be taken when using this directive.</strong></p>
  <hr>
  <h2><a name="ScoreboardPath">ScoreboardPath</a></h2>
  <p><strong>Syntax:</strong> ScoreboardPath <em>path</em><br>
    <strong>Default:</strong> <code>ScoreboardPath /var/run</code><br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 1.1.6 and later</p>
  <p>The ScoreboardPath directive sets the directory where proftpd run-time scoreboard 
    files (proftpd-*) are kept. These file(s) are necessary for <a href="#MaxClients">MaxClients</a> 
    to work properly, as well as other utilities (such as ftpwho and ftpcount). 
  </p>
  <hr>
  <h2><a name="ServerAdmin">ServerAdmin</a></h2>
  <p><strong>Syntax:</strong> ServerAdmin <em>&quot;admin-email-address&quot;</em><br>
    <strong>Default:</strong> <code>ServerAdmin root@[ServerName]</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;<br>
    <strong>Compatibility:</strong> 0.99.0pl10 and later</p>
  <p>The ServerAdmin directive sets the email address of the administrator for 
    the server or virtualhost. This address is displayed in magic cookie replacements 
    (see <a
href="#DisplayLogin">DisplayLogin</a> and <a
href="#DisplayFirstChdir">DisplayFirstChdir</a>).</p>
  <hr>
  <h2><a name="ServerIdent">ServerIdent</a></h2>
  <p><strong>Syntax:</strong> ServerIdent <em>On|Off [identification string]</em><br>
    <strong>Default:</strong> <code>ServerIdent ProFTPD [version] Server (server 
    name) [hostname]</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 1.2.0pre2 and later</p>
  <p>The ServerIdent directive sets the default message displayed when a new client 
    connects. Setting this to <em><strong>off</strong></em> displays "<code>[hostname] 
    FTP server ready.</code>" If set to <em><strong>on</strong></em>, the directive 
    can take an optional string argument, which will be displayed instead of the 
    default text. Sites desiring to give out minimal information will probably 
    want a setting like <code>ServerIdent "FTP Server ready."</code>, which won't 
    even reveal the hostname. 
  <hr>
  <h2><a name="ServerName">ServerName</a></h2>
  <p><strong>Syntax:</strong> ServerName <em>&quot;name&quot;</em><br>
    <strong>Default:</strong> <code>ServerName &quot;ProFTPD Server [version]&quot;</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The ServerName directive configures the string that will be displayed to 
    a user connecting to the server (or virtual server if the directive is located 
    in a <a href="#VirtualHost">&lt;VirtualHost&gt;</a> block). </p>
  <p><strong>See Also:</strong> <a href="#VirtualHost">&lt;VirtualHost&gt;</a></p>
  <hr>
  <h2><a name="ServerType">ServerType</a></h2>
  <p><strong>Syntax:</strong> ServerType <em>type-identifier</em><br>
    <strong>Default:</strong> <code>ServerType standalone</code><br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The ServerType directive configures the server daemon's operating mode. The 
    <em>type-identifier</em> can be one of two values:</p>
  <ul>
    <li><em><strong>inetd</strong></em><br>
      The daemon will expect to be run from the inetd &quot;super server.&quot; 
      New connections are passed from inetd to proftpd and serviced immediately.</li>
    <li><em><strong>standalone</strong></em><br>
      The daemon starts and begins listening to the configured <a
        href="reference.html#port">port</a> for incoming connections. New connections 
      result in spawned child processes dedicated to servicing all requests from 
      the newly connected client.</li>
  </ul>
  <hr>
  <h2><a name="ShowDotFiles">ShowDotFiles</a></h2>
  <p><strong>Syntax:</strong> ShowDotFiles <em>on|off</em><br>
    <strong>Default:</strong><code>ShowDotFiles Off</code><strong><br>
    Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, &lt;Global&gt;<strong><br>
    Compatibility:</strong> 0.99.0pl6 and later -- <strong>Deprecated</strong></p>
  <p>If set to <code>on</code>, files starting with a '.' will be displayed in 
    directory listings.  This directive has been deprecated in favor of 
    <a href="#LsDefaultOptions">LsDefaultOptions</a> -- e.g., <code>LsDefaultOptions
     "-a"</code> -- and may be removed in future versions.</p>
  <p><strong>See Also:</strong> <a href="#LsDefaultOptions">LsDefaultOptions</a></p>
  <hr>
  <h2><a name="ShowSymlinks">ShowSymlinks</a></h2>
  <p><strong>Syntax:</strong> ShowSymlinks <em>on|off</em><br>
    <strong>Default: (versions previous to 1.1.5) </strong><code>Off for anonymous 
    logins, On for normal logins</code><br>
    <strong>Default: (versions 1.1.5 and beyond) </strong><code>ShowSymlinks On</code><strong><br>
    Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, &lt;Global&gt;<strong><br>
    Compatibility:</strong> 0.99.0pl6 and later</p>
  <p>Symbolic links (if supported on the host OS and filesystem) can be either 
    shown in directory listings (including the target of the link) or can be &quot;hidden&quot; 
    (proftpd dereferences symlinks and reports the target's permissions and ownership). 
    The default behavior is to show all symbolic links when normal users are logged 
    in, and hide them for anonymous sessions. If a symbolic link cannot be dereferenced 
    for any reason (permissions, target does not exist, etc) and ShowSymlinks 
    is off, proftpd displays the link as a directory entry of type 'l' (link) 
    with the ownership and permissions of the actual link.</p>
  <p>Under ProFTPD versions 1.1.5 and higher, the default behavior in regard to 
    ShowSymlinks has been changed so that symbolic links are always displayed 
    as such (in all cases), unless ShowSymlinks off is explicitly set.</p>
  <hr>
  <h2><a name="SocketBindTight">SocketBindTight</a></h2>
  <p><strong>Syntax:</strong> SocketBindTight <em>on|off</em><br>
    <strong>Default:</strong> <code>SocketBindTight off</code><br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 0.99.0pl6 and later</p>
  <p>The SocketBindTight directive controls how proftpd creates and binds it's 
    initial tcp listen sockets in <em><strong>standalone</strong></em> mode (see 
    <a href="#ServerType">ServerType</a>). The directive has no effect upon servers 
    running in <em><strong>inetd</strong></em> mode, because listen sockets are 
    not needed or created. When SocketBindTight is set to <em><strong>off</strong></em> 
    (the default), a single listening socket is created for each port that the 
    server must listen on, regardless of the number of IP addresses being used 
    by <a href="#VirtualHost">&lt;VirtualHost&gt;</a> configurations. This has 
    the benefit of typically requiring a relatively small number of file descriptors 
    for the master daemon process, even if a large number of virtual servers are 
    configured. If SocketBindTight is set to <em><strong>on</strong></em>, a listen 
    socket is created and bound to a specific IP address for the master server 
    and all configured virtual servers. This allows for situations where an administrator 
    may wish to have a particular port be used by both proftpd (on one IP address) 
    and another daemon (on a different IP address). The drawback is that considerably 
    more file descriptors will be required if a large number of virtual servers 
    must be supported.</p>
  <p>Example: Two servers have been configured (one master and one virtual), with 
    the IP addresses 10.0.0.1 and 10.0.0.2, respectively. The 10.0.0.1 server 
    runs on port 21, while 10.0.0.2 runs on port 2001.</p>
  <p><code>SocketBindTight off #default<br>
    # proftpd creates two sockets, both bound to ALL available addresses.<br>
    # one socket listens on port 21, the other on 2001. Because each socket is<br>
    # bound to all available addresses, no other daemon or user process will be<br>
    # allowed to bind to ports 21 or 2001.<br>
    ...<br>
    SocketBindTight on<br>
    # proftpd creates two sockets again, however one is bound to 10.0.0.1, port 
    21<br>
    # and the other to 10.0.0.2, port 2001. Because these sockets are &quot;tightly&quot;<br>
    # bound to IP addresses, port 21 can be reused on any address OTHER than<br>
    # 10.0.0.1, and visa-versa with 10.0.0.2, port 2001.</code></p>
  <p>One side-effect of setting SocketBindTight to <em><strong>on</strong></em> 
    is that connections to non-bound addresses will result in a &quot;connection 
    refused&quot; message rather than the typical &quot;500 Sorry, no server available 
    to handle request on xxx.xxx.xxx.xxx.&quot;, due to the fact that no listen 
    socket has been bound to the particular address/port pair. This may or may 
    not be aesthetically desireable, depending on your circumstances.</p>
  <hr>
  <h2><a name="SyslogFacility"><strong>SyslogFacility</strong></a></h2>
  <p><strong>Syntax:</strong> SyslogFacility <em>facility-level</em><br>
    <strong>Default:</strong> None<br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 1.1.6 and later</p>
  <p>Proftpd logs it's activity via the Unix syslog mechanism, which allows for 
    several different general classifications of logging messages, known as "facilities." 
    Normally, all authentication related messages are logged with the AUTHPRIV 
    (or AUTH) facility [intended to be secure, and never seen by unwanted eyes], 
    while normal operational messages are logged with the DAEMON facility. The 
    SyslogFacility directive allows ALL logging messages to be directed to a different 
    facility than the default. When this directive is used, ALL logging is done 
    with the specificed facility, both authentication (secure) and otherwise.</p>
  <p>The <strong><em>facility-level</em></strong> argument must be one of the 
    following: <strong>AUTH</strong> (or <strong>AUTHPRIV</strong>)<strong>, CRON, 
    DAEMON, KERN, LPR, MAIL, NEWS, USER, UUCP, LOCAL0, LOCAL1, LOCAL2, LOCAL3, 
    LOCAL4, LOCAL5, LOCAL6 or LOCAL7.</strong></p>
  <p><strong>See Also:</strong> <a href="#SystemLog">SystemLog</a></p>
  <hr>
  <h2><a name="SystemLog"><strong>SystemLog</strong></a></h2>
  <p><strong>Syntax:</strong> SystemLog <em>filename|NONE</em><br>
    <strong>Default:</strong> None<br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 1.1.6pl1 and later</p>
  <p>The SystemLog directive disables proftpd's use of the syslog mechanism and 
    instead redirects all logging output to the specified <strong><em>filename</em></strong>. 
    The <strong><em>filename</em></strong> argument should contain an absolute 
    path. Use of this directive overrides any facility set by the <a href="SyslogFacility">SyslogFacility</a> 
    directive.</p>
  <p>Additionally, the special keyword <strong><em>NONE</em></strong> can be used 
    which disables all syslog style logging for the entire configuration.</p>
  <hr>
  <h2><a name="tcpBackLog"><strong>tcpBackLog</strong></a></h2>
  <p><strong>Syntax:</strong> tcpBackLog <em>backlog-size</em><br>
    <strong>Default:</strong> <code>tcpBackLog 5</code><br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The tcpBackLog directive controls the tcp &quot;backlog queue&quot; when 
    listening for connections in <em><strong>standalone</strong></em> mode (see 
    <a href="reference.html#ServerType">ServerType</a>). It has no affect upon 
    servers in <em><strong>inetd</strong></em> mode. When a tcp connection is 
    established by the tcp/ip stack inside the kernel, there is a short period 
    of time between the actual establishment of the connection and the acceptance 
    of the connection by a user-space program. The duration of this latency period 
    is widely variable, and can depend upon several factors (hardware, system 
    load, etc). During this period tcp connections cannot be accepted, as the 
    port that was previouisly &quot;listening&quot; has become filled with the 
    new connection. Under heavy connection load this can result in occasional 
    (or even frequent!) &quot;connection refused&quot; messages returned to the 
    incoming client, even when there is a service available to handle requests. 
    To eliminate this problem, most modern tcp/ip stacks implement a &quot;backlog 
    queue&quot; which is simply a pre-allocation of resources necessary to handle 
    <em><strong>backlog-size</strong></em> connections during the latency period. 
    The larger the backlog queue, the more connections can be established in a 
    very short time period. The trade-off, of course, is kernel memory and/or 
    other kernel resources.</p>
  <p>Generally it is not necessary to use a tcpBackLog directive, unless you intend 
    to service a large number of virtual hosts (see <a href="reference.html#VirtualHost">&lt;VirtualHost&gt;</a>), 
    or have a consistantly heavy system load. If you begin to notice or hear of 
    &quot;connection refused&quot; messages from remote clients, try setting a 
    slightly higher value to this directive.</p>
  <hr>
  <h2><a name="tcpNoDelay"><strong>tcpNoDelay</strong></a></h2>
  <p><strong>Syntax:</strong> tcpNoDelay <em>on|off</em><br>
    <strong>Default:</strong> <code>tcpNoDelay on</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 1.2.0pre3a and later</p>
  <p>The tcpNoDelay directive controls the use of the TCP_NODELAY socket option 
    (which disables the Nagle algorithm). ProFTPd uses TCP_NODELAY by default, 
    which usually is a benefit but this can ocassionally lead to problems with 
    some clients, so tcpNoDelay is provided as a way to disable this option. You 
    will not normally need to use this directive but if you have clients reporting 
    unusually slow connections, try setting this to <em><strong>off</strong></em>. 
  </p>
  <hr>
  <h2><a name="tcpReceiveWindow">tcpReceiveWindow</a></h2>
  <p><strong>Syntax:</strong> tcpReceiveWindow <em>window-size</em><br>
    <strong>Default:</strong> <code>tcpReceiveWindow 8192</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The tcpReceiveWindow directive configures the size (in octets) of all data 
    connections' tcp receive windows. It is only used when receiving a file from 
    a client over the data connection. Typically, a given tcp/ip implementation 
    will use a relatively small receive window size (the number of octets that 
    can be received at the tcp layer before a &quot;turnaround&quot; acknowledgement 
    is required). When transfering a large amount of data over fast digital transmission 
    lines which have a relatively high latency, a small receive window can dramatically 
    affect perceived throughput because of the necessity to completely stop the 
    transfer occasionally in order to wait for the remote endpoint to receive 
    the acknowledgement and continue transmission. For example, on a T1 line (assuming 
    full 1.544Mbps endpoint-to-endpoint throughput) with 100 ms latency, a 4k 
    receive buffer will very dramatically reduce the perceived throughput. The 
    default value of 8192 octets (8k) should be reasonable in common network configurations.</p>
  <p>Additionally, proftpd allocates its internal buffers to match the receive/send 
    window sizes; in order to maximize the reception/transmission performance 
    (reducing the number of times data must be transfered from proftpd to the 
    kernel tcp/ip stack). The tradeoff, of course, is memory; both kernel- and 
    user-space. If running proftpd on a memory tight host (and on a low-bandwidth 
    connection), it might be advisable to decrease both the tcpReceiveWindow and 
    <a href="reference.html#tcpSendWindow">tcpSendWindow</a> sizes.</p>
  <hr>
  <h2><a name="tcpSendWindow">tcpSendWindow</a></h2>
  <p><strong>Syntax:</strong> tcpSendWindow <em>window-size</em><br>
    <strong>Default:</strong> <code>tcpSendWindow 8192</code><br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The tcpSendWindow directive configures the size (in octets) of all data connections' 
    tcp send windows. It is only used when sending a file from the server to a 
    client on the data connection. For a detailed description of receive/send 
    window sizes see <a href="reference.html#tcpReceiveWindow">tcpReceiveWindow</a>.</p>
  <hr>
  <h2><a name="TimeoutIdle">TimeoutIdle</a></h2>
  <p><strong>Syntax:</strong> TimeoutIdle <em>seconds</em><br>
    <strong>Default:</strong> <code>TimeoutIdle 600</code><br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The TimeoutIdle directive configures the maximum number of seconds that proftpd 
    will allow clients to stay connected without receiving any data on either 
    the control or data connection. If data is received on either connection, 
    the idle timer is reset. Setting TimeoutIdle to 0 disables the idle timer 
    completely (clients can stay connected for ever, without sending data). This 
    is generally a bad idea as a &quot;hung&quot; tcp connection which is never 
    properly disconnected (the remote network may have become disconnected from 
    the Internet, etc) will cause a child server to never exit (at least not for 
    a considerable period of time) until manually killed</p>
  <p><strong>See Also:</strong> <a href="reference.html#TimeoutLogin">TimeoutLogin</a>, <a href="reference.html#TimeoutNoTransfer">TimeoutNoTransfer</a></p>
  <hr>
  <h2><a name="TimeoutLogin">TimeoutLogin</a></h2>
  <p><strong>Syntax:</strong> TimeoutLogin <em>seconds</em><br>
    <strong>Default:</strong> <code>TimeoutLogin 300</code><br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The TimeoutLogin directive configures the maximum number of seconds a client 
    is allowed to spend authenticating. The login timer is not reset when a client 
    transmits data, and is only removed once a client has transmitted an acceptable 
    USER/PASS command combination.</p>
  <p><strong>See Also:</strong> <a href="reference.html#TimeoutIdle">TimeoutIdle</a>, <a href="reference.html#TimeoutNoTransfer">TimeoutNoTransfer</a></p>
  <hr>
  <h2><a name="TimeoutNoTransfer">TimeoutNoTransfer</a></h2>
  <p><strong>Syntax:</strong> TimeoutNoTransfer <em>seconds</em><br>
    <strong>Default:</strong> <code>TimeoutNoTransfer 600</code><br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The TimeoutNoTransfer directive configures the maximum number of seconds 
    a client is allowed to spend connected, after authentication, without issuing 
    a command which results in creating an active or passive data connection (i.e. 
    sending/receiving a file, or receiving a directory listing).</p>
  <p><strong>See Also:</strong> <a href="reference.html#TimeoutIdle">TimeoutIdle</a>, <a href="reference.html#TimeoutLogin">TimeoutLogin</a></p>
  <hr>
  <h2><a name="TimeoutStalled">TimeoutStalled</a></h2>
  <p><strong>Syntax:</strong> TimeoutStalled <em>seconds</em><br>
    <strong>Default:</strong> <code>TimeoutStalled 0</code><br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 1.1.6 and later</p>
  <p>The TimeoutStalled directive sets the maximum number of seconds a data connection 
    between the proftpd server and an FTP client can exist but have no actual 
    data transferred (i.e. &quot;stalled&quot;). If the <strong><em>seconds</em></strong> 
    argument is set to <strong>0</strong>, data transfers are allowed to stall 
    indefinitely (the default).</p>
  <hr>
  <h2><a name="TransferLog">TransferLog</a></h2>
  <p><strong>Syntax:</strong> TransferLog <em>filename|NONE</em><br>
    <strong>Default:</strong> <code>TransferLog /var/log/xferlog</code><br>
    <strong>Context:</strong> server config, &lt;Anonymous&gt;, &lt;VirtualHost&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatiblity:</strong> 1.1.4 and later</p>
  <p>The TransferLog directive configures the full path to the &quot;wu-ftpd style&quot; 
    file transfer log. Seperate log files can be created for each <a href="#Anonymous">Anonymous</a> 
    and/or <a href="#VirtualHost">VirtualHost</a>.</p>
  <p>Additionally, the special keyword <strong><em>NONE</em></strong> can be used, 
    which disables wu-ftpd style transfer logging for the context in which the 
    directive is used (<em>only applicable to version 1.1.7 and later</em>).</p>
  <p><strong>See Also:</strong> <a href="#ExtendedLog">ExtendedLog, </a><a href="#LogFormat">LogFormat</a></p>
  <hr>
  <h2><a name="Umask">Umask</a></h2>
  <p><strong>Syntax:</strong> Umask <em>file octal-mask</em> [<em>directory octal-mask]</em><br>
    <strong>Default:</strong> None<br>
    <strong>Context:</strong> server config, &lt;Anonymous&gt;, &lt;VirtualHost&gt;, 
    &lt;Directory&gt;, &lt;Global&gt;, .ftpaccess<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>Umask sets the mask applied to newly created file and directory permissions 
    within a given context. By default, the Umask in the server configuration, 
    <a href="#VirtualHost">&lt;VirtualHost&gt;</a> or <a href="#Anonymous">&lt;Anonymous&gt;</a> 
    block is used, unless overridden by a &quot;per-directory&quot; Umask setting. 
    Any arguments supplied must be an octal number, in the format 0xxx. An optional 
    second argument can specify a Umask to be used when creating directories. 
    If a second argument isn't specified, directories are created using the default 
    Umask in the first argument. For more information on umasks, consult your 
    operating system documentation/man pages.</p>
  <hr>
  <h2><a name="UseFtpUsers">UseFtpUsers</a></h2>
  <p><strong>Syntax:</strong> UseFtpUsers <em>on|off</em><br>
    <strong>Default:</strong> <code>UseFtpUsers on</code><br>
    <strong>Context:</strong> server config, &lt;Anonymous&gt;, &lt;VirtualHost&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>Legacy FTP servers generally check a special authorization file (typically 
    /etc/ftpusers) when a client attempts to authenticate. If the user's name 
    is found in this file, FTP access is denied. For compatibility sake, proftpd 
    defaults to checking this file during authentication. This behavior can be 
    supressed using the UseFtpUsers configuration directive.</p>
  <hr>
  <h2><a name="UseReverseDNS">UseReverseDNS</a></h2>
  <p><strong>Syntax:</strong> UseReverseDNS <em>on|off</em><br>
    <strong>Default:</strong> <code>UseReverseDNS on</code><br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 1.1.7 and later</p>
  <p>Normally, incoming active mode data connections and outgoing passive mode 
    data connections have a reverse DNS lookup performed on the remote host's 
    IP address. In a chroot environment (such as <a href="#Anonymous">&lt;Anonymous&gt;</a> 
    or <a href="#DefaultRoot">DefaultRoot</a>), the /etc/hosts file cannot be 
    checked and the only possible resolution is via DNS. If for some reason, DNS 
    is not available or improperly configured this can result in proftpd blocking 
    (&quot;stalling&quot;) until the libc resolver code times out. Disabling this 
    directive prevents proftpd from attempting to reverse-lookup data connection 
    IP addresses. 
  <p> 
  <hr>
  <h2><a name="User">User</a></h2>
  <p><strong>Syntax:</strong> User <em>userid</em><br>
    <strong>Default:</strong> None<br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The User directive configures which user the proftpd daemon will <strong>normally</strong> 
    run as. By default, proftpd runs as root which is considered undesireable 
    in all but the most trustful network configurations. The User directive used 
    in conjuction with the <a href="reference.html#Group">Group</a> directive 
    instructs the daemon to switch to the specified user and group as quickly 
    as possible after startup. On some unix variants, the daemon will occasionally 
    switch back to root in order to accomplish a task which requires super-user 
    access. Once the task is completed, root privileges are relinquished and the 
    server continues to run as the specified user and group. When applied to a 
    <a href="reference.html#VirtualServer">&lt;VirtualServer&gt;</a> block, proftpd 
    will run as the specified user/group on connections destined for the virtual 
    server's address or port. If either User or <a href="reference.html#Group">Group</a> 
    is applied to an <a href="reference.html#Anonymous">&lt;Anonymous&gt;</a> 
    block, proftpd will establish an anonymous login when a user attempts to login 
    with the specified userid, as well as permanently switching to the corresponding 
    uid/gid (matching the User/Group parameters found in the anonymous block) 
    after login.</p>
  <p><u>Note: When an authorized unix user is authenticated and logs in, all former 
    privileges are released, the daemon switches permanently to the logged in 
    user's uid/gid, and is never again capable of switching back to root or any 
    other user/group.</u></p>

  <hr>

<h2><a name="UserDirRoot">UserDirRoot</a></h2>

<p><strong>Syntax:</strong> UserDirRoot <em>on|off</em><br>
  <strong>Default:</strong> off<br>
  <strong>Context:</strong> &lt;Anonymous&gt;<br>
  <strong>Compatibility:</strong> 1.2.0pre2 and later</p>

<p>When set to true, the chroot base directory becomes a subdirectory of the 
  anonymous ftp directory, based on the username of the current user.  For 
  example, assuming user "foo" is aliased to "ftp", logging in as "foo" causes
  proftpd to run as <em>real</em> user ftp, but to chroot into <code>~ftp/foo</code>
  instead of just <code>~ftp</code>.
</p>

<hr>

  <h2><a name="UserAlias">UserAlias</a></h2>
  <p><strong>Syntax:</strong> UserAlias <em>login-user userid</em><br>
    <strong>Default:</strong> None<br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The UserAlias directive creates a mapping from a login name transmitted by 
    a client (<em><strong>login-user</strong></em>) to a real system userid (<em><strong>userid</strong></em>). 
    If the user logs in as the alias, authentication is performed as though they 
    were actually logging in as the real user. This directive is often used inside 
    an <a href="reference.html#Anonymous">&lt;Anonymous&gt;</a> block in order 
    to allow multiple login names to activate an anonymous login. <u>Note: If 
    the </u><em><strong><u>login-user</u></strong></em><u> parameter is the same 
    as a real system userid, the real userid will no longer be recognized by proftpd.</u></p>
  <hr>
  <h2><a name="UserPassword">UserPassword</a></h2>
  <p><strong>Syntax:</strong> UserPassword <em>userid hashed-password</em><br>
    <strong>Default:</strong> None<br>
    <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
    &lt;Global&gt;<br>
    <strong>Compatibility:</strong> 0.99.0pl5 and later</p>
  <p>The UserPassword directive creates a password for a particular user which 
    overrides the user's normal password in /etc/passwd (or /etc/shadow). The 
    override is only effective inside the context to which UserPassword is applied. 
    The <em><strong>hashed-password</strong></em> argument is a cleartext string 
    which has been passed through the standard unix crypt() function. <strong>Do 
    NOT use a cleartext password.</strong> This can be useful when combined with 
    UserAlias to provide multiple logins to an Anonymous FTP site.</p>
  <p><strong>See Also:</strong> <a href="#GroupPassword">GroupPassword</a></p>
  <hr>
  <h2><a name="VirtualHost">&lt;VirtualHost&gt;</a></h2>
  <p><strong>Syntax:</strong> &lt;VirtualHost <em>address</em>&gt;<br>
    <strong>Default:</strong> None<br>
    <strong>Context:</strong> server config<br>
    <strong>Compatibility:</strong> 0.99.0 and later</p>
  <p>The VirtualHost configuration block is used to create an independent set 
    of configuration directives that apply to a particular hostname or IP address. 
    It is often used in conjuction with system level IP aliasing or dummy network 
    interfaces in order to establish one or more &quot;virtual&quot; servers which 
    all run on the same physical machine. The block is terminated with a &lt;/VirtualHost&gt; 
    directive. By utilizing the <a
href="reference.html#Port">Port</a> directive inside a VirtualHost block, it is 
    possible to create a virtual server which uses the same address as the master 
    server, but listens on a seperate tcp port (incompatible with <a
href="reference.html#ServerType">ServerType</a> <em><strong>inetd</strong></em>).</p>
  <p>When proftpd starts, virtual server connections are handled in one of two 
    ways, depending on the <a
href="reference.html#ServerType">ServerType</a> setting:</p>
  <ul>
    <li><em><strong>inetd</strong></em><br>
      The daemon examines the destination address and port of the incoming connection 
      handed off from inetd. If the connection matches one of the configured virtual 
      hosts, the connection is serviced based on the appropriate configuration. 
      If no virtual host matches, and the main server does not match, the client 
      is informed that no server is available to service their requests and disconnected.</li>
    <li><em><strong>standalone</strong></em><br>
      After parsing the configuration file, the daemon begins listening for connections 
      on all configured ports, spawning child processes as necessary to handle 
      connections for either the main server or any virtual servers.</li>
  </ul>
  <p>Because of the method that the daemon uses to listen for connections when 
    in <em><strong>standalone</strong></em> mode, it is possible to support an 
    exceedingly large number of virtual servers, potentially exceeding the number 
    of per-process file descriptors. This is due to the fact that a single file 
    descriptor is used to listen to each configured port, regardless of the number 
    of addresses being monitored. <u>Note that it may be necessary to increase 
    the </u><a
href="reference.html#tcpBackLog"><u>tcpBackLog</u></a><u> value on heavily loaded 
    servers in order to avoid kernel rejected client connections (&quot;Connection 
    refused&quot;).</u></p>
</div>
<hr>
<h2><a name="WtmpLog">WtmpLog</a></h2>
<p><strong>Syntax:</strong> WtmpLog <em>on|off|NONE</em><br>
  <strong>Default:</strong> <code>WtmpLog on</code><br>
  <strong>Context:</strong> server config, &lt;VirtualHost&gt;, &lt;Anonymous&gt;, 
  &lt;Global&gt;<br>
  <strong>Compatibility:</strong> 1.1.7 and later</p>
<p>The WtmpLog directive controls proftpd's logging of ftp connections to the 
  host system's wtmp file (used by such commands as `last'). By default, all connections 
  are logged via wtmp.</p>
</a> 
</body>